工作区信任扩展指南

什么是工作区信任?

工作区信任是一项旨在解决用户在 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,以确定显示什么文档。下方的配置 (设置)部分提供了有关设置的指导,以帮助您为扩展找到最佳配置。

这并不是可能需要工作区信任的案例的详尽列表。随着我们审查更多的扩展,我们将更新此列表。在考虑工作区信任时,请使用此列表思考您的扩展可能存在的类似行为。

如果我不对扩展进行任何更改会怎样?

如上所述,不在 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 在扩展代码中阻止执行或不注册命令。

配置 (设置)

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

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

调试扩展

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

任务提供程序

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

测试工作区信任

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

© . This site is unofficial and not affiliated with Microsoft.