在 VS Code 中试试

工作区信任

2021 年 7 月 6 日,作者 Chris Dias,@chrisdias

我能相信自己吗?自 1.57 版更新以来,这是许多 Visual Studio Code 用户面临的哲学问题。

Social image of two versions of Spider-Man pointing at each other

虽然我们无法替您回答这个问题,但我们可以告诉您更多关于我们为何引入工作区信任概念的原因。

但首先,先介绍一点背景知识。

猫和键盘,以及害群之马

互联网上充满了令人愉快的事物,比如猫咪在键盘上打字的视频。

对于开发人员而言,互联网上也充满了由好心人构建的工具、包和开源项目,他们希望帮助您解决您已为此工作数小时的问题。VS Code 等开发工具集成了包管理器、代码 Linter、任务运行器、打包器等,以提供愉快的体验,充分利用不断发展的社区中最新、最伟大的进步力量。

然而,这个丰富生态系统所带来的生产力,往往是我们广泛访问开发机器的结果。再结合快速演进、病毒式传播和消费,开发工具成为了一个有吸引力的攻击目标,特别是考虑到攻击者可以利用我们的机器进一步传播攻击(例如,通过存储在开发机器上的认证令牌,甚至通过开发人员编写的软件)。

成为一名开发人员是很有价值的,但它也是一项有风险的工作。要为一个项目做出贡献,您本质上需要信任其作者,因为运行 npm installmake、构建 Java 或 C# 项目、自动化测试或调试等活动,都意味着项目中的代码正在您的计算机上执行。

我们推出 工作区信任 功能的目标是找到正确的平衡点,既能防范少数“害群之马”破坏所有人的体验,又能继续确保我们能拥有让开发变得如此有趣的所有美好事物。

嘿,它只是一个编辑器,对吧?

Twitter comment complaining about Workspace Trust

是的,VS Code 是一个编辑器。然而,像大多数现代编辑器一样,它能够代表您运行工作区中的代码,以提供更丰富的开发体验。

运行和调试代码是显而易见的例子。不那么明显的代码执行可能是 preLaunchTask,它在启动应用程序之前运行,并且可以运行一个构建,其中包含一个与构建无关的额外任务执行任意代码。还有那个窃取您加密钱包私钥的 npm 模块呢?一个简单的编辑操作,一个恶意的 Linter 就会从 node_modules 文件夹加载,而不是全局安装的那个。即使是阅读代码也可能具有欺骗性,攻击者可以使用 Unicode 技巧隐藏恶意代码于明处。甚至,您甚至不必打开任何源代码就可能被控制

此处的意图并非要让您远离所有出色的工具(包括 VS Code)或让您改变职业。它旨在提高人们的意识,即当您从互联网下载与您没有任何信任关系的个人或组织编写的代码时,存在许多攻击机会。

打地鼠

在上述所有场景中,工具都按其设计运行,并且在非恶意代码库中,它们都非常高效。设置 preLaunchTask 以在调试前构建应用程序可以大大节省时间,因为您不必在每次更改后都从终端手动构建它。Linter 具有高度可定制性,以支持每个团队的首选编码指南和样式(是的,制表符与空格)。预提交钩子让您可以检查是否遗漏了什么,或者确保在提交前运行测试。

现在,您不太可能同时遭受所有这些攻击。事实上,目前(尚未)通过 VS Code 发生过漏洞利用,因为有一个优秀的专家社区,每当出现新的机会时,他们都会提醒我们。在工作区信任出现之前,我们的方法是在漏洞点通过局部权限提示来解决每个场景。

例如,Jupyter 扩展会警告用户,当您在 Notebook 中打开可视化工具时,嵌入的 JavaScript 可能会运行

Jupyter Notebook security warning

ESLint 漏洞是一个大麻烦,因为它在工作区加载时运行(这是我们第一次出现模态对话框)。

ESLint extension security warning

事实证明,这是一场没有尽头的战斗。用户会被多个(且略有不同)的权限提示打断,而这些提示并不适用于整个工作区。我信任你、你、你、你、不信任你、还有你,但仅限周二。对我们而言,这就像一场持续的打地鼠游戏,每当一个漏洞暴露时,就再弹出一个提示来堵住它。

