Workspace Trustとは

Workspace TrustはVSCode 1.57で追加されたセキュリティ機能である。フォルダを開いただけでVSCodeや拡張機能がプロジェクト内のコードを勝手に実行してしまう事態を防ぐ。

たとえばフォーマッタやリンタの拡張機能は、ワークスペース内の設定ファイルを読み込んで、そこに書かれたパスの実行ファイルを起動する。悪意のあるリポジトリをクローンして開いただけで、任意のコマンドが動いてしまう危険もある。Workspace Trustは、ユーザーがフォルダを信頼するまでコードを実行する機能を止めておく仕組みである。

信頼していないフォルダは「制限モード(Restricted Mode)」で開かれる。ファイルの閲覧と編集は制限モードでも可能である。

制限モードで無効になる機能

制限モードでは以下が無効または制限される。

対象制限モードでの挙動
ターミナル開こうとすると信頼を求めるダイアログが表示される
タスク実行しようとすると信頼を求めるダイアログが表示される
デバッグ開始しようとすると信頼を求めるダイアログが表示される
AIエージェント利用できない
ワークスペース設定実行に関わる設定が無視される
拡張機能対応を宣言していない拡張機能は無効化される

同梱の拡張機能も無効になる

VSCodeに同梱されている拡張機能もWorkspace Trustの対象である。制限モードではGit連携とTypeScript/JavaScriptの言語機能が止まる。

同梱の拡張機能制限モードでの扱い
Git無効。ソース管理ビューにプロバイダーが表示されない
TypeScript and JavaScript Language Features無効。補完や定義ジャンプが効かない
Markdown Language Features機能制限。markdown.stylesが無効
PHP Language Features機能制限。php.validate.executablePathが無効

ファイルの閲覧と編集はできるが、言語機能まで含めて普段どおり作業するには信頼を与える必要がある。

無視されるワークスペース設定

.vscode/settings.jsonに書かれた設定のうち、コマンド実行やネットワークに関わるものは制限モードで無視される。VSCode本体では次のような設定が対象である。

設定内容
terminal.integrated.env.osx(linux/windows)ターミナルに渡す環境変数
terminal.integrated.defaultProfile.osx(linux/windows)既定のシェル
terminal.integrated.profiles.osx(linux/windows)シェルのプロファイル定義
terminal.integrated.automationProfile.osx(linux/windows)タスクとデバッグが使うシェル
terminal.integrated.cwdターミナルの作業ディレクトリ
terminal.integrated.shellIntegration.enabledシェル統合スクリプトの注入

たとえばリポジトリの.vscode/settings.jsonterminal.integrated.defaultProfile.osxに細工したシェルを指定していても、制限モードでは適用されない。

ワークスペース設定が無視された場合、設定エディタに警告が表示される。無視された設定の一覧は後述のワークスペース信頼エディタからも確認できる。

信頼を与える

バナーとステータスバーから信頼する

信頼していないフォルダを開くと、エディタ上部にバナーが表示される。バナーには案内文「すべての機能を有効にするには、このフォルダーを信頼します」と「管理」ボタンが並ぶ。ステータスバーには「制限モード」と表示される。

制限モードのバナーとステータスバー

バナーの「管理」かステータスバーの「制限モード」をクリックすると、ワークスペース信頼エディタが開く。信頼した場合と信頼しない場合の違いが並べて表示される。

ワークスペース信頼エディタ

「信頼する」ボタンを押すとフォルダが信頼され、無効化されていた拡張機能が有効になる。逆に信頼を取り消した場合は、拡張機能ホストが再起動する。

コマンドパレット(Cmd+Shift+PまたはCtrl+Shift+P)から「Workspaces: Manage Workspace Trust」(日本語UIでは「ワークスペースの信頼を管理」)を実行しても同じエディタが開く。

起動時にダイアログで確認する

VSCode 1.126でsecurity.workspace.trust.startupPromptのデフォルトがonceからneverに変わった。以前は未知のフォルダを開くと作成者を信頼するかどうかを尋ねるダイアログが最初に表示された。現在は制限モードで開いてバナーを出すだけである。内容を確認してから信頼を判断できる。

従来どおり起動時にダイアログで確認するにはonceに戻す。

{
  "security.workspace.trust.startupPrompt": "once"
}

信頼済みフォルダーを管理する

ワークスペース信頼エディタの「信頼済みフォルダーとワークスペース」に、信頼したフォルダの一覧が表示される。一覧のフォルダは追加、編集、削除ができる。現在のフォルダに信頼を与えているエントリは太字で表示される。親フォルダから継承している場合は親フォルダのエントリが太字になる。

信頼はサブフォルダに継承される。~/work/trustedを一覧に追加しておけば、配下にクローンしたリポジトリはすべて信頼済みとして開かれる。信頼するリポジトリと評価目的のリポジトリを別のディレクトリに分けておくと管理しやすい。

~/work
├── trusted        # 信頼済みフォルダーに登録する
└── sandbox        # 登録せず制限モードで開く

親フォルダから信頼が継承されている場合、ワークスペース信頼エディタに「信頼しない」ボタンは表示されない。信頼を外すには一覧から親フォルダのエントリを削除する。

