工具安全控制

📎 引用文件

本文引用的文件 - agent/src/tools/_shell_safety.py - agent/src/tools/bash_tool.py - agent/src/api/security.py - agent/src/live/audit.py - agent/src/security/scanner.py - agent/src/security/network.py - agent/src/security/workspace_policy.py - agent/src/providers/llm.py - agent/src/api/settings_routes.py - frontend/src/types/agent.ts - README.md

目录

  1. 简介
  2. 项目结构
  3. 核心组件
  4. 架构总览
  5. 详细组件分析
  6. 依赖关系分析
  7. 性能考量
  8. 故障排查指南
  9. 结论
  10. 附录

简介

本文件系统性说明工具系统的安全控制机制,覆盖沙箱执行环境、命令执行限制、文件系统访问控制、网络请求过滤、权限与角色、审计日志、安全配置与最佳实践,以及常见安全风险与防护措施。目标是帮助开发者与运维人员理解并正确配置该系统的“默认拒绝”式安全边界,确保在远程部署、多租户或自动化场景中实现最小权限、可审计与可恢复的运行保障。

项目结构

围绕安全控制的代码主要分布在以下模块: - 沙箱与命令执行:bash 工具与共享安全检查 - API 鉴权与安全头:CORS、本地回环主机校验、CSP、权限策略 - 网络与路径安全:URL 目标校验、工作区路径白名单 - 提示注入扫描:外部内容扫描与特殊令牌中和 - 实时交易审计:不可变审计账本、脱敏与链式防篡改副本 - 配置与环境变量:API 密钥、代理、额外 CORS、沙箱资源限制等

graph TB A["API 层<br/>security.py"] --> B["命令执行<br/>bash_tool.py / _shell_safety.py"] A --> C["网络与路径安全<br/>network.py / workspace_policy.py"] A --> D["提示注入扫描<br/>scanner.py"] A --> E["审计与合规<br/>live/audit.py"] A --> F["配置与环境<br/>settings_routes.py / llm.py / README.md"]

图表来源 - agent/src/api/security.py:1-200 - agent/src/tools/bash_tool.py:1-52 - agent/src/tools/_shell_safety.py:1-60 - agent/src/security/network.py:1-11 - agent/src/security/workspace_policy.py:1-12 - agent/src/security/scanner.py:1-264 - agent/src/live/audit.py:1-352 - agent/src/api/settings_routes.py:202-473 - agent/src/providers/llm.py:757-786 - README.md:728-746

章节来源 - agent/src/api/security.py:1-200 - agent/src/tools/bash_tool.py:1-52 - agent/src/tools/_shell_safety.py:1-60 - agent/src/security/network.py:1-11 - agent/src/security/workspace_policy.py:1-12 - agent/src/security/scanner.py:1-264 - agent/src/live/audit.py:1-352 - agent/src/api/settings_routes.py:202-473 - agent/src/providers/llm.py:757-786 - README.md:728-746

核心组件

章节来源 - agent/src/tools/bash_tool.py:1-52 - agent/src/tools/_shell_safety.py:1-60 - agent/src/security/network.py:1-11 - agent/src/security/workspace_policy.py:1-12 - agent/src/api/security.py:561-669 - agent/src/live/audit.py:1-352 - agent/src/security/scanner.py:1-264 - agent/src/api/settings_routes.py:202-473 - agent/src/providers/llm.py:757-786 - README.md:728-746

架构总览

下图展示从 API 入口到工具执行、安全校验、审计记录的完整链路。

sequenceDiagram participant Client as "客户端" participant API as "API 安全中间件<br/>security.py" participant Tool as "工具执行器<br/>bash_tool.py" participant Safety as "命令安全检查<br/>_shell_safety.py" participant Net as "网络/路径校验<br/>network.py / workspace_policy.py" participant Audit as "审计记录<br/>live/audit.py" Client->>API : 发起受保护请求 API->>API : 校验B令牌/本地回环/CORS/CSP API->>Tool : 路由到具体工具 Tool->>Safety : 检查危险命令(如按名杀Python) Safety-->>Tool : 允许/拒绝 Tool->>Net : 校验URL/路径(必要时) Net-->>Tool : 允许/拒绝 Tool-->>API : 返回结果(含脱敏) API->>Audit : 写入审计记录(可选, 实时交易) API-->>Client : 响应

图表来源 - agent/src/api/security.py:166-200 - agent/src/tools/bash_tool.py:36-52 - agent/src/tools/_shell_safety.py:38-60 - agent/src/security/network.py:1-11 - agent/src/security/workspace_policy.py:1-12 - agent/src/live/audit.py:248-352

详细组件分析

沙箱执行环境与命令执行限制

flowchart TD Start(["进入 bash 工具"]) --> CheckCmd["解析命令参数"] CheckCmd --> SafetyCheck{"是否包含危险模式?"} SafetyCheck -- 是 --> Deny["返回错误: 禁止按名称终止Python进程"] SafetyCheck -- 否 --> Exec["执行命令(带超时/输出限制)"] Exec --> Output["收集stdout/stderr/退出码"] Output --> End(["返回JSON结果"])

图表来源 - agent/src/tools/bash_tool.py:36-52 - agent/src/tools/_shell_safety.py:38-60