因此,我们在构建 VS Code 时遵循的模式之一是,查看工具和扩展中哪些体验以类似但非一致的方式实现,并尝试将其整合到核心中。信任提示就遵循了这种模式,因此我们决定构建一种工具和扩展都可以利用的体验和 API,并(希望)提供更清晰的用户体验。

信任

现在您了解了代码在您不知情的情况下运行的各种方式,希望您能更好地理解我们为什么要事先提出这个问题。

Do you trust the authors notification

我们特别询问您是否信任此工作区的作者,因为 VS Code 无法判断代码是否恶意(嘿,我们只知道 1 和 0),它来自哪里,您是否打算为项目贡献等。

另一方面,您很聪明,您知道代码来自哪里:您自己(好的),您的公司(可能没问题),您的朋友 Kai(看情况),或者互联网上的某个随机陌生人(绝对不行)。

这些知识有助于使工具更智能。如果您信任作者,太棒了!工具和扩展程序获得了绿灯,可以做它们的事情并提供神奇的体验,我们不会再打扰您。

如果您不信任,您就是在告诉我们:VS Code,请小心,不要执行任何代码。这就是我们所说的**受限模式**,在这种模式下,潜在的有害功能被禁用,以便您可以更安全地浏览代码,并最终做出明智的决定。

但是那个对话框!

我们听到了,模态对话框很大,而且除非您采取行动进行配置,否则每次打开新文件夹时都会弹出。

我们最初并不是这样设计的。我们审视了 ESLint 模态对话框的传奇,并问自己是否可以提供一种非阻塞的体验,使用视觉线索和单个通知提示,并尽可能延迟。我们希望不引人注目,在受限模式下启动(在您几乎没有察觉的情况下),并在最后一刻提示信任。

我们引入了一个“被动”信任通知,您可以在其中告诉我们是否信任该工作区。我们循环尝试了各种 UI 处理方式来表示工作区不受信任,包括增强设置齿轮图标和引入新的安全图标。

Several early versions of a security icons and badges

如果您使用 Insiders 版本,您将获得 VS Code 中新体验的最新迭代,就像我们正在谈论的工作区信任一样。Insiders 每天都会发布,我们用它来构建 VS Code。

其想法是用户(您!)可以**自主决定**何时授予或拒绝工作区的信任。当工具或扩展真正需要访问权限时,我们才会弹出一个通知,询问您是否信任该工作区

Workspace Trust required prompt

现在,我确信你们中的许多人会同意,VS Code 遭受了我们所谓的“通知疲劳症”的困扰(我保证我们正在努力解决 😊)。在我们的测试中,我们发现人们只是简单地忽略了通知。用户没有看到齿轮图标上的通知,甚至没有看到新的安全图标。使用数据显示,通过被动通知授予信任的比例非常低。在用户研究中,我们看到人们花费所有时间认为他们弄坏了什么,然后花费时间进行故障排除,试图恢复到他们预期的状态。

我们原本打算不引人注目并尽可能延迟,但现实是,在受限模式下,产品感觉出了问题,人们认为这是他们的错。这对我们双方都不是一个好境地。

掌控权在你手中

信任一个文件夹的决定对 VS Code 的功能有着根本性的影响,因此经过所有研究,我们决定最正确的方法是在您尝试打开文件夹时立即提出信任问题。因为模态对话框具有干扰性,我们尝试通过使对话框功能强大来平衡这一点,以便您可以回答几个问题,最终在日常工作中更少地看到提示。

通过我们内部的“狗食”(dogfooding)以及对其他开发人员的采访,我们发现人们通常有一个主要的文件夹,他们将所有来源都放在其中并认为它是值得信任的。因此,我们添加了直接从对话框中信任**父**文件夹的功能。您可以一键信任它及其所有子文件夹,然后您就不会再看到信任提示了。

Trust parent folder checkbox

工作区信任编辑器