なおVSCode 1.126で、ワークスペース信頼エディタから親フォルダを信頼するボタン(Trust Parent)は削除された。広い範囲を意図せず信頼する事故を防ぐためである。親フォルダを信頼する場合は一覧に手動で追加する。

設定一覧

Workspace Trustの挙動はsecurity.workspace.trust.*で制御する。いずれもユーザー設定でのみ指定できる。

設定デフォルト内容
security.workspace.trust.enabledtrueWorkspace Trust自体の有効と無効
security.workspace.trust.startupPromptnever起動時に信頼を確認するタイミング(always/once/never
security.workspace.trust.banneruntilDismissed制限モードのバナーを表示するタイミング(always/untilDismissed/never
security.workspace.trust.untrustedFilesprompt信頼済みワークスペースで信頼していないファイルを開くときの扱い(prompt/open/newWindow
security.workspace.trust.emptyWindowtrueフォルダを開いていない空のウィンドウを信頼するか

バナーが邪魔な場合はbannerneverにする。制限モード自体は維持されるため、ステータスバーの「制限モード」から信頼を与えられる。

{
  "security.workspace.trust.banner": "never"
}

untrustedFilesは、信頼済みのフォルダを開いた状態で外部のファイルをドラッグアンドドロップしたときなどに効く。newWindowにすると確認なしで別ウィンドウの制限モードで開く。emptyWindowで信頼される空のウィンドウにファイルを開く場合にも適用される。

拡張機能の対応状況

拡張機能はpackage.jsoncapabilities.untrustedWorkspacesで制限モードへの対応を宣言する。値は3種類である。

宣言制限モードでの扱い
"supported": true通常どおり動作する
"supported": "limited"信頼が必要な機能を無効にしたうえで動作する
"supported": false無効化される

宣言がない拡張機能はfalseとして扱われ、制限モードでは無効化される。ただしコードを持たない拡張機能(テーマ、スニペット、言語パックなど)は信頼と無関係に動作する。

limitedの拡張機能はrestrictedConfigurationsに設定IDを列挙する。列挙された設定は、制限モードではワークスペース設定の値が拡張機能に渡されない。次は実際の拡張機能の例である。

拡張機能宣言ワークスペース設定の値が渡されない設定の例
Language Support for Javalimitedjava.jdt.ls.java.homejava.jdt.ls.vmargs
Prettierlimitedprettier.prettierPathprettier.resolveGlobalModules
Maven for Javalimitedmaven.executable.pathmaven.terminal.customEnv
ESLintfalse(拡張機能ごと無効化)
Gofalse(拡張機能ごと無効化)

いずれも実行ファイルのパスやJVMの起動引数など、任意のコマンド実行につながる設定である。

拡張機能ビューでは、無効化された拡張機能が「制限モードで無効になっています」、機能制限された拡張機能が「制限モードで制限されています」の見出しにまとめられる。ワークスペース信頼エディタにも同じ一覧が出る。

拡張機能ビューの検索ボックスに次のフィルタを入力しても絞り込める。

フィルタ対象
@workspaceUnsupported:untrusted制限モードで無効になる拡張機能
@workspaceUnsupported:untrustedPartial制限モードで機能制限される拡張機能

拡張機能の判定を上書きする

extensions.supportUntrustedWorkspacesで拡張機能ごとの判定を上書きできる。ユーザー設定でのみ指定できる。

{
  "extensions.supportUntrustedWorkspaces": {
    "dbaeumer.vscode-eslint": {
      "supported": true,
      "version": "3.0.34"
    }
  }
}

versionは省略できる。省略した場合はすべてのバージョンに適用される。バージョンを指定すると、拡張機能を更新したときに上書きが効かなくなり、制限モードで無効化される点に注意する。

拡張機能の作者は理由があってfalseを宣言している。上書きすると制限モードの保護が働かなくなるため、内容を理解したうえで指定する。

なお判定では、ユーザー設定が拡張機能の宣言より優先される。

制限モードでターミナルを使う

制限モードでもターミナルだけは使いたい場合はterminal.integrated.allowInUntrustedWorkspaceを有効にする。信頼のチェックをスキップしてターミナルを開ける。

{
  "terminal.integrated.allowInUntrustedWorkspace": true
}

この設定自体も制限モードで無視される対象である。ワークスペース設定に書いても効かないため、ユーザー設定に書く。

一時的に無効化する

--disable-workspace-trustを付けて起動すると、そのセッションだけWorkspace Trustが無効になる。信頼済みフォルダーの一覧は変更されない。

$ code --disable-workspace-trust path/to/folder

code --helpには表示されないが利用できる。

codeコマンドについては以下を参照。

vscodeをコマンドで起動する

機能自体を無効にする

毎回の確認が不要な場合はsecurity.workspace.trust.enabledfalseにする。Workspace Trustの導入前と同じ動作に戻る。

【VSCode】「このフォルダー内のファイルの作成者を信頼しますか」を回避する設定

出所の分かるリポジトリしか開かないなら実害は小さい。一方、クローンしたリポジトリを気軽に開く使い方をするなら、制限モードのまま閲覧して必要なときだけ信頼するほうが安全である。

参考