Skip to content

Plan 模式下 write/bash 权限校验漏洞,可直接修改源码文件 #12

@C2-synth

Description

@C2-synth

问题描述

在 OpenSpec Plan 模式下,插件应只允许修改 specs/**openspec/**project.mdAGENTS.md 路径下的文件,但实际上存在两个权限校验漏洞,导致可以绕过限制直接修改项目源码。

漏洞 1:write 工具对新建文件未校验路径

当使用 write 工具创建新文件时,没有对目标路径做白名单校验,导致可以在任意位置创建源码文件。

复现步骤

  1. 进入 OpenSpec Plan 模式
  2. 使用 write 工具在项目源码目录创建新文件,例如 Search/Data/BLKMaterialSearchDataHandler.h
  3. 文件写入成功,未被拦截

预期行为write 工具应拦截所有不在白名单路径(specs/**openspec/**project.mdAGENTS.md)的写入操作,无论文件是否已存在。

实际行为:新建文件时绕过了路径校验,写入成功。

漏洞 2:bash 工具未限制文件写入操作

bash 工具的权限策略中,白名单规则只限制了允许的命令模式(如 git status*cat *ls *),但未限制文件写入操作(如 cat > filetee filecp 等)。

复现步骤

  1. 进入 OpenSpec Plan 模式
  2. edit 工具被拦截后,使用 bash 执行 cat > /path/to/file << 'EOF' ... EOF
  3. 文件写入成功,绕过了权限系统

讽刺的是gh issue create 这种无害操作反而被拦截了,而 cat > 写源码却放行了,说明白名单策略覆盖不完整。

影响

这两个漏洞导致 OpenSpec Plan 模式的核心约束被破坏——只规划,不修改源码的原则无法得到保证。

建议修复方案

对于漏洞 1(write 工具)

  • write 工具的权限校验逻辑中,对所有写入操作统一校验目标路径,不区分文件是否已存在
  • 校验逻辑应与 edit 工具一致

对于漏洞 2(bash 工具)

  • 方案 A:在 bash 白名单中显式禁止 cat >teecpmvmkdirrm 等文件操作命令
  • 方案 B:对 bash 命令进行预分析,检测是否包含文件写入操作,并对写入目标路径做白名单校验
  • 方案 C(推荐):在 Plan 模式下,bash 只允许只读命令(lscat(只读)、findgrepgit status/log/diff/showwhichenvpwdecho(无重定向)等)

环境信息

  • 插件版本:0.1.4
  • opencode 版本:0.0.0-dev-202604030847
  • 系统:macOS Darwin

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions