信任与安全
AI 生成的内容需要人工审查。Visual Studio Code 包含多种机制,确保您能够掌控进入代码库的更改。本文介绍了您应当了解的控制机制、AI 局限性以及安全考量。
保持掌控
智能体可以读取文件、编辑代码、运行终端命令并调用外部服务。VS Code 提供了多种机制,确保您始终掌控工作区中发生的一切。
-
应用前审查编辑内容。 智能体会在差异视图(diff view)中显示文件更改。您可以在保存前审查每一项更改、接受或拒绝个别编辑,并修改代码。了解更多关于审查代码编辑的内容。
-
使用检查点(checkpoints)回滚。 智能体会随着工作进度创建检查点。如果智能体的操作偏离了方向,您可以返回到之前的检查点并尝试不同的方法。了解更多关于检查点的内容。
-
批准工具调用。 在运行终端命令或使用具有副作用的工具之前,VS Code 会请求您的批准。您可以控制哪些工具可以自动运行,哪些需要确认。使用 Chat: Manage Tool Approval 命令可以集中管理所有工具的批准权限。
-
选择权限级别。 控制智能体的自主程度:默认批准(Default Approvals)要求对敏感工具进行确认;绕过批准(Bypass Approvals)自动批准所有工具调用;自动驾驶(Autopilot,预览版)还会自动回答问题并持续自主运行。对于更高程度的自主操作,建议结合智能体沙盒或容器使用。
-
信任边界。 VS Code 在文件访问、URL 访问、智能体沙盒和 MCP 服务器交互等方面强制执行安全边界。了解更多关于AI 安全的内容。
在提交代码前,务必审查 AI 生成的代码。请确认其处理了边界情况、遵循了项目约定,并且没有引入安全问题。
智能体沙盒(Agent sandboxing)
智能体沙盒目前处于预览阶段,未来可能会进一步演进。
智能体沙盒利用操作系统级的隔离技术,限制智能体在您的机器上能够访问的资源。沙盒不再仅仅依赖操作前的批准提示,而是由操作系统强制定义文件系统和网络访问的严格边界。
目前,VS Code 将沙盒应用于在智能体回话期间执行的终端命令(runInTerminal 智能体工具)。了解如何配置智能体沙盒。
启用沙盒后,VS Code 会自动批准命令和工具调用,而无需确认提示,因为它们已在受控环境中运行。
为什么沙盒很重要
基于批准的安全机制要求您在每个终端命令或工具调用运行前进行确认。虽然这提供了控制力,但存在实际局限性:
-
批准疲劳。 反复批准命令可能导致您减少对批准内容的关注,特别是在长时间的智能体回话中。
-
解析局限性。 自动批准规则使用尽力而为(best-effort)的命令解析,这存在已知局限性。Shell 别名、引号连接和复杂的 Shell 语法可能会绕过规则并不被察觉地执行。
-
提示词注入(Prompt injection)。 文件、工具输出或网页中的恶意内容可能试图诱骗智能体运行有害命令。如果您不仔细审查就批准,可能会导致意外的操作和安全风险。
-
对外部服务的意外操作。 即使没有恶意意图,拥有网络访问权限的智能体也可能代表您执行难以撤销的操作。例如,智能体可能会配置云资源、修改基础设施设置、将代码推送到远程仓库,或调用触发部署或财务交易的 API。网络隔离确保智能体只能访问您明确允许的域,从而降低对外部服务产生意外副作用的风险。
沙盒通过在操作系统级别强制执行边界来应对这些挑战。沙盒会阻止自动批准的命令访问受限范围之外的文件或网络资源。如果需要额外权限,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.enabled ... 设置为 on 时,所有出站网络访问都会被阻止,除非您明确允许特定域名。如果您既需要文件系统隔离又需要不受限制的网络访问,请将 ... 设置为 allowNetwork。在此模式下,命令可以自由访问外部服务,同时文件系统限制仍然适用。
VS Code 提供网络域名过滤功能,适用于智能体工具(提取工具、集成浏览器)和沙盒终端命令。启用 ... 以激活网络过滤。使用 ... 和 ... 来控制智能体可以访问哪些域名。了解如何配置网络访问。
-
域名白名单。 您可以明确允许访问特定域名。
注意智能体可以代表您在允许的域名上执行操作,不仅仅是读取数据。例如,允许
api.github.com意味着智能体可以创建 Pull Request 或修改仓库设置。允许云服务 API 域名可能导致云资源被修改。仅在绝对必要时配置此设置。此配置在设置中指定,并适用于所有智能体工具和沙盒命令,而不仅仅是当前任务。 -
继承限制。 所有子进程都会继承相同的网络限制,因此生成子进程的脚本或工具无法绕过网络规则。
操作系统级强制执行
智能体沙盒依赖于操作系统级的安全原语来强制执行文件系统和网络限制。由于执行发生在内核层面,沙盒进程及其所有子进程都无法绕过这些边界,即使命令被刻意构造以尝试绕过也不行。
| 平台 | 技术 | 先决条件 |
|---|---|---|
| macOS | macOS:苹果内置于操作系统中的沙盒框架("Seatbelt")。在内核级别强制执行细粒度的文件系统和网络限制。 | Windows:无。开箱即用。 |
| Linux 和 WSL2 | bubblewrap 用于文件系统隔离,socat 用于网络代理。 |
安装所需软件包:sudo apt-get install bubblewrap socat (Debian 和 Ubuntu) 或 sudo dnf install bubblewrap socat (Fedora)。 |
不支持 WSL 版本 1,因为 bubblewrap 需要仅在 WSL2 中可用的 Linux 内核特性(用户命名空间)。
目前 Windows 上的智能体沙盒支持使用 WSL2 作为底层平台。
沙盒不覆盖的范围
智能体沙盒仅适用于 Shell 子进程(终端命令)。它不覆盖内置的文件工具。智能体的读取、编辑和写入工具直接使用 VS Code 的权限系统,而不是通过沙盒运行。
设置 ... 为智能体工具(如提取工具和集成浏览器)提供网络域名过滤,这与沙盒无关。当沙盒和网络过滤同时启用时,网络规则将应用于所有智能体工具和终端命令。
如需完整的环境隔离,请将沙盒与开发容器(dev container)结合使用。开发容器为整个开发环境(包括所有工具、文件访问和网络访问)提供了完整的边界。
智能体沙盒目前处于预览阶段,并将持续演进以覆盖更多工具和场景。
需要注意的 AI 局限性
输出不正确。 模型生成的代码可能看起来正确,但包含 bug、使用过时的 API 或无法处理边界情况。请务必测试 AI 生成的代码,特别是涉及安全、数据完整性或关键流程的逻辑。
提示词注入。 文件、工具输出或网页中的恶意内容可能试图重定向智能体的行为。这就是 VS Code 包含工具批准门禁和信任边界的原因。了解更多关于AI 安全的内容。
将 AI 生成的内容视为初稿:作为起点很有用,但始终需要您的审查和判断。关于模型的工作原理(包括非确定性、知识边界和上下文限制),请参阅语言模型。