沙箱执行环境

📎 引用文件

本文引用的文件 - agent/src/core/runner.py - agent/backtest/runner.py - agent/src/tools/bash_tool.py - agent/src/security/scanner.py - agent/src/config/limits.py - agent/tests/test_runner_env.py - agent/tests/test_backtest_runner_security.py - agent/tests/test_special_token_neutralization.py

目录

  1. 简介
  2. 项目结构
  3. 核心组件
  4. 架构总览
  5. 详细组件分析
  6. 依赖关系分析
  7. 性能与资源限制
  8. 故障排查指南
  9. 结论
  10. 附录:配置示例与调试方法

简介

本文件面向 Vibe-Trading 的“沙箱执行环境”,聚焦代码隔离、资源限制、网络访问控制、文件系统安全、Shell 工具安全控制、命令白名单、环境变量过滤、进程隔离、审计日志与常见安全风险防护。文档以仓库中实际实现为依据,提供可操作的配置与排障建议,帮助运营方在本地、CI 或容器化部署中安全地运行用户生成的策略与工具调用。

项目结构

围绕沙箱执行的关键路径包括: - 子进程执行器与环境裁剪:负责创建受限环境、设置资源上限、隔离 HOME、可选 UID 降级等。 - 回测入口与安全扫描:对信号引擎源码进行 AST 静态检查与运行时可达路径扫描,拒绝危险导入与写入。 - Shell 工具安全:在执行 shell 命令前进行安全检查与输出限制。 - 外部内容安全:对外部读取内容进行提示注入检测与控制令牌中和。 - 结果大小限制:统一截断工具返回结果,避免模型上下文被滥用。

graph TB A["用户/Agent"] --> B["Runner(子进程执行器)"] B --> C["构建受限环境<br/>环境变量白名单/临时HOME"] B --> D["资源限制(preexec_fn)<br/>RLIMIT_AS/NOFILE"] B --> E["可选UID降级(vibe-sandbox)"] B --> F["Python 解释器执行回测入口"] F --> G["AST 静态检查 + 运行时可达路径扫描"] G --> H["禁止危险模块/属性/写入/动态执行"] B --> I["收集日志与产物"]

图示来源 - agent/src/core/runner.py:33-110 - agent/src/core/runner.py:431-501 - agent/backtest/runner.py:274-767

章节来源 - agent/src/core/runner.py:33-110 - agent/backtest/runner.py:274-767

核心组件

章节来源 - agent/src/core/runner.py:175-278 - agent/src/core/runner.py:113-173 - agent/src/core/runner.py:85-110 - agent/backtest/runner.py:274-767 - agent/src/tools/bash_tool.py:1-52 - agent/src/security/scanner.py:1-264 - agent/src/config/limits.py:1-49

架构总览

下图展示一次回测执行的端到端流程,包含环境准备、资源限制、AST 检查与产物收集。

sequenceDiagram participant U as "用户/Agent" participant R as "Runner" participant P as "子进程(Python)" participant S as "AST 扫描器" participant FS as "文件系统" U->>R : 提交 entry_script 与 run_dir R->>R : 构建受限环境(环境变量白名单/临时HOME) R->>P : 启动子进程(可选UID降级/preexec_fn) P->>S : 解析并扫描 signal_engine 源码 S-->>P : 通过/拒绝(抛出异常) alt 通过 P->>FS : 读取数据/计算指标/写入产物 P-->>R : stdout/stderr/退出码 R->>FS : 保存日志与产物 R-->>U : 返回执行结果 else 拒绝 P-->>R : 错误信息 R-->>U : 返回错误 end

图示来源 - agent/src/core/runner.py:431-501 - agent/backtest/runner.py:736-767 - agent/src/core/runner.py:503-620

详细组件分析

子进程执行器(Runner)

flowchart TD Start(["开始"]) --> Env["构建受限环境<br/>环境变量白名单/临时HOME"] Env --> Limits{"POSIX?<br/>应用资源限制"} Limits --> |是| Preexec["preexec_fn 设置 RLIMIT_AS/NOFILE"] Limits --> |否| SkipLimits["跳过资源限制"] Preexec --> UID{"可用UID降级?"} SkipLimits --> UID UID --> |是| Drop["以非特权用户运行"] UID --> |否| RunAsIs["以当前用户运行"] Drop --> Exec["执行子进程"] RunAsIs --> Exec Exec --> Collect["收集日志与产物"] Collect --> End(["结束"])

