信任与安全
AI 生成的输出需要人工审查。Visual Studio Code 包含多种机制,可让你掌控哪些更改会进入你的代码库。本文介绍了你应该了解的控制机制、AI 局限性和安全注意事项。
保持掌控
智能体可以读取文件、编辑代码、运行终端命令以及调用外部服务。VS Code 的信任模型分层了多个控制机制,确保你始终掌控进入代码库的内容
- 应用前审查。 所有文件更改都会显示在差异视图中,供你做出保留或撤销的决定,并且通过检查点,你可以回滚会话。
- 执行前批准。 具有副作用的工具和终端命令会提示进行批准,作用域可按会话、按工作区或按用户进行配置。
- 约束自主性。 权限级别决定了智能体自主运行的程度,从每次调用批准到完全自主的 Autopilot。
- 在操作系统级别强制执行边界。 智能体沙盒限制了终端命令的文件系统和网络访问,因此自动批准的操作无法超出定义的范围。
- 信任边界。 在授予工作区、扩展、MCP 服务器和网络域信任之前,VS Code 会向你发出提示。
有关这些控件的分步配置(审批规则、敏感文件保护、沙盒设置、组织策略),请参阅 VS Code 中的 AI 安全。
在提交之前,务必审查 AI 生成的代码。验证它是否处理了边界情况、遵循了你项目的规范,并且没有引入安全问题。
智能体沙盒
智能体沙盒目前处于预览阶段,未来可能会进一步演进。
智能体沙盒使用操作系统级别的隔离来限制智能体可以在你的机器上访问的内容。沙盒没有单纯依赖每个操作前的批准提示,而是为文件系统和网络访问定义了由操作系统本身强制执行的严格边界。
VS Code 将沙盒应用于在智能体会话期间执行的终端命令(runInTerminal 智能体工具),包括使用 VS Code 智能体终端集成的 Copilot CLI 智能体主机会话。了解如何配置智能体沙盒。
启用沙盒后,VS Code 会自动批准在沙盒中运行的终端命令,而无需确认提示,因为它们已经在受控环境中运行。
为什么沙盒很重要
基于批准的安全机制要求你在每个终端命令或工具调用运行之前进行确认。虽然这提供了控制力,但它有实际的局限性
-
批准疲劳。 重复批准命令可能会导致你对所批准的内容注意力下降,尤其是在漫长的智能体会话期间。
-
解析局限性。 自动批准规则使用尽力而为的命令解析,这具有已知的局限性。Shell 别名、引号拼接和复杂的 shell 语法可能会绕过规则并不被察觉地漏过。
-
提示词注入。 文件、工具输出或网页中的恶意内容可能会试图诱骗智能体运行有害命令。如果你未经仔细审查就批准了,可能会导致意想不到的操作和安全风险。
-
对外部服务的无意操作。 即使没有恶意,具有网络访问权限的智能体也可能代表你执行难以撤销的操作。例如,智能体可能会配置云资源、修改基础设施设置、将代码推送到远程仓库,或者调用触发部署或金融交易的 API。网络隔离确保智能体只能访问你明确允许的域,从而降低对外部服务产生意外副作用的风险。
沙盒通过在操作系统级别强制执行边界来应对这些挑战。沙盒可防止自动批准的命令访问允许范围之外的文件或网络资源。如果需要额外的权限,VS Code 会提示你在沙盒之外运行该命令。你可以配置 VS Code 在显示该提权提示之前,先在沙盒内尝试该命令。
沙盒是如何工作的
沙盒强制执行两种类型的隔离:文件系统访问和网络访问。两者都应用于操作系统级别,并且无法被在沙盒内部运行的命令绕过。
文件系统隔离
如果没有文件系统隔离,受到攻击的命令可能会修改你机器上的任何文件,例如,将恶意代码注入你的 shell 配置文件(~/.bashrc、~/.zshrc)或从 ~/.ssh/ 读取 SSH 密钥。文件系统隔离通过限制对明确允许的路径的访问来防止这种情况发生。
-
默认行为。 允许对工作区文件夹和沙盒运行时临时文件夹进行读取访问。默认情况下拒绝从你的主目录(
$HOME)进行读取,以保护诸如 SSH 密钥、shell 配置和凭据等敏感文件。写入访问权限仅限于当前工作目录及其子目录。当发出需要额外权限的请求时,VS Code 会提示你允许在沙盒之外运行该命令。
-
每个命令的读取路径。 在命令运行之前,VS Code 会对其进行解析,并授予对该命令所需的特定路径的读取访问权限。这涵盖了常见的开发人员工作流,例如
git、node、npm、dotnet、Java 和 Rust。例如,运行node命令会自动允许从 Node 版本管理器目录进行读取,运行git命令允许从~/.gitconfig进行读取。 -
可配置规则。 你可以授予对其他路径的读取或写入访问权限,或者拒绝访问特定路径。拒绝规则始终优先于允许规则。
-
继承的限制。 由沙盒命令派生的所有子进程都继承相同的文件系统边界。这意味着像
npm、pip或构建脚本这样的工具也会受到限制。
网络隔离
如果没有网络隔离,受到攻击的命令可能会窃取敏感数据,或者对外部服务执行意想不到的操作。网络隔离通过默认阻止所有出站连接来防止这种情况。
沙盒启用和不受限制的网络访问是两项独立的控制。当启用沙盒且 chat.agent.sandbox.allowNetwork 此设置可由您的组织管理。请联系您的管理员进行更改。 关闭时,除非你明确允许特定域,否则所有出站网络访问都会被阻止。当 chat.agent.sandbox.allowNetwork 此设置可由您的组织管理。请联系您的管理员进行更改。 开启时,命令可以自由访问外部服务,同时文件系统限制仍然适用。在 macOS 和 Linux 上, chat.agent.sandbox.enabled 此设置可由您的组织管理。请联系您的管理员进行更改。 控制是否启用沙盒,接受 off(默认)或 on。
VS Code 提供网络域过滤功能,该功能同时适用于智能体工具(fetch 工具、集成浏览器)和沙盒终端命令。启用 chat.agent.networkFilter 此设置可由您的组织管理。请联系您的管理员进行更改。 以激活网络过滤。使用 chat.agent.allowedNetworkDomains 此设置可由您的组织管理。请联系您的管理员进行更改。 和 chat.agent.deniedNetworkDomains 此设置可由您的组织管理。请联系您的管理员进行更改。 来控制智能体可以访问哪些域。了解如何配置网络访问。
-
通过网络访问重试。 当沙盒命令被网络限制阻止时,智能体会首先请求确认,以便在沙盒内以不受限制的网络访问权限进行重试,然后再回退到在沙盒之外运行该命令。
-
域白名单。 你可以明确允许访问特定域。
注意智能体可以代表你在允许的域上执行操作,而不仅是读取数据。例如,允许
api.github.com意味着智能体可以创建拉取请求或修改仓库设置。允许云服务 API 域可能会导致云资源被修改。仅在绝对必要时才配置此设置。此配置在设置中指定,并适用于所有智能体工具和沙盒命令,而不仅仅是当前任务。 -
继承的限制。 所有子进程都继承相同的网络限制,因此派生子进程的脚本或工具无法绕过网络规则。
操作系统级强制执行
智能体沙盒依靠操作系统级安全原语来强制执行文件系统和网络限制。由于强制执行发生在内核级别,因此沙盒进程及其所有子进程无法绕过这些边界,即使命令经过精心设计企图绕过也不行。
| 平台 | 技术 | 前提条件 |
|---|---|---|
| macOS | 苹果内置于操作系统中的沙盒框架(“Seatbelt”)。在内核级别强制执行细粒度的文件系统和网络限制。 | 无。开箱即用。 |
| Linux 和 WSL2 | 用于文件系统隔离的 bubblewrap 以及用于网络代理的 socat。 |
安装所需的软件包:sudo apt-get install bubblewrap socat(Debian 和 Ubuntu)或 sudo dnf install bubblewrap socat(Fedora)。 |
不支持 WSL 版本 1,因为 bubblewrap 需要仅在 WSL2 中可用的 Linux 内核功能(用户命名空间)。
沙盒未涵盖的内容
智能体沙盒适用于 shell 子进程,包括来自 VS Code 智能体会话和 Copilot CLI 智能体主机会话的终端命令。它不涵盖内置的文件工具。智能体的读取、编辑和写入工具直接使用 VS Code 的权限系统,而不是通过沙盒运行。
chat.agent.networkFilter 此设置可由您的组织管理。请联系您的管理员进行更改。 设置为诸如 fetch 工具和集成浏览器等智能体工具提供网络域过滤功能,独立于沙盒。当同时启用沙盒和网络过滤时,网络规则适用于所有智能体工具和终端命令。
要实现完全的环境隔离,可将沙盒与开发容器结合使用。开发容器为整个开发环境提供了一个完整的边界,包括所有工具、文件访问和网络访问。
智能体沙盒目前处于预览阶段,并将持续演进以涵盖更多的工具和场景。
需要注意的 AI 局限性
输出不正确。 模型可能会生成看似正确但包含错误、使用已弃用 API 或未处理边界情况的代码。务必测试 AI 生成的代码,特别是对于影响安全性、数据完整性或关键流程的逻辑。
提示词注入。 文件、工具输出或网页中的恶意内容可能会试图重定向智能体的行为。这就是为什么 VS Code 包含工具审批关卡和信任边界的原因。了解有关AI 安全的更多信息。
将 AI 生成的输出视为初稿:作为起点很有用,但始终需要你的审查和判断。有关模型工作原理的更多信息(包括非确定性、知识边界和上下文限制),请参阅语言模型。