Skip to content

为 Bash 工具引入权限模式,并对齐 C/Go/Rust 实现#33

Merged
lloydzhou merged 6 commits into
mainfrom
bash-tool-policy-mode
May 28, 2026
Merged

为 Bash 工具引入权限模式,并对齐 C/Go/Rust 实现#33
lloydzhou merged 6 commits into
mainfrom
bash-tool-policy-mode

Conversation

@lloydzhou
Copy link
Copy Markdown
Owner

@lloydzhou lloydzhou commented May 28, 2026

变更内容

这个 PR 分两部分:

1. Bash 主版本:为 Bash 工具引入权限模式

将 Bash 工具的安全策略从原来的 deny reason 规则,重构为 BASH_AGENT_BASH_MODE 驱动的权限模式。

核心模型:

  • 使用 4 位八进制表示 system / external / network / workspace
  • 每一位使用 read=4 / write=2 / execute=1
  • 对一段 Bash command / script 扫描,生成 required_mode
  • 使用 12-bit mask 判断 required_mode 是否被 allowed_mode 覆盖
  • 无效 BASH_AGENT_BASH_MODE 统一 fail-closed 为 0000

同时统一了 Bash 主版本的报错文案:

Error: command blocked by bash safety policy (required=... allowed=...; mode=system/external/network/workspace bits=4:read,2:write,1:execute)

2. 多运行时对齐:C / Go / Rust

在 Bash 主版本完成后,将同一套权限模式逻辑同步到:

  • C
  • Go
  • Rust

目标不是“语义接近”,而是:

  • 配置名一致:BASH_AGENT_BASH_MODE
  • 默认值一致:0447
  • 失效策略一致:invalid mode -> 0000
  • 分类逻辑一致:同一 command 得到同一 required_mode
  • 判定逻辑一致:同一 allowed/required 得到同一 allow/block 结果
  • 报错文案一致

具体修改

Bash 主版本

  • 引入 tool_classify_bash_required_mode
  • 引入 tool_bash_mode_allows
  • 将 Bash 安全策略改为 mode-based 判定
  • 简化实现,移除动态 reason 累积
  • 固定错误文案
  • README / 环境变量说明补充 BASH_AGENT_BASH_MODE

Go

  • 移除旧的 ToolDenyBashReason
  • 切换到与 Bash 主版本一致的 mode classifier / allows 判断
  • help 文案补充 BASH_AGENT_BASH_MODE
  • 增加 Go 单测覆盖 classifier / allows

C

  • 移除旧的 bash_deny_reason
  • 切换到 mode classifier / allows 判断
  • help 文案补充 BASH_AGENT_BASH_MODE

Rust

  • 将 Bash 安全检查切换到 mode classifier / allows 判断
  • help 文案补充 BASH_AGENT_BASH_MODE
  • 增加 Rust 侧对应的 mode 单测源码

测试

补强 12-bit 权限测试覆盖,新增对具体 mode 的断言,而不只是检查“是否 blocked”:

  • required=4000 system read
  • required=0050 network execute
  • required=0200 external write
  • invalid mode fail-closed -> allowed=0000
  • custom mode allow system read

验证

已验证:

  • GOCACHE=$PWD/go/.gocache GOMODCACHE=$PWD/go/.gomodcache go -C go test ./...
  • make build-go
  • make build-c
  • /bin/zsh -lc 'AGENT=./dist/goagent bash tests/test.sh 9902'
  • /bin/zsh -lc 'AGENT=./dist/cagent bash tests/test.sh 9904'

结果:

  • Go 单测通过
  • Go e2e: 124 passed, 0 failed
  • C e2e: 124 passed, 0 failed

补充说明:

  • Rust 侧代码已经按相同逻辑完成对齐,并且你本地已验证 make test-rust build-rust test-rust-e2e
  • 我这边未能独立重跑 Cargo 依赖下载链路,原因是当前机器的 Cargo registry 镜像连接失败,不是本次代码逻辑问题

@lloydzhou lloydzhou changed the title 为 Bash 工具添加基于 scope/permission 的权限模式 对齐 C/Go/Rust 的 Bash 权限模式逻辑并补强 12-bit 测试覆盖 May 28, 2026
@lloydzhou lloydzhou changed the title 对齐 C/Go/Rust 的 Bash 权限模式逻辑并补强 12-bit 测试覆盖 为 Bash 工具引入权限模式,并对齐 C/Go/Rust 实现 May 28, 2026
@lloydzhou lloydzhou merged commit 1519076 into main May 28, 2026
30 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant