什么是 Shell Gate?

Shell Gate 是 Alius 的人在环安全层。它对 Agent 请求的所有 shell 和文件操作进行风险分析和范围检查,确保你在敏感操作中保持控制。

Shell Gate 不是一个简单的”允许/拒绝”开关。它会分析命令字符串、参数、路径、重定向目标、当前工作目录、来源、工作空间根目录和授权策略,做出细粒度的决策。

工作原理

当 Agent 想要执行操作(Shell 命令、文件写入等)时,Shell Gate 会:

  1. 拦截操作
  2. 分析命令风险和范围
  3. 决策:Allow / Deny / ApprovalRequired
  4. 记录决策用于审计

Shell Gate 决策

决策Plan 模式行为Bypass 模式行为
Allow直接执行直接执行
Deny拒绝执行拒绝执行
ApprovalRequired暂停等待用户确认直接执行并返回结果

在 Bypass 模式中,ApprovalRequired 的 Shell 决策会直接执行而非等待确认。被 Deny 的操作仍然不会执行。

Git 命令风险分级

Shell Gate 对 Git 子命令进行分类:

风险级别命令说明
低风险git status, git log, git diff, git show, git branch只读操作
中风险git clone, git fetch, git pull, git submodule写入工作空间和/或使用网络
中风险git push, git checkout, git switch, git merge, git rebase, git restore, git add, git commit修改操作
高风险git clean, git reset --hard可能导致数据丢失

工作空间边界检查

所有文件操作通过 resolve_within_workspace(path, workspace, must_exist) 进行边界检查:

  • 阻止绝对路径访问(如 /etc/passwd
  • 阻止父目录遍历(如 ../secret
  • 阻止符号链接逃逸
  • 检查选项值中的路径(如 --output=/tmp/file
  • 检查重定向目标(如 > /tmp/file2>/tmp/error
  • 忽略 URL 类值(不作为路径处理)

内置工具权限

工具权限级别说明
shellExecute执行 shell 命令,120 秒超时,输出截断 20,000 字符
read_fileRead读取文件,工作空间边界检查
write_fileWrite写入文件,Plan 模式需要确认
list_dirRead列出目录内容
edit_fileWrite替换文件内容,Plan 模式需要确认

Shell 工具

Shell 工具的完整执行流程:

  1. 解析参数
  2. 解析 cwd 在工作空间范围内
  3. 调用 shell_gate::authorize 进行风险分析
  4. Deny → 拒绝执行
  5. Allow → 执行命令
  6. ApprovalRequired → Plan 模式暂停等确认,Bypass 模式直接执行
  7. 输出格式:[exit:N]\n<stdout>\n<stderr>,截断 20,000 字符

配置权限

.alius/config/permissions.toml 中配置:

[shell]
default = "ask"
auto_approve = ["ls", "cat", "git status", "git log", "git diff"]
deny = ["rm -rf /", "format", "mkfs"]

[file_write]
default = "ask"
deny_patterns = [".env", "credentials", "*.key"]

[network]
default = "ask"

最佳实践

  1. 从严格开始 — 所有操作类型使用 ask 作为默认
  2. 逐步添加自动审批 — 仅用于你经常运行且信任的命令
  3. 审查 Trace — 定期检查审计日志
  4. 不要自动审批写入 — 保持文件修改需要审批
  5. 关注 Bypass 模式 — Bypass 模式下 ApprovalRequired 会直接执行,确保你信任当前任务

审计

所有工具调用都会产生 ToolCallStartedToolCallCompleted 事件,记录在 Session 的 Trace 中。Shell 调用在会话区以 shell: <command> 格式显示,完成块包含简短的输出摘要。