Skip to content

Security: zurrll/permsift

Security

docs/security.md

安全边界与限制

Permsift v0.5 是面向可信或审核过的项目的权限实验工具。它依赖 macOS 和固定版本 Sandbox Runtime 执行隔离,不是经独立审计的恶意代码分析系统。

固定策略

  • 文件读取:拒绝 /Users、当前用户家目录、原项目和实验管理目录。旧模式允许本轮整个工作区;explicit 模式只允许声明的项目目录/文件,以及固定的工作区根目录访问。缓存和临时目录读取保持开放。若 Node 安装在家目录内,则允许对应安装树。系统路径及后端元数据读取仍较宽。
  • 文件写入:可变授权只能落在本轮目录的批准范围内。原项目、配置、limits 和报告位置固定禁止写入。
  • 后端的 /tmp/claude 和 /private/tmp/claude 默认写例外被显式禁止。设备和标准输出等固定写权限仍存在,完整生效设置保存在 evidence 中。
  • 网络:任务命令的 allowedDomains 为空;可选 npm 安装阶段使用受独立 limits 约束的精确域名集合。关闭本地绑定、Unix socket 放行、Apple Events 和弱隔离选项。SRT 为认证过滤代理保留本地通道;直接 TCP 仍被拒绝。
  • 环境:只向任务传递定义好的 PATH、临时 HOME、缓存路径、语言和 CI 设置;不继承宿主 token、NODE_OPTIONS、BASH_ENV 等。SRT 命令构造期间也移除会被其重新拼入命令的宿主 Java/Git/代理及 CLAUDE 临时目录设置。任务在沙箱内重新设置 TMPDIR 为本轮独立 @tmp。

limits 中的 allowed_write_roots、allowed_read_roots 和 allowed_network_domains 分别是可变写目录、项目读取和安装域名授权的最高范围,不是对整个操作系统全部能力的表达。工具不会声称后端固定基础权限已被最小化。

被测任务与可信执行器

实际命令在临时副本运行。配置、冻结输入、验证器、证据和最终报告由宿主执行器管理,不作为任务可写资源暴露。探针使用假秘密、随机标记文件和临时本地 TCP 服务。

宿主断言只使用内置解析逻辑,不执行项目提供的验证脚本。文件读取拒绝符号链接和特殊文件,并限制大小。输入快照拒绝外部符号链接,不复用原项目的可写硬链接。

测试报告由任务产生,所以不能防止恶意项目谎报“测试通过”。任务也应避免主动攻击验证器、故意耗尽宿主资源或绕过进程组管理。对于这些行为,没有作出隔离完整性承诺。

自动候选仍受可信上限约束。宿主可能预建本轮目录内的候选目录;它们的存在是运行条件,不等于任务获得写授权。重新确认基线后冻结这个准备状态,并通过导出配置记录。结果适用于记录的准备状态,不能省略目录准备后直接宣称仍然可运行。

JUnit 报告禁止 DTD 和自定义实体声明,并限制文件大小、元素数和嵌套深度。拒绝证据的来源会注明;任务 stderr 可伪造,系统拒绝日志也可能缺失,失败解释不提供独立的因果或真实性认证。

探针结论的范围

宿主先确认资源存在及端点健康,再检查沙箱内操作结果。EPERM/EACCES 可作为拒绝证据;夹具缺失、探针无法启动、端点停机和不明确超时均不能算通过。

explicit 模式还在项目内建立固定位置的假文件,它们只被禁止写入,读取预期由实际授权计算。宽授权必须能读,收紧后未覆盖的假文件必须被拒绝。宿主前后检查内容;缺失或篡改为 unknown。文件/目录类型在每轮启动时冻结,后置探针不会因文件被替换成目录而放宽规则。命名空间 .permsift-read-* 保留给探针;冲突时中止本轮,不覆盖输入。

测试只覆盖实现的访问路径。一个本地 TCP 连接被拒绝,不能证明 IPv6、UDP、DNS、系统服务或所有 IPC 通道都被完整验证。读写探针也不构成沙箱无逃逸的证明。

经认证代理请求保留域名 permsift-denied.invalid 必须得到 403;缺失认证或代理故障不算拒绝通过。本地 npm 注册表真实测试覆盖允许下载、未授权主机拒绝和恢复;公开 clsx 示例另外验证 HTTPS 下载。域名授权匹配所有端口,不约束 URL 路径、响应内容或域名解析后的所有目标风险,也不证明供应链可信。

安装固定禁用生命周期脚本、审计和 fund,不继承用户/global npm 配置或私有 token,并拒绝项目 .npmrc、非注册表依赖和 workspaces。锁文件与 package.json 在安装前后核对哈希。warm 种子作为输入冻结并独立克隆,不能用其离线成功推断空缓存不需网络。详见 安装说明。

进程与资源

每个工作负载拥有独立进程组,正常退出、超时或取消时终止该组,避免普通后台子进程污染后续实验。后端自身在独立 worker 运行,父进程等待其退出;完成结果发送后代理清理超过 1 秒时,结束 worker 并记录强制清理。没有结果、超时、取消或清理异常不会被强制清理转成成功。故意调用 setsid、守护进程化或借宿主服务启动独立进程,超出支持的工作负载约定。

任务日志、输入快照、断言文件和输出扫描有大小限制,但没有提供内核级 CPU、内存、磁盘配额或完整系统调用过滤。时间预算包含阶段检查和进程超时,宿主复制与后端初始化不能立即抢占。

运行环境与证据

macOS Seatbelt/sandbox-exec 的行为可能随系统版本变化,应在新环境先运行 doctor 并完成集成测试。工具不在不支持的平台上静默退回普通执行。

本地 JSON 报告没有数字签名。被测沙箱进程被禁止写报告,但同一宿主用户的其他进程仍可修改报告。日志可能包含项目输出,不应未经检查上传到公开 issue。

check 从本地历史报告导入授权,仍用当前独立 limits 校验,并只使用当前配置定义的命令和断言。导入校验通过不是签名认证。拒绝路径及模块错误只生成补充假设,成功建议须实际执行并重复验证;原文件变成目录时不会沿用文件授权扩大读取。旧规则和宽规则都失败时,无法证明权限是原因。详见 回归检查。

发现缺陷时,应先用假数据创建可重复案例,记录系统、Node、SRT 和 Permsift 版本。项目尚未建立独立的漏洞披露邮箱;公开讨论中不要附真实凭据。

参考

分阶段与安装快照

v0.6 分阶段模式实际切换安装写规则和任务读写规则,安装器保留宽工作区读取。任务快照属于本次实验的受保护状态,派生副本保留独立 inode;内容、文件/目录模式和链接核对失败即 unknown。摘要不覆盖扩展属性/ACL/mtime。最终必须从原始输入重新安装并验证两段策略,预算或故障不能用快照结果顶替。候选搜索限定于冻结安装状态及有限操作,不证明跨阶段全局最小。具体流程与保留的小缓存权限见 分阶段说明。

There aren't any published security advisories