工作區信任擴充套件指南
什麼是工作區信任?
工作區信任是一項功能,旨在解決使用者在 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'
,並在restrictedConfigurations
陣列中列出設定 ID。
當您將設定 ID 新增到restrictedConfigurations
陣列時,VS Code 將僅在受限模式下返回設定的使用者定義值。然後您的擴充套件不需要進行任何額外的程式碼更改來處理設定。當授予信任時,除了工作區信任事件之外,還將觸發配置更改事件。
除錯擴充套件
VS Code 將阻止在受限模式下進行除錯。因此,除錯擴充套件通常不需要信任,並且應為supported
屬性選擇true
。但是,如果您的擴充套件提供了不屬於內建除錯流的額外功能、命令或設定,則應使用'limited'
並遵循上述指導。
任務提供程式
與除錯類似,VS Code 會阻止在受限模式下執行任務。如果您的擴充套件提供了不屬於內建任務流的額外功能、命令或設定,則應使用'limited'
並遵循上述指導。否則,您可以指定supported: true
。
測試工作區信任
有關啟用和配置工作區信任的詳細資訊,請參閱工作區信任使用者指南。