セキュリティ プログラミング 公開日 2026.10.28 更新日 2026.11.03

VS Codeでリポジトリを開くと勝手に実行される?tasks.jsonとワークスペースの信頼

採用の課題を装って悪意のあるリポジトリを開かせ、VS Code の tasks.json に仕込んだ自動タスクで攻撃コードを動かす手口を、Jamf・Microsoft の報告と VS Code の公式ドキュメントで整理しました。いまの VS Code が既定で止めてくれること(制限モードと自動タスクの確認)、npm のインストール時のスクリプトなどタスク以外の入口、知らないリポジトリを開く前の確認手順、設定の見直し、実行してしまったときの対応までまとめています。

目次(16項目)

先に要点

  • 採用の面接やコーディング試験を装って、開発者に悪意のあるリポジトリを開かせる攻撃が続いています。VS Code で開いて信頼すると、.vscode/tasks.json に書かれたコマンドがフォルダーを開いただけで実行される、という手口です。
  • いまの VS Code は既定で守りが2段あります。知らないフォルダーは制限モードで開く(1.126、2026年6月から)ことと、フォルダーを開いたときに自動で動くタスクは既定で止めて確認を出す(1.109、2026年2月から)ことです。
  • それでも「信頼する」と「自動タスクを許可」を押せば動きます。さらに npm install のスクリプト、デバッグの設定、拡張機能など、タスク以外にもコードが動く入口があります。
  • 知らないリポジトリは信頼せずに中身を読み、動かすなら仮想マシンやコンテナなど隔離した環境で、--ignore-scripts を付けて依存を入れます。

「面接の課題です。このリポジトリを clone して動かしてください」というメッセージから始まる攻撃が、開発者を狙って繰り返されています。@IT は2026年10月27日に、GitHub や GitLab で送られてくる悪意のあるリポジトリの見分け方を取り上げました。元になったのは Jamf Threat Labs の2026年1月の報告で、Microsoft も2026年3月に同じ手口を詳しく注意喚起しています。採用担当者を名乗る攻撃は、Palo Alto Networks の Unit 42 が2023年に「Contagious Interview」と名付けて報告したもので、北朝鮮の攻撃者によるものとされています。

この記事では、VS Code の公式ドキュメントとリリースノート、Jamf・Microsoft の報告、npm の公式ドキュメント(いずれも2026年10月28日に確認。VS Code の最新の安定版は 1.143.1)をもとに、なぜ開いただけで動くのか、いまの VS Code はどこまで止めてくれるのか、知らないリポジトリをどう扱えばよいかを整理します。

手口:課題のリポジトリに仕込まれた tasks.json

Jamf の報告と Microsoft の注意喚起によると、流れは次のとおりです。

採用試験を装った攻撃の流れ

  1. 1
    採用担当者を名乗って接触する

    求人サイトや SNS で連絡し、技術面接やコーディングの課題としてリポジトリの URL を送る。リポジトリは GitHub や GitLab に置かれている。

  2. 2
    VS Code で開かせて、信頼させる

    課題を始めるには開いて動かす必要があるので、受け取った人は VS Code でフォルダーを開き、作者を信頼する操作をしてしまう。

  3. 3
    tasks.json のタスクが自動で動く

    フォルダーを開いたときに実行する設定のタスクが、バックグラウンドでシェルのコマンドを実行する。Jamf が確認した macOS の例では、curl で取ってきた JavaScript を Node.js に渡して実行していた。

  4. 4
    端末の情報を送り、遠隔から命令を受ける

    ホスト名や OS の情報などを集めて攻撃者のサーバーへ送り、数秒おきに通信して、送られてきたコードを実行する状態になる。

鍵になっているのが、VS Code のタスクの設定ファイル .vscode/tasks.json です。タスクはビルドやテストのコマンドを登録しておく仕組みで、runOptions.runOn に folderOpen を指定すると、そのフォルダーを開いたときに自動で実行されます。本来は、開いたらすぐ開発用のサーバーやウォッチを立ち上げる、といった便利な使い方のための機能です。