图示来源 - agent/src/core/runner.py:175-278 - agent/src/core/runner.py:113-173 - agent/src/core/runner.py:85-110 - agent/src/core/runner.py:480-501 - agent/src/core/runner.py:503-620

章节来源 - agent/src/core/runner.py:175-278 - agent/src/core/runner.py:113-173 - agent/src/core/runner.py:85-110 - agent/src/core/runner.py:480-501 - agent/src/core/runner.py:503-620

回测入口安全(AST 静态检查与运行时可达路径扫描)

flowchart TD A["解析 signal_engine.py"] --> B["结构校验<br/>拒绝import-time可执行语句"] B --> C["定位 SignalEngine 类与方法"] C --> D["广度优先遍历可达函数"] D --> E{"节点是否危险?"} E --> |是| X["拒绝执行(抛出异常)"] E --> |否| F["继续扫描/通过"]

图示来源 - agent/backtest/runner.py:274-767

章节来源 - agent/backtest/runner.py:274-767

Shell 工具安全控制(BashTool)

sequenceDiagram participant T as "BashTool" participant OS as "操作系统" T->>T : 校验命令(安全规则) alt 通过 T->>OS : 执行命令(带超时/输出限制) OS-->>T : 返回stdout/stderr/退出码 T-->>T : 格式化结果 else 拒绝 T-->>T : 返回错误信息 end

图示来源 - agent/src/tools/bash_tool.py:1-52

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

外部内容安全(提示注入检测与控制令牌中和)

flowchart TD In["外部文本输入"] --> Scan["扫描提示注入模式"] Scan --> Warn{"发现注入模式?"} Warn --> |是| AddWarn["附加安全警告元数据"] Warn --> |否| SkipWarn["无警告"] AddWarn --> Defang["中和控制令牌"] SkipWarn --> Defang Defang --> Out["返回净化后的文本+警告(如有)"]

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

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

工具结果限制

章节来源 - agent/src/config/limits.py:1-49

依赖关系分析

graph LR R["Runner"] --> BR["Backtest Runner(AST扫描)"] R --> BT["BashTool"] BT --> SH["Shell 安全辅助"] R --> L["limits(结果限制)"] BR --> FS["文件系统(受限)"] R --> ENV["环境变量白名单"]

图示来源 - agent/src/core/runner.py:175-278 - agent/backtest/runner.py:274-767 - agent/src/tools/bash_tool.py:1-52 - agent/src/config/limits.py:1-49

章节来源 - agent/src/core/runner.py:175-278 - agent/backtest/runner.py:274-767 - agent/src/tools/bash_tool.py:1-52 - agent/src/config/limits.py:1-49

性能与资源限制

章节来源 - agent/src/core/runner.py:73-110 - agent/src/core/runner.py:503-620 - agent/src/config/limits.py:1-49

故障排查指南

章节来源 - agent/src/core/runner.py:480-501 - agent/src/core/runner.py:503-620 - agent/backtest/runner.py:736-767 - agent/src/tools/bash_tool.py:1-52 - agent/src/security/scanner.py:1-264

结论

Vibe-Trading 的沙箱执行环境通过“进程隔离 + 环境变量白名单 + 临时 HOME + 资源限制 + 可选 UID 降级 + AST 静态/可达路径扫描 + 工具层安全控制”的多层防御,有效降低了代码执行风险、资源滥用与外部注入威胁。建议在容器化部署中启用 UID 降级与资源限制,并结合审计日志与测试用例持续验证安全边界。

附录:配置示例与调试方法

章节来源 - agent/tests/test_runner_env.py:60-108 - agent/tests/test_runner_env.py:188-220 - agent/tests/test_runner_env.py:297-318 - agent/tests/test_backtest_runner_security.py - agent/tests/test_special_token_neutralization.py:1-38