章节来源 - agent/src/tools/bash_tool.py:1-52 - agent/src/tools/_shell_safety.py:1-60

文件系统访问控制

flowchart TD A["文件操作请求"] --> B["计算目标路径"] B --> C{"是否在允许根路径内?"} C -- 否 --> D["拒绝访问"] C -- 是 --> E["放行并执行"]

图表来源 - agent/src/security/workspace_policy.py:1-12 - README.md:728-746

章节来源 - agent/src/security/workspace_policy.py:1-12 - README.md:728-746

网络请求过滤

sequenceDiagram participant App as "应用" participant Net as "网络校验(network.py)" participant Policy as "CSP/权限策略(security.py)" App->>Net : 校验URL目标/重定向 Net-->>App : 允许/拒绝 App->>Policy : 设置响应头(CSP/Permissions-Policy) Policy-->>App : 安全头已设置

图表来源 - agent/src/security/network.py:1-11 - agent/src/api/security.py:166-200

章节来源 - agent/src/security/network.py:1-11 - agent/src/api/security.py:166-200

权限管理与角色控制

classDiagram class SecurityMiddleware { +require_auth(request) Principal +require_local_or_auth(request) None +require_settings_write_auth(request) None -_is_local_client(request) bool -_parse_cors_origins(raw) str[] } class SettingsRoutes { +read_settings_env_values() Dict +update_settings(updates) Dict } SecurityMiddleware <.. SettingsRoutes : "保护写操作"

图表来源 - agent/src/api/security.py:561-669 - agent/src/api/settings_routes.py:202-473 - README.md:728-746

章节来源 - agent/src/api/security.py:561-669 - agent/src/api/settings_routes.py:202-473 - README.md:728-746

工具调用的审计日志

sequenceDiagram participant Tool as "工具/网关" participant Audit as "审计写入(live/audit.py)" participant Ledger as "主账本(audit.jsonl)" participant Chain as "链式副本(audit_chain.jsonl)" participant Trace as "运行期Trace" participant Bus as "事件总线" Tool->>Audit : write_live_action(event) Audit->>Ledger : 写入并fsync Audit->>Chain : 可选写入(哈希链) Audit->>Trace : 可选写入(type="live_action") Audit->>Bus : 可选推送("live.action") Audit-->>Tool : 返回脱敏记录

图表来源 - agent/src/live/audit.py:248-352 - frontend/src/types/agent.ts:60-81

章节来源 - agent/src/live/audit.py:1-352 - frontend/src/types/agent.ts:60-81

提示注入与外部内容安全

flowchart TD In["外部文本输入"] --> Scan["扫描注入模式"] Scan --> Neutralize["中和特殊令牌"] Neutralize --> Annotate["附加security_warnings"] Annotate --> Out["返回安全增强载荷"]

图表来源 - agent/src/security/scanner.py:1-264

章节来源 - agent/src/security/scanner.py:1-264

依赖关系分析

graph LR Sec["security.py"] --> Bash["bash_tool.py"] Bash --> Safe["_shell_safety.py"] Sec --> Net["network.py"] Sec --> Work["workspace_policy.py"] Sec --> Aud["live/audit.py"] Sec --> Set["settings_routes.py"] Sec --> LLM["providers/llm.py"]

图表来源 - agent/src/api/security.py:1-200 - agent/src/tools/bash_tool.py:1-52 - agent/src/tools/_shell_safety.py:1-60 - agent/src/security/network.py:1-11 - agent/src/security/workspace_policy.py:1-12 - agent/src/live/audit.py:1-352 - agent/src/api/settings_routes.py:202-473 - agent/src/providers/llm.py:757-786

章节来源 - agent/src/api/security.py:1-200 - agent/src/tools/bash_tool.py:1-52 - agent/src/tools/_shell_safety.py:1-60 - agent/src/security/network.py:1-11 - agent/src/security/workspace_policy.py:1-12 - agent/src/live/audit.py:1-352 - agent/src/api/settings_routes.py:202-473 - agent/src/providers/llm.py:757-786

性能考量

[本节为通用指导,无需特定文件来源]

故障排查指南

章节来源 - agent/src/api/security.py:625-669 - agent/src/tools/_shell_safety.py:38-60 - agent/src/live/audit.py:80-97 - agent/src/security/scanner.py:145-174

结论

该系统采用“默认拒绝”的安全模型:严格的命令执行限制、路径与网络白名单、强化的浏览器安全头、显式的认证与写保护、不可变审计与可选防篡改链,以及对外部内容的提示注入防护。通过合理的环境变量与策略配置,可在不同部署环境下平衡安全性与可用性,确保工具调用过程可控、可观测、可追溯。

[本节为总结,无需特定文件来源]

附录

安全配置指南

章节来源 - README.md:728-746 - agent/src/api/security.py:30-116 - agent/src/api/security.py:180-200 - agent/src/api/settings_routes.py:202-473 - agent/src/providers/llm.py:757-786

常见安全风险与防护措施

章节来源 - agent/src/tools/_shell_safety.py:38-60 - agent/src/security/scanner.py:145-220 - agent/src/live/audit.py:217-246 - frontend/src/types/agent.ts:60-81