{
  "version": "2.0.0",
  "tasks": [
    {
      "label": "dev server",
      "type": "shell",
      "command": "npm run dev",
      "runOptions": { "runOn": "folderOpen" }
    }
  ]
}
コマンドは普通の名前のタスクに紛れる

上は正当な使い方の例です。攻撃に使われるリポジトリでは、command の部分がネットワークからスクリプトを取ってきて実行する内容になっています。タスクの名前は「setup」「dev」のようなありふれたものにでき、課題の README と一緒に置かれると目立ちません。開く前に .vscode フォルダーの中身を読むことが、いちばん確実な見分け方です。

いまの VS Code は何を止めてくれるか

VS Code には、知らないコードが勝手に動かないようにする「ワークスペースの信頼(Workspace Trust)」という仕組みが 1.57 から入っています。2026年に入ってから既定の設定が2回厳しくなり、自動で動くタスクは2つの関門を通らないと実行されなくなりました。

知らないフォルダーを開く まず制限モード(タスク・デバッグなどは停止) 関門1:作者を信頼するか 信頼しない → 制限モードのまま 1.126 から既定で確認の画面を出さない 関門2:自動タスクを許可するか 許可しない → タスクは動かない 1.109 から既定が off(1回だけ尋ねる) 両方を通ると folderOpen のタスクが動く 古い VS Code や設定の変更で関門は減る
VS Code の公式ドキュメント(Workspace Trust・Tasks)とリリースノート 1.109・1.126 をもとに作成
変更 版(公開日) 中身
ワークスペースの信頼の導入 1.57 信頼していないフォルダーでは、タスク・デバッグ・一部のワークスペース設定・対応していない拡張機能などを止める「制限モード」で開く
自動タスクの既定を off に 1.109(2026年2月4日) task.allowAutomaticTasks の既定が on から off に。信頼したフォルダーでも、自動タスクを許可するかを1回だけ尋ねる
知らないフォルダーは確認なしで制限モードに 1.126(2026年6月24日) security.workspace.trust.startupPrompt の既定が once から never に。開くたびに信頼の確認の画面を出さず、制限モードで開いて上部にバナーを出す。誤って押しやすかった「親フォルダーを信頼」のボタンも外れた

ドキュメントは、制限モードについて、AI のエージェント、ターミナル、タスク、デバッグ、ワークスペースの設定、拡張機能の動きを止めたり制限したりすると説明しています。タスクについては「信頼していないワークスペースでは、設定にかかわらず自動タスクは動かない」と明記されています。

関門が減るケース

次の場合は、攻撃者のタスクが動くまでの操作が少なくなります。VS Code を長く更新していない(1.109 より前は自動タスクが既定で動く)、task.allowAutomaticTasks を on にしている、リポジトリをまとめて置いているフォルダーごと信頼している(親フォルダーを信頼すると、中の全フォルダーが信頼される)。また、ドキュメントは「ワークスペースの信頼は、悪意のある拡張機能がコードを実行して制限モードを無視することは防げない」とも書いています。

タスク以外にもコードが動く入口がある

tasks.json だけ確かめれば安全、というわけではありません。リポジトリの中身によって、次のような入口があります。どれも「信頼した」「インストールした」「実行した」のどこかで動き始めます。

npm install のスクリプト

package.json の preinstall・install・postinstall・prepare は、npm install で自動的に実行されます。Microsoft も、依存を入れる前にリポジトリを確かめるよう求めています。VS Code の信頼の仕組みとは関係なく、ターミナルで実行すれば動きます。

ワークスペースの設定

.vscode/settings.json には、リンターなどの実行ファイルのパスを指定できる設定があります。ドキュメントは、こうした設定を制限モードでは無効にすると説明しています。信頼した後は有効になります。

デバッグの設定

.vscode/launch.json でデバッグを始めると、デバッグ用の拡張機能がプログラムを起動します。制限モードではデバッグ自体が止まります。

おすすめの拡張機能

.vscode/extensions.json は、開いた人に拡張機能のインストールを勧めるだけで、勝手には入りません。ただし、拡張機能は VS Code と同じ権限を持つので、聞いたことのない拡張機能を勧められても入れないようにします。