工作区信任编辑器让您对信任内容拥有更多控制权,并将在 1.58 版本中进行更新,使其更易于配置该功能以满足您的需求。

而且,由于您可以自定义行为,因此有多种方法可以进入信任编辑器 😊。点击**受限模式**状态栏消息、受限模式横幅中的**管理**链接、齿轮菜单,或打开命令面板(F1)并使用**工作区:管理工作区信任**命令。

在工作区信任编辑器中,您可以信任当前文件夹、父文件夹(及其所有子文件夹),以及机器上的任何文件夹。

Workspace Trust editor with annotations

您还可以快速跳转到所有工作区信任设置,以微调体验。

Workspace Trust settings via @tag:workspaceTrust

我们如何使用工作区信任

没有人喜欢使用牙线,但我们仍然会这样做,因为我们知道这是正确的做法。没有人愿意考虑安全性,但我们也知道这是正确的做法。通过自定义体验,您可以保持愉快的开发体验,同时保护自己免受开发固有的威胁(使用牙线很有趣?!)。

VS Code 团队的大多数人都是从一个顶级文件夹开始工作,他们将信任的源代码放在其中。例如,在我的 Mac 上,我将从 GitHub 上的 Microsoft 组织拉取的所有源代码都放在我的 ~/src 文件夹中。我将 ~/src 指定为受信任的文件夹,其下的所有内容都固有地受信任。当我打开 ~/src/vscode~src/vscode-docker 等时,它们都会以完全信任的方式打开,因为我信任我的组织编写和使用的代码。

我有一个单独的文件夹,名为 ~/scratch(“草稿”的缩写,您显然可以随意命名),我把所有其他东西都放在那里,并默认认为它不受信任。然后,我逐个文件夹地做出信任决定。

为了简化我的工作流程,我将 "security.workspace.trust.startupPrompt" 设置为 "never"

Workspace Trust Startup Prompt setting as never

有了这个设置,我就不会收到模态对话框的提示,工作区会直接在受限模式下打开。我已经决定 ~src/scratch 文件夹不受信任,所以每次我打开一个子文件夹时,都没有必要提示我。如果我决定信任我正在阅读或编写的代码,我可以通过两次快速点击(VS Code 顶部的受限模式通知,然后是信任按钮)在文件夹上启用它。

在我的 Windows 机器上,事情稍微有趣一些。我通常在 Windows Subsystem for Linux (WSL) 上运行的 Ubuntu 镜像中工作,使用 WSL 扩展。我信任 Linux 上的 ~/src 文件夹,并且信任 Windows 侧的 d:\src 文件夹。

Trust Folders & Workspaces list with WSL trusted folders

团队中的一些人更进一步,甚至关闭了顶部的受限模式横幅("security.workspace.trust.banner": "never"),只保留了状态栏通知。对我来说这太过分了,顶部的横幅让我保持警惕,并提醒我在从互联网上拉取内容时要保持警惕。

开源很棒

我们知道 VS Code 是您完成“实际”工作的工具,我们引入的任何障碍或阻碍只会减慢您构建和发布下一个独角兽的速度。许多人花时间在 Twitter、Reddit 和 issue 中联系我们,我们感谢您的坦率反馈。我们根据您的意见在 1.58 版本中进行了多项修复和改进,并期待继续对话。

展望未来,我们希望帮助扩展作者避免任意代码执行,并在受限模式下提供更多功能。我们的路线图记录了我们与 Visual Studio Marketplace 团队合作,为扩展生态系统带来额外安全性(我们称之为“受信任扩展”)的工作,包括经过验证的发布者、签名和平台特定扩展。简而言之,您可以将工作区信任视为帮助良好扩展做出良好决策。受信任扩展将帮助您防御恶意扩展。

开放构建 VS Code 的好处之一是社区可以帮助我们创造最佳体验。因此,请告诉我们如何改进流程,帮助您在尽可能不显眼的情况下保持安全。请(礼貌地!)在现有问题上发表评论,提交新问题,或在 Twitter 上@我们@code,我们正在倾听!

谢谢,

Chris 和 VS Code 团队

快乐编码(安全地)!