问题描述
在 OpenSpec Plan 模式下,插件应只允许修改 specs/**、openspec/**、project.md、AGENTS.md 路径下的文件,但实际上存在两个权限校验漏洞,导致可以绕过限制直接修改项目源码。
漏洞 1:write 工具对新建文件未校验路径
当使用 write 工具创建新文件时,没有对目标路径做白名单校验,导致可以在任意位置创建源码文件。
复现步骤:
- 进入 OpenSpec Plan 模式
- 使用
write 工具在项目源码目录创建新文件,例如 Search/Data/BLKMaterialSearchDataHandler.h
- 文件写入成功,未被拦截
预期行为:write 工具应拦截所有不在白名单路径(specs/**、openspec/**、project.md、AGENTS.md)的写入操作,无论文件是否已存在。
实际行为:新建文件时绕过了路径校验,写入成功。
漏洞 2:bash 工具未限制文件写入操作
bash 工具的权限策略中,白名单规则只限制了允许的命令模式(如 git status*、cat *、ls *),但未限制文件写入操作(如 cat > file、tee file、cp 等)。
复现步骤:
- 进入 OpenSpec Plan 模式
edit 工具被拦截后,使用 bash 执行 cat > /path/to/file << 'EOF' ... EOF
- 文件写入成功,绕过了权限系统
讽刺的是:gh issue create 这种无害操作反而被拦截了,而 cat > 写源码却放行了,说明白名单策略覆盖不完整。
影响
这两个漏洞导致 OpenSpec Plan 模式的核心约束被破坏——只规划,不修改源码的原则无法得到保证。
建议修复方案
对于漏洞 1(write 工具)
- 在
write 工具的权限校验逻辑中,对所有写入操作统一校验目标路径,不区分文件是否已存在
- 校验逻辑应与
edit 工具一致
对于漏洞 2(bash 工具)
- 方案 A:在 bash 白名单中显式禁止
cat >、tee、cp、mv、mkdir、rm 等文件操作命令
- 方案 B:对 bash 命令进行预分析,检测是否包含文件写入操作,并对写入目标路径做白名单校验
- 方案 C(推荐):在 Plan 模式下,bash 只允许只读命令(
ls、cat(只读)、find、grep、git status/log/diff/show、which、env、pwd、echo(无重定向)等)
环境信息
- 插件版本:0.1.4
- opencode 版本:0.0.0-dev-202604030847
- 系统:macOS Darwin
问题描述
在 OpenSpec Plan 模式下,插件应只允许修改
specs/**、openspec/**、project.md、AGENTS.md路径下的文件,但实际上存在两个权限校验漏洞,导致可以绕过限制直接修改项目源码。漏洞 1:
write工具对新建文件未校验路径当使用
write工具创建新文件时,没有对目标路径做白名单校验,导致可以在任意位置创建源码文件。复现步骤:
write工具在项目源码目录创建新文件,例如Search/Data/BLKMaterialSearchDataHandler.h预期行为:
write工具应拦截所有不在白名单路径(specs/**、openspec/**、project.md、AGENTS.md)的写入操作,无论文件是否已存在。实际行为:新建文件时绕过了路径校验,写入成功。
漏洞 2:
bash工具未限制文件写入操作bash工具的权限策略中,白名单规则只限制了允许的命令模式(如git status*、cat *、ls *),但未限制文件写入操作(如cat > file、tee file、cp等)。复现步骤:
edit工具被拦截后,使用bash执行cat > /path/to/file << 'EOF' ... EOF讽刺的是:
gh issue create这种无害操作反而被拦截了,而cat >写源码却放行了,说明白名单策略覆盖不完整。影响
这两个漏洞导致 OpenSpec Plan 模式的核心约束被破坏——只规划,不修改源码的原则无法得到保证。
建议修复方案
对于漏洞 1(write 工具)
write工具的权限校验逻辑中,对所有写入操作统一校验目标路径,不区分文件是否已存在edit工具一致对于漏洞 2(bash 工具)
cat >、tee、cp、mv、mkdir、rm等文件操作命令ls、cat(只读)、find、grep、git status/log/diff/show、which、env、pwd、echo(无重定向)等)环境信息