開発コンテナ

devcontainer.json でコンテナを開き直すには、元のフォルダーを信頼する必要があります。中の postCreateCommand などで、コンテナの作成時にコマンドが動きます。

AI のエージェント

制限モードでは、そのワークスペースでの AI のエージェントも止まります。信頼する前のリポジトリの中身を、エージェントが読んで操作に移すことはありません。

Jamf は2026年9月の報告で、同じ攻撃者がその後、プロジェクトを開いた時点ではなく、最初のコミットやブランチの切り替えのときに動くスクリプトへ仕掛けを移した例を伝えています。入口は1つに決め打ちせず、知らないリポジトリでは何も実行しないことを前提にします。

知らないリポジトリを開く前の確認手順

採用の課題に限らず、勉強会のサンプルや Issue に貼られた再現用のリポジトリなど、出どころをよく知らないコードを触るときの手順です。

知らないリポジトリを扱う手順

  1. 1
    送ってきた相手を確かめる

    会社の公式サイトや採用ページから、その担当者と課題が本物かを確かめる。急かされても、確認が取れるまで動かさない。

  2. 2
    信頼せずに開く

    VS Code は既定で制限モードで開くので、バナーの信頼する操作をしない。制限モードでもファイルを読むことはできる。

  3. 3
    .vscode と package.json を読む

    tasks.json に runOn と folderOpen が無いか、command に curl や wget・base64・eval のような外部から取ってきて実行する内容が無いかを見る。package.json の scripts と、難読化された長い JavaScript のファイルも確かめる。

  4. 4
    動かすなら隔離した環境で

    普段使いの端末ではなく、使い捨ての仮想マシンやコンテナで動かす。ブラウザに保存したパスワードや SSH の鍵、クラウドの認証情報がある環境では実行しない。

  5. 5
    依存はスクリプトを止めて入れる

    npm install --ignore-scripts で、インストール時のスクリプトを動かさずに依存を入れる。必要なスクリプトは中身を読んでから個別に実行する。

ターミナルで中身を確かめるときは、次のようにします(例は macOS・Linux。Windows は PowerShell の Get-Content などに読み替えます)。どれもファイルを読むだけで、リポジトリのコードは実行しません。

# 自動で動くタスクが無いか
grep -n "folderOpen" .vscode/tasks.json

# .vscode の中に何があるか
ls -la .vscode

# npm のスクリプトの一覧(package.json を読むだけ)
npm pkg get scripts

# 依存を入れるなら、インストール時のスクリプトを止める
npm install --ignore-scripts
--ignore-scripts で止まるもの・止まらないもの

npm のドキュメントによると、ignore-scripts を有効にすると package.json のスクリプトは実行されません。ただし、npm run や npm test のように名前を指定して実行したスクリプトは動きます(前後に付く pre・post のスクリプトだけが止まります)。課題の指示どおりに npm run dev を打てば、そのスクリプトは動くということです。

設定で守りを固める

既定の設定のままで2つの関門は効いています。普段の設定で、それを弱めていないかを確かめておきます。

設定 推奨 理由
security.workspace.trust.enabled true(既定) 無効にすると、1.57 より前と同じく、どのフォルダーでも制限なく動く
task.allowAutomaticTasks off(既定) on にすると、信頼したフォルダーでは確認なしで自動タスクが動く
security.workspace.trust.startupPrompt never(既定) 知らないフォルダーを、確認の画面を出さずに制限モードで開く。信頼するかは、中身を見てから自分で決める
security.workspace.trust.untrustedFiles prompt(既定) 信頼していないファイルを、信頼済みのウィンドウで開くときに確認する
{
  "security.workspace.trust.enabled": true,
  "task.allowAutomaticTasks": "off",
  "security.workspace.trust.startupPrompt": "never"
}

信頼は親フォルダーで広く与えない

ドキュメントは、信頼するリポジトリ用のフォルダーと、評価用のフォルダーを分けて置く例を挙げています。リポジトリをまとめて置いているフォルダーを丸ごと信頼すると、後から clone したものまで信頼されます。

VS Code を最新に保つ

