工作区信任扩展指南
什么是工作区信任?
工作区信任是一项功能,旨在应对用户在 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'- 该扩展的某些功能在受限模式下受支持。信任敏感功能应保持禁用状态,直到授予工作区信任。可以通过restrictedConfigurations属性自动限制工作区设置。扩展可以使用 VS Code API 来隐藏或禁用这些功能。
对于 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',并在 restrictedConfigurations 数组中列出该设置 ID。
当您将设置 ID 添加到 restrictedConfigurations 数组时,VS Code 在受限模式下只会返回用户定义的该设置值。您的扩展随后无需进行任何额外的代码更改即可处理该设置。当授予信任时,除了工作区信任事件之外,还会触发一个配置更改事件。
调试扩展
VS Code 会阻止在受限模式下进行调试。因此,调试扩展通常不需要要求信任,并且应为 supported 属性选择 true。但是,如果您的扩展提供了内置调试流程之外的附加功能、命令或设置,您应该使用 'limited' 并遵循上述指南。
任务提供程序
与调试类似,VS Code 会阻止在受限模式下运行任务。如果您的扩展提供了内置任务流程之外的附加功能、命令或设置,您应该使用 'limited' 并遵循上述指南。否则,您可以指定 supported: true。
测试工作区信任
有关启用和配置工作区信任的详细信息,请参阅工作区信任用户指南。