工作区信任扩展指南

什么是工作区信任?

工作区信任是一项功能,旨在防范用户在 VS Code 中打开工作区时因意外代码执行而带来的安全风险。例如,考虑某个语言扩展为了提供功能,可能会执行当前加载的工作区中的代码。在这种情况下,用户应信任工作区的内容并非恶意。工作区信任将此决策集中在 VS Code 中,并支持受限模式来防止自动代码执行,从而使扩展作者无需自行处理此基础架构。VS Code 提供了静态声明和 API 支持,以便快速接入扩展,而无需在各个扩展之间复制代码。

接入

静态声明

在你的扩展的 package.json 中,VS Code 支持以下新的 capabilities 属性 untrustedWorkspaces

capabilities:
  untrustedWorkspaces:
    { supported: true } |
    { supported: false, description: string } |
    { supported: 'limited', description: string, restrictedConfigurations?: string[] }

对于 supported 属性,接受以下值:

  • true - 扩展在受限模式下完全受支持,因为它不需要“工作区信任”来执行任何功能。它将完全像以前一样启用。
  • false - 扩展在受限模式下不受支持,因为它在没有“工作区信任”的情况下无法运行。在授予“工作区信任”之前,它将保持禁用状态。
  • 'limited' - 扩展的一些功能在受限模式下受支持。在授予工作区信任之前,应禁用对信任敏感的功能。扩展可以使用 VS Code API 来隐藏或禁用这些功能。可以使用 restrictedConfigurations 属性通过信任自动限制工作区设置。

对于 description 属性,必须提供需要信任的原因说明,以帮助用户了解在授予或拒绝“工作区信任”之前,哪些功能将被禁用,或者他们应该审查什么。如果 supported 设置为 true,则会忽略此属性。

description 属性的值应添加至 package.nls.json,然后在 package.json 文件中进行引用以支持本地化。

restrictedConfigurations 属性接收配置设置 ID 的数组。对于列出的设置,当处于不受信任工作区的受限模式时,扩展将不会获得工作区定义的值。

如何支持受限模式?

为了帮助扩展作者了解“工作区信任”的范围以及受限模式下哪些类型的功能是安全的,以下是需要考虑的一些问题。

我的扩展有主入口点吗?

如果扩展没有 main 入口点(例如主题和语言语法),则该扩展不需要“工作区信任”。扩展作者无需对此类扩展采取任何操作,因为无论工作区是否受信任,它们都将继续正常运行。

我的扩展是否依赖打开的工作区中的文件来提供功能?

这可能意味着诸如可由工作区设置的配置或工作区中的实际代码之类的内容。如果扩展从不使用工作区的任何内容,它可能不需要信任。否则,请查看其他问题。

我的扩展是否将工作区的任何内容视为代码?

最常见的例子是使用项目的工作区依赖项,例如存储在本地工作区中的 Node.js 模块。恶意工作区可能会检入该模块受损的版本。因此,这对用户和扩展来说是一个安全风险。此外,扩展可能依赖于 JavaScript 或其他控制扩展或其他模块行为的配置文件。还有许多其他例子,例如执行打开的代码文件以确定其输出用于错误报告。

我的扩展是否使用了可在工作区中定义并决定代码执行的设置?

你的扩展可能会将设置值用作你的扩展执行的 CLI 的标志。如果这些设置被恶意工作区覆盖,它们可能会被用作针对你的扩展的攻击向量。另一方面,如果设置的值仅用于检测某些条件,则它可能不构成安全风险,并且不需要“工作区信任”。例如,扩展可能会检查首选 shell 设置的值是 bash 还是 pwsh 以确定要显示什么文档。下面的配置 (settings)部分提供了关于设置的指导,可帮助你为扩展找到最佳配置。

这并不是可能需要“工作区信任”的情况的完整列表。随着我们审查更多扩展,我们将更新此列表。在考虑“工作区信任”时,请使用此列表来思考你的扩展可能执行的类似行为。

如果我不对扩展做任何更改会怎么样?

如上所述,未在其 package.json 中贡献任何内容的扩展将被视为不支持“工作区信任”。当工作区处于受限模式时,它将被禁用,并且会通知用户由于“工作区信任”,某些扩展无法正常工作。对于用户而言,此措施是最注重安全的方法。尽管这是默认设置,但最佳做法是设置适当的值,以表明作为扩展作者,你已努力保护用户和你的扩展免受恶意工作区内容的侵害。

工作区信任 API

如上所述,使用 API 的第一步是将静态声明添加到你的 package.json 中。最简单的接入方法是为 supported 属性使用 false 值。再说一次,即使你什么都不做,这也是默认行为,但它向用户发出了一个很好的信号,表明你做出了刻意的选择。在这种情况下,你的扩展不需要做任何其他事情。在授予信任之前,它不会被激活,然后你的扩展将知道它是在得到用户同意的情况下执行的。但是,如果你的扩展仅对其部分功能需要信任,这可能不是最佳选择。

对于希望根据“工作区信任”来限制其功能的扩展,它们应该为 supported 属性使用 'limited' 值,并且 VS Code 提供了以下 API

export namespace workspace {
  /**
   * When true, the user has explicitly trusted the contents of the workspace.
   */
  export const isTrusted: boolean;

  /**
   * Event that fires when the current workspace has been trusted.
   */
  export const onDidGrantWorkspaceTrust: Event<void>;
}

使用 isTrusted 属性来确定当前工作区是否受信任,并使用 onDidGrantWorkspaceTrust 事件来监听何时已授予工作区信任。你可以使用此 API 阻止特定的代码路径,并在工作区受信后执行任何必要的注册。

VS Code 还公开了一个上下文键 isWorkspaceTrusted,用于如下所述的 when 子句中。

贡献点

命令、视图或其他 UI

当用户未信任工作区时,他们将在受限模式下运行,其功能受限,主要用于浏览代码。你在受限模式下禁用的任何功能都应对用户隐藏。这可以通过when 子句上下文和上下文键 isWorkspaceTrusted 来完成。即使某个命令未显示在 UI 中,它仍然可以被调用,因此你应该根据上述 API 在扩展代码中阻止执行或不注册命令。

配置 (settings)

首先,你应该审查你的设置,以确定它们是否需要考虑信任。如上所述,工作区可能会为你的扩展所消费的设置定义一个对用户有害的值。如果你发现存在漏洞的设置,你应该为 supported 属性使用 'limited',并在 restrictedConfigurations 数组中列出该设置 ID。

当你将设置 ID 添加到 restrictedConfigurations 数组时,VS Code 将在受限模式下仅返回该设置的用户定义值。然后,你的扩展不需要进行任何额外的代码更改来处理该设置。当授予信任时,除了“工作区信任”事件外,还将触发配置更改事件。

调试扩展

VS Code 会在受限模式下阻止调试。因此,调试扩展通常不需要请求信任,并且应为 supported 属性选择 true。但是,如果你的扩展提供了不属于内置调试流程的附加功能、命令或设置,则应使用 'limited' 并遵循上述指导。

任务提供程序

与调试类似,VS Code 会阻止在受限模式下运行任务。如果你的扩展提供了不属于内置任务流程的附加功能、命令或设置,则应使用 'limited' 并遵循上述指导。否则,你可以指定 supported: true

测试工作区信任

有关启用和配置“工作区信任”的详细信息,请参阅工作区信任用户指南

English 한국어 中文(简体) 中文(繁體)
© . This website operates independently and is not affiliated with or endorsed by Microsoft. All brand names, logos, and trademarks are the property of their respective owners.