自動タスクの既定が off になったのは 1.109 からです。会社で更新を止めている端末があれば、版を確かめます。信頼の状態は、コマンド パレットの「Workspaces: Manage Workspace Trust」で見直せます。

開いて実行してしまったかもしれないとき

信頼して自動タスクを許可した、あるいは課題のスクリプトを実行してしまった後で不審に思った場合は、その端末で作業を続けず、次の順に対応します。

実行してしまったかもしれないときの対応

  1. 1
    ネットワークから切り離す

    Wi-Fi を切る、LAN ケーブルを抜くなどして、遠隔から命令を受け続ける状態を止める。電源はすぐには切らず、調査に必要な状態を残す。

  2. 2
    会社のセキュリティ担当に連絡する

    業務の端末なら、自分で片付けようとせず、まず報告する。いつ、どのリポジトリを開き、何を実行したかを書き出しておく。

  3. 3
    別の端末から認証情報を変える

    その端末に保存していたパスワード、SSH の鍵、クラウドや GitHub のトークンなどを、別の安全な端末から無効化・変更する。

  4. 4
    公開されている痕跡の情報と照らし合わせる

    Jamf や Microsoft の報告には、通信先や不正なファイルの手がかりが載っている。担当者と一緒に、ログやプロセスと照らし合わせる。

個人の端末で相談先に迷う場合は、IPA の情報セキュリティ安心相談窓口が相談を受け付けています。

よくある質問

リポジトリを clone しただけで感染しますか?

VS Code の自動タスクについては、clone しただけでは動きません。フォルダーを開いて信頼し、いまの既定では自動タスクも許可して、はじめて実行されます。ただし、npm のインストール時のスクリプトや、Git の操作をきっかけに動く仕掛けなど、ほかの入口もあるので、知らないリポジトリでは何も実行しないのが基本です。

制限モードで開けば、ファイルを読んでも大丈夫ですか?

制限モードでは、タスク・デバッグ・ターミナル・実行ファイルのパスを含むワークスペースの設定・信頼に対応していない拡張機能などが止まるので、ファイルを読むだけなら安全側に倒れています。ただし、ドキュメントは悪意のある拡張機能までは防げないとしています。普段から、出どころの分からない拡張機能を入れないことも大切です。

VS Code 以外のエディターなら安全ですか?

エディターを変えても、npm のインストール時のスクリプトのように、エディターと関係なく動く入口は残ります。また、Cursor など VS Code をもとにしたエディターが、同じ信頼の仕組みと同じ既定値を持つとは限りません。使っているエディターの設定を確かめてください。

本物の採用課題かどうか、どう見分ければよいですか?

連絡してきた担当者と課題が、会社の公式サイトや公式の採用ページから確かめられるかを見ます。個人のアカウントからだけ連絡がある、急いで実行させようとする、課題が「まず動かしてください」から始まる、といった点は注意のサインです。本物の課題でも、隔離した環境で動かしてかまいません。

まとめ

  • 採用試験を装って悪意のあるリポジトリを開かせ、.vscode/tasks.json の自動タスクで攻撃コードを動かす手口が続いている
  • いまの VS Code は、知らないフォルダーを制限モードで開き(1.126〜)、自動タスクも既定で止めて確認を出す(1.109〜)。信頼して許可するまでタスクは動かない
  • 古い VS Code、task.allowAutomaticTasks を on にした設定、親フォルダーごとの信頼は、この守りを弱める
  • npm のインストール時のスクリプトや開発コンテナなど、タスク以外の入口もある。知らないリポジトリは信頼せずに中身を読み、動かすなら隔離した環境で --ignore-scripts を付ける
  • 実行してしまったかもしれないときは、ネットワークから切り離し、担当者に報告し、別の端末から認証情報を変える

拡張機能が入口になった例として、Cursor のマーケットプレイスで配られた Claude Code 拡張の改ざん版(2026年10月29日)はCursor で配られた Claude Code 拡張の改ざん版とは?で扱っています。

参考リンク

あとで見返すならここで保存

読み終わったあとに残しておきたい記事は、お気に入りからまとめて辿れます。