沙箱为智能体生成的命令提供受限的执行环境,确保智能体在安全隔离的环境中运行命令,防止未经授权的文件访问。
支持的操作系统
- macOS
- Windows(包括 Windows 原生系统以及 Remote WSL 2)
- Linux:Debian 10 及以上、Ubuntu 20.04 及以上(通过 Remote SSH 和 Bubblewrap 实现)
系统内置安全策略:文件访问控制
提示
- 当前系统内置安全策略不涉及网络访问。
- 读写权限继承当前用户权限;当读写与只读权限冲突时,以只读权限为准。
启用沙箱后,TraeCode 的文件目录访问权限如下:
| 权限类型 | 目录类型 | 目录列表 |
|---|---|---|
| 只读 | 项目目录中的受保护目录 | .vscode |
| ^^ | 根目录 | /(默认策略:所有未显式声明为可写的目录均为只读) |
| 读写 | 项目目录 | 除 .trae、.vscode 和 .git 之外的项目文件与目录 |
| ^^ | 临时目录 |
|
| ^^ | 缓存目录 |
|
| ^^ | 通用工具依赖目录 |
|
| ^^ | 常用语言的工具链及其依赖目录 | Go、Java、Python、Node.js、Rust 和 C++ 等常用语言的工具链及其依赖目录。 |
使用流程
第一步:在操作系统中配置环境
使用沙箱前,需要根据你所使用的操作系统,完成相应的环境配置。
基于 macOS 的 sandbox-exec 工具,TraeCode 会自动为你创建一个受限的命令执行环境。你无需进行任何额外配置。
基于自研的沙箱 SDK,TraeCode 会自动为你创建一个受限的命令执行环境。你无需进行任何额外配置。
沙箱功能需通过 WSL 2 / Remote SSH 和 Bubblewrap 实现。
在远程 Linux 环境中,TraeCode 基于 User Namespace 构建沙箱,并在独立的 User Namespace 中结合其他 Linux Namespace,实现对多类系统资源的隔离。
- 关于如何在 Windows 上运行 Linux 环境,参考使用 WSL 进行远程开发。
- 关于如何使用 Remote SSH 功能连接你的 Linux 远程主机,参考使用 SSH 进行远程开发。
在远程环境中启用沙箱时,TraeCode 会自动完成以下配置:
- 检查当前系统是否启用 User Namespace。绝大多数 Linux 发行版默认已启用该功能。
- 完成临时参数配置(仅当前运行周期生效)。
若系统禁止普通用户创建 User Namespace,或该功能未启用,TraeCode 会临时修改内核参数,允许非特权用户创建 User Namespace:
sysctl -w kernel.unprivileged_userns_clone=1 # 允许非特权用户(普通用户)创建 User Namespace sysctl -w kernel.apparmor_restrict_unprivileged_userns=0 # 关闭 AppArmor 对 “非特权 User Namespace” 的额外限制 - 持久化参数配置。
为确保系统重启后,沙箱依然可用,TraeCode 会将以下参数配置写入
/etc/sysctl.d/trae-sandbox.conf文件。kernel.unprivileged_userns_clone=1 kernel.apparmor_restrict_unprivileged_userns=0
第二步:在 TraeCode 中启用沙箱
在 TraeCode 中启用沙箱后,智能体将自动在沙箱中运行命令。启用沙箱的步骤如下:
- 在 IDE 模式界面中,点击界面右上角的 设置 图标,进入设置中心。 或 在 SOLO 模式界面中,点击对话面板右上角的 设置 图标,进入设置中心。
- 在左侧导航栏中,选择 对话流,进入 对话流 面板。
- 在 自动运行 部分的 自动运行命令 处,为 IDE 和/或 SOLO 模式选择 沙箱运行(支持白名单) 模式。
- 在 白名单作用于 IDE / SOLO 处,按需将命令前缀加入白名单。 白名单中的命令将跳过沙箱,直接在沙箱外执行。
自定义沙箱配置
通过 sandbox.json 文件,你可以为当前项目自定义沙箱内进程的文件和网络访问范围。
sandbox.json 文件的位置
- Windows:
%USERPROFILE%\.trae-cn\sandbox.json - macOS & Linux:
~/.trae-cn/sandbox.json
创建并编辑 sandbox.json 文件
- 前往 设置 > 对话流。
- 在 沙箱自定义配置 处,点击 打开配置 按钮。
TraeCode 将在你的本地用户目录中创建 sandbox.json文件,并在编辑器内打开它。 该文件的初始结构如下:{ "filesystem": { "readWrite": [], "readOnly": [] }, "network": { "default": "allow", "allow": [], "deny": [] } } - 在打开的
sandbox.json文件中,填入你的自定义沙箱配置。 - 保存文件以使配置生效。
文件访问配置说明
filesystem 字段用于精细控制沙箱对本地文件系统的访问权限。
| 字段 | 类型 | 默认值 | 描述 |
|---|---|---|---|
readWrite | string[] | [] | 读写路径列表。沙箱内进程对列表中的路径拥有读写权限(继承自当前用户)。 |
readOnly | string[] | [] | 只读路径列表。沙箱内进程对列表中的路径仅有只读权限。 |
支持的路径格式:
- 绝对路径:例如
/usr/local/bin或C:\Program Files; - Home 目录:使用
~表示用户主目录,如~/Documents; - 环境变量:使用
$VAR引用环境变量,如$HOME/.config; - 工作区变量:使用
$WORKSPACE_FOLDER引用当前工作区目录。
针对各个操作系统的注意事项:
- Windows:系统会自动忽略 Unix 风格的绝对路径(如
/usr/lib),并将 Git Bash 风格的路径(如/c/Users)转换为标准 Windows 路径(如C:\Users)。 - macOS / Linux:系统会自动忽略 Windows 风格的盘符路径(如
C:\Users)。
路径匹配规则:
系统会合并你的自定义配置和系统内置的文件访问控制策略,并根据以下优先级规则确定最终生效的权限:
- 路径越长、越精确,优先级越高。
- 如果一个路径被同时添加至
readWrite和readOnly列表,readOnly的优先级高于readWrite。 - 如果一个路径未被添加至
readWrite和readOnly列表,则对其采用上文安全策略:文件访问控制中的规则。
网络访问配置说明
提示
仅 Windows 操作系统支持此功能。
network 字段用于管理沙箱内进程的网络请求策略,实现允许或阻止对特定网络的访问。
可配置的字段如下:
| 字段 | 类型 | 默认值 | 描述 |
|---|---|---|---|
default | string | allow | 默认的网络访问策略。可选值:
|
allow | string[] | [] | 允许访问的网络。 |
deny | string[] | [] | 禁止访问的网络。 |
网络目标的匹配规则如下:
- 网络的地址越长、越精确,优先级越高。
- 如果一个网络地址同时被添加至
allow和deny列表,deny的优先级高于allow。 - 如果一个网络地址没有被添加至
allow和deny列表,则对其采用default中设置的默认访问策略。
支持的网络地址写法如下:
| 格式 | 含义 | 示例 |
|---|---|---|
[ip] | 单个 IP(所有端口) | "[192.168.1.100]" |
[ip/mask] | CIDR 子网(所有端口) | "[192.168.1.0/24]" |
[ipv6/mask] | CIDR 子网(所有端口) | "[ff::01/64]" |
[ip]:port | 单个 IP:单个端口 | "[192.168.1.100]:443" |
[ip]:port,port | 单个 IP:多个端口 | "[192.168.1.100]:80,443" |
[ip/mask]:port | CIDR 子网:单个端口 | "[10.0.0.0/8]:22" |
domain | 域名(所有端口) | "example.com" |
domain:port | 域名:单个端口 | "api.example.com:443" |
*.domain | 通配符域名(所有端口) | "*.example.com" |
*.domain:port | 通配符域名:单个端口 | "*.example.com:443" |
示例 1: 仅允许访问 GitHub
此配置将禁止所有网络请求,仅放行对 GitHub (HTTPS) 的访问,避免 AI 泄露敏感信息。
{
"network": {
"default": "deny",
"allow": ["*.github.com:443"],
"deny": []
}
}
示例 2:禁止访问内部网络
此配置将放行所有网络请求,但明确禁止访问常见的内网地址段,防止 AI 访问或攻击内网服务。
{
"network": {
"default": "allow",
"allow": [],
"deny": [
"[10.0.0.0/8]",
"[172.16.0.0/12]",
"[192.168.0.0/16]"
]
}
}
命令的运行策略
普通命令
启用沙箱后,系统将根据命令是否在白名单内,决定其执行方式:
- 在白名单内:命令会自动在沙箱外运行。
- 不在白名单内:命令会自动在沙箱内运行。如果运行失败,系统会询问你是否需要在沙箱外重试。
高风险命令
为了防范系统风险,当智能体生成 rm -rf 等高风险命令时,系统会拦截该操作并向你弹出提示。你可以选择:
- 跳过:跳过该命令,不运行。
- 添加 { runningCommandList} 到白名单:将该命令的前缀添加到白名单,之后可在沙箱外运行相关命令。
- 运行:本次在沙箱内运行该命令。