失敗した国家支援とみられる攻撃の解剖
(grack.com)- カナダのある開発者が、偽のVC面接を装ったバックドア誘導攻撃を受け、攻撃フローは
crates.ioパッケージマネージャーを狙ったものと疑われるほど、開発者の業務に合わせて設計されていた - おとりのリポジトリは「Ticket Harbor」という TypeScript アプリのように見えたが、
patch-packageとtypescript+5.9.2.patchを使って TypeScript の実行経路 に悪意あるコードを隠していた - 挿入されたスタブは base64 と XOR の難読化を解除し、
new Function(...)で実行され、operators/3.pngの隠しチャンクと WASM スタブを経由して、1.68MB の第2段階ペイロードを別の Node プロセスとして起動する - 最終ペイロード「PinpinRAT」は RSA-2048 鍵ペアと AES-256-CBC セッションキーを生成し、ホストのフィンガープリント収集、ファイルのアップロード・ダウンロード、プロセス実行、ファイルシステム操作、DNS クエリ、自己削除をサポートする
- リポジトリを実行していた場合は、直ちにネットワークを切断し、別のデバイスから認証情報を変更する必要があり、Cookie やパスワードで保護された秘密情報まで窃取された可能性を前提に対応すべきである
偽の面接から始まった開発者標的攻撃
- 攻撃者は「Lua Ventures」所属を名乗る偽の人物として接触してきた
- Lua Ventures はシンガポール拠点の DeFi 分野 VC と紹介されていたが、実際にはすでに活動を停止していた
- 人物名は実在の同姓同名と混同される可能性があるため公開されていない
- メールはもっともらしく、平凡だが本物らしく見える LinkedIn プロフィールのリンクも含まれていた
- 助言を求める投資先として Lyrasing と Roadpay に言及していた
- 2社には最低限の Web 上の存在感があり、架空企業というより初期段階の会社のように見えた
- Roadpay サイトの archive.org スナップショット も残っている
- メールのやり取りの後、Google Meet での通話にまで進んだ
- 通話相手はドイツ語訛りのある男性で、移動中だと話していた
- 通話自体に明確におかしい点はなかった
「テスト課題」に偽装された実行トリガー
- 通話後、攻撃者は「テスト」を提案し、リポジトリを送ってきた
- リポジトリは「Ticket Harbor」というフェリーのチケット販売アプリのように装われていた
- 同梱されていた
task.txtには、退屈だがもっともらしい課題一覧が書かれており、最後に実行指示が含まれていた- リポジトリの typecheck、テストスイート、関連する desktop/server ビルドコマンドを実行せよという内容
- この指示こそが実際の感染トリガーだった
npm run typecheck、build、devのように TypeScript が実行されたりtypescript.jsを import した瞬間に、ペイロードが実行され得た
TypeScript パッチに隠された実行チェーン
- 最初の警告サインは、リポジトリが TypeScript 課題 のように見えた点だった
- 要求内容がアーキテクチャ分析よりも TypeScript の採用課題に近かった
- リポジトリを Claude に入れて手早く確認した結果、
patch-packageに関する異常な兆候が見つかった
patches/ディレクトリが異常に多かった- 一部のパッチは正常に見え、実際のペイロードを隠すノイズとして機能していた
- 例として
sumchecker+3.0.1.patch、@electron+get+2.0.3.patch、extract-zip+2.0.1.patchが含まれていた
- 中核となる悪性コードは
typescript+5.9.2.patchにあったtypescript.jsと_tsc.jsの先頭に即時実行スタブを挿入する- スタブは base64 文字列をデコードし、各バイトをキー
73で XOR 復号した後、new Function(...)で実行する require、Buffer、WebAssembly、process、__dirnameが実行関数に渡される
- 実行チェーンはいくつもの段階を経る
- 4つの
postinstallフックがpatch-packageを実行する - そのうち1つは patch ファイルに
git update-index --skip-worktreeを適用し、git statusから隠す - ローダーは
operators/3.pngファイルの末尾に付加された隠しチャンクを読み取る - カスタム
wAsmチャンクの小さな WASM スタブを実行する - 1.68MB の難読化された第2段階ペイロードを、目立たない別の Node プロセスとして実行する
- 4つの
- 攻撃コードは実行後の痕跡を減らすよう設計されていた
git skip-worktreeでパッチを隠す- ドロッパーは初回実行後、patch ファイルから自分が挿入した行を削除する
- 第2段階の一時ディレクトリは実行時に自己削除される
PinpinRAT の機能
- 最終ペイロードは「PinpinRAT」と呼ばれている
- 内部文字列に由来する名称であり、別名で知られている可能性は否定できない
- オンライン上で他の参照は確認されていない
- ペイロードは複数の難読化レイヤーに包まれていた
- obfuscator.io
- 追加の base64 レイヤー 2つ
- RAT は起動時にホストのフィンガープリントを収集して送出する
- 主要 IP アドレスと IP 一覧全体
os.userInfo().usernameのユーザー名- ホスト名
- OS の type、release、platform、architecture
- プロセス PID と
process.argv全体 - Node バージョン
- 暗号化の仕組みも含まれている
- ローカルで RSA-2048 鍵ペアを生成
- ランダムな AES-256 セッションキー
aes_pskを生成 - 以後の通信は AES-256-CBC で暗号化され、HMAC-SHA256 の完全性タグが付与される
- サポートされるコマンドはリモートアクセス型トロイの木馬相当の機能を提供する
env:process.envを JSON 文字列化して送信upload: 任意のファイルパスを読み取って流出させるdownload: 攻撃者が提供したバイト列を書き込み可能なパスへ保存spawn: オプションの shell 展開付きで任意のプロセスを実行ls、cd、pwd、cp、mv: 一般的なファイルシステム操作dns: 指定した resolver を通じて任意の名前解決を行うdismantle: 自己削除
侵害指標と即時対応
- ペイロードを含む画像は VirusTotal 上で、どの AV エンジンにも検出されなかった
- 実行した場合は、直ちにシステムをネットワークから切り離すべきである
- 認証情報は別のデバイスから変更する必要がある
- Cookie やパスワードで保護された秘密情報も侵害されたものと見なすべきである
- PinpinRAT 関連の侵害指標は次のとおり
- C2:
89.124.107.161:80 - Windows のスケジュールタスク:
PinpinWrappedJs - macOS のプロセス偽装:
com.apple.WebKit.Networking - 環境変数:
NODT_PAYLOAD_PATH,NODT_PAYLOAD_ARGS - PNG チャンクガード:
WASMPACK(wAsm) PINPIN_NO_AUTOSTART=1: persistence を停止mutex.jsを含む cronjob: RAT 権限がある場合にのみ存在する可能性があり、macOS には存在しない場合があるtypescript.jsアンカー文字列:12ff4b51,ticket-harbor-tsc-shim-anchor- ペイロードを含む
typescript+5.9.2.patch - アーティファクトディレクトリ:
- macOS:
~/Library/Caches/runtime-cache/.cache-<randomhex>/ - Linux:
/tmp/.cache-<randomhex>/ - Windows:
%TEMP%\\.cache-<randomhex>\\ - 内部に
payload.jsとmutex.jsが入っている
- macOS:
- C2:
後になって見えた警告サイン
- メッセージには、よく見ると LLM の痕跡と思われる表現があった
- LinkedIn プロフィールは一見まともに見えたが、学位や資格の列挙が不自然で、実際の活動もなかった
- Web サイトのソーシャルメディアリンクには実際の履歴があったが、名前は 2025 年 11 月に変更されていた
- 投稿は具体性に乏しく、企業への曖昧な称賛に近かった
- 会社の Web サイトは派手だったが、実際の存在感はほとんどなかった
- 攻撃者は正式なカレンダー招待を送らず、時間と Google Meet だけを伝えてきた
- 通話中もカメラはずっとオフで、移動中だと話していた
- シンガポール拠点の VC、CEST 時間帯での活動、カナダの開発者への接触、米国顧客を狙う
.ccドメインが同時に見られた- 離れた地域の組織の信頼性を確認するのはさらに難しかった
- 個々のシグナルだけでは決定打ではなかったが、複数の黄信号が積み重なると赤信号と見なせるパターンだった
攻撃の背後と範囲
- 背後を断定することはできない
- この攻撃は開発者を標的にしており、偽人物、説得力のあるカバーストーリー、複数の偽サイト、辛抱強い日程調整、巧妙な
gitの罠を含んでいた - 2026 年に複数のアクターが使っている「偽面接詐欺」の流れとつながっている
- Reddit の Rust コミュニティでも 同様に標的にされたという事例 が言及されている
- 同じ手口が Rust リポジトリの罠
build.rsスクリプトとして構成されていたなら、だまされていたかもしれないほど、開発者のワークフローに密着していた
1件のコメント
Lobste.rs のコメント
タイトルで国家の支援を受けた攻撃者かもしれないと推測しているのが紛らわしい。ここには、それほどの準備や複雑さが必ず必要に見える部分はない
可能性としては想像できるが、ほかのシナリオと同じくらいにしかもっともらしく見えない
それでも、ほぼ間違いなく国家支援の攻撃者ではないと思う。この種の攻撃は、今ではそこまで難しくない
1週間前の私のブログ記事で説明した仮想例と今回の攻撃が似ているのは、本当に偶然だ: the hypothetical I describe in my blog post from a week ago
技術に詳しい専門家でもだまされ得る例として、もっともらしく見える攻撃をいくつか考え、そのうちの一つを選んだだけだった。人を狙ったさまざまな巧妙な詐欺が増えているのは見ていたが、面接詐欺という流れが進行中だとは知らなかった。だから今回の攻撃を知って、少しぞっとした
先週、Lua Ventures の D____ S_____ から、まったく同じような面接オファーを受け取った。大半の採用担当者スパムと同じように無視したが、そうしてよかった
数日前か数週間前に、こういう投稿があった気がする
似たような記事がいくつもあった気がする
「本物のメールのように見えた」というのが驚きだ。あまりにも明らかにLLM生成文なので、2文目から疑っていたと思う