失敗した国家レベル攻撃の解剖: PinpinRAT 分析
失敗した国家レベル攻撃の解剖: PinpinRAT 分析
開発者を対象とした偽の就職面接を利用した高度なフィッシングキャンペーンが発覚しました。このキャンペーンは、PinpinRAT と呼ばれるリモートアクセストロージャン(RAT)をインストールするマルチステージドロッパーを使用しています。攻撃者はベンチャーキャピタリストを装い、開発者に悪意あるリポジトリをクローンさせビルドコマンドを実行させることで、標準的なウイルス対策ソフトを回避する難読化ペイロードの連鎖を引き起こします。
攻撃ベクトル: ソーシャルエンジニアリング
攻撃は高度にターゲットを絞ったソーシャルエンジニアリングから始まります。攻撃者は、実在しないまたは廃止されたベンチャーキャピタル企業(例: "Lua Ventures")の代表を装い、メールや LinkedIn を通じて開発者に接触します。
信頼を築くために、攻撃者は次のことを行います:
- 印象的だが曖昧な経歴を持つ、正規らしい LinkedIn プロフィールを使用。
- 初期段階のスタートアップ企業名を出して、アドバイザリー業務の必要性を正当化。
- ターゲットと実際に音声通話を行い、アクセントやカメラ使用の不整合を "出張中" などの言い訳で説明。
- crates.io に公開されたパッケージなど、公開された貢献度に基づいて開発者を狙う。
PinpinRAT ドロッパーの技術的解析
悪意あるペイロードは、"Ticket Harbor" というフェリーチケット予約アプリを装った TypeScript リポジトリを通じて配布されます。感染チェーンは静かでステルスに設計され、複数層の難読化が施されています。
1. 初期実行
開発者が typecheck やビルドコマンドを実行したときに罠が作動します。プロセスは以下の順序で進行します:
- Postinstall フック: 4 つの別々の
postinstallフックがpatch-packageを実行します。そのうちの 1 つはパッチファイルに対してgit update-index --skip-worktreeを実行し、変更されたファイルがgit statusに表示されないようにします。 - ペイロード注入:
typescript+5.9.2.patchというファイルが自己実行型の XOR 復号された base64 ブロブをtypescript.jsと_tsc.jsに注入します。このスタブはeval()を使用せず、マルウェア検知を回避します。
2. 第二段階ロード
初期スタブは画像ファイル (operators/3.png) に付加された隠しデータチャンクを読み取ります。このデータにはカスタム wAsm チャンク内に小さな埋め込み WebAssembly(WASM)スタブが含まれています。WASM スタブは 1.68 MB の難読化された第二段階ペイロードを保持する、分離されたサイレントな Node.js プロセスを生成します。
3. 永続化とクリーンアップ
マルウェアは検知回避のために 3 層のクリーンアップを行います:
git skip-worktreeテクニックでパッチを隠蔽。- ドロッパーは最初の実行後に自身が注入した行を削除するようパッチファイルを書き換え。
- 第二段階の一時ディレクトリは実行後に自ら削除されます。
PinpinRAT の機能
PinpinRAT はフル機能のリモートアクセストロージャンです。鍵交換に RSA‑2048、セッション暗号化に AES‑256‑CBC を使用し、すべての通信は HMAC‑SHA256 の整合性タグで保護されます。
起動時に RAT は以下のホスト指紋を収集します:
- すべてのネットワークインターフェースの IP アドレス(プライマリ含む)。
- ユーザー名、ホスト名、OS の詳細(リリース、プラットフォーム、アーキテクチャ)。
- プロセス PID と完全な
process.argv。 - Node.js のバージョン。
攻撃者は侵害されたホストに対して次のコマンドを実行できます:
env: すべての環境変数を抽出。upload: 任意のファイルを読み取り、抽出。download: 攻撃者提供のバイト列を任意のパスに書き込み。spawn: シェル展開付きで任意のプロセスを実行。ls,cd,pwd,cp,mv: 完全なファイルシステム操作。dns: 任意の名前解決にホストを利用(DNS トンネリングの可能性)。dismantle: マルウェアの自己除去。
インジケータ(IoC)
システムが感染している疑いがある場合、以下の指標を確認してください:
- C2 サーバー:
89.124.107.161:80 - Windows スケジュールタスク:
PinpinWrappedJs - macOS プロセスマスカレード:
com.apple.WebKit.Networking - 環境変数:
NODT_PAYLOAD_PATH,NODT_PAYLOAD_ARGS - PNG チャンクガード:
WASMPACK(wAsm) - アンカー文字列:
12ff4b51,ticket-harbor-tsc-shim-anchor(typescript.js内に存在) - アーティファクトディレクトリ:
- macOS:
~/Library/Caches/runtime-cache/.cache-<randomhex>/ - Linux:
/tmp/.cache-<randomhex>/ - Windows:
%TEMP%\.cache-<randomhex>\
- macOS:
専門家の分析と緩和策
コミュニティの議論では、この攻撃パターンは Lazarus Group に非常に似ていると指摘されています。同グループは LinkedIn と就職面接詐欺を通じて開発者を標的にすることで知られています。
リスクを軽減するために、開発者は以下のセキュリティ実践を採用すべきです:
- エフェメラル環境の使用: 就職面接や外部ソースからの不審なコードは、個人または社内マシンで直接実行しないでください。使い捨ての仮想マシン(VM)やサンドボックスコンテナを利用します。
- 制限されたランタイムの使用: Deno のネットワークブロック/ホワイトリスト機能や Bun の
--ignore-scriptsフラグなどを活用し、悪意あるpostinstallフックの実行を防止します。 - サプライチェーンツールの活用:
pnpmのようにサプライチェーンセキュリティに取り組んでいるパッケージマネージャを使用します。 - LLM 生成コンテンツへの懐疑心: 攻撃者は現在、LLM を利用して非常に説得力のあるプロフェッショナルなフィッシングメールや LinkedIn プロフィールを作成していることを認識してください。