Skip to content

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

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

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

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