工作區信任擴充套件指南
什麼是工作區信任?
工作區信任是一項功能,旨在應對使用者在 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屬性自動以信任為基礎來控制工作區設定。
對於 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。
測試工作區信任
有關啟用和配置工作區信任的詳細資訊,請參閱工作區信任使用者指南。