1 ポイント 投稿者 GN⁺ 5 시간 전 | 1件のコメント | WhatsAppで共有
  • カナダのある開発者が、偽のVC面接を装ったバックドア誘導攻撃を受け、攻撃フローは crates.io パッケージマネージャーを狙ったものと疑われるほど、開発者の業務に合わせて設計されていた
  • おとりのリポジトリは「Ticket Harbor」という TypeScript アプリのように見えたが、patch-packagetypescript+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 プロフィールのリンクも含まれていた
  • 助言を求める投資先として LyrasingRoadpay に言及していた
    • 2社には最低限の Web 上の存在感があり、架空企業というより初期段階の会社のように見えた
    • Roadpay サイトの archive.org スナップショット も残っている
  • メールのやり取りの後、Google Meet での通話にまで進んだ
    • 通話相手はドイツ語訛りのある男性で、移動中だと話していた
    • 通話自体に明確におかしい点はなかった

「テスト課題」に偽装された実行トリガー

  • 通話後、攻撃者は「テスト」を提案し、リポジトリを送ってきた
  • リポジトリは「Ticket Harbor」というフェリーのチケット販売アプリのように装われていた
  • 同梱されていた task.txt には、退屈だがもっともらしい課題一覧が書かれており、最後に実行指示が含まれていた
    • リポジトリの typecheck、テストスイート、関連する desktop/server ビルドコマンドを実行せよという内容
  • この指示こそが実際の感染トリガーだった
    • npm run typecheckbuilddev のように TypeScript が実行されたり typescript.js を import した瞬間に、ペイロードが実行され得た

TypeScript パッチに隠された実行チェーン

  • 最初の警告サインは、リポジトリが TypeScript 課題 のように見えた点だった
    • 要求内容がアーキテクチャ分析よりも TypeScript の採用課題に近かった
    • リポジトリを Claude に入れて手早く確認した結果、patch-package に関する異常な兆候が見つかった
  • patches/ ディレクトリが異常に多かった
    • 一部のパッチは正常に見え、実際のペイロードを隠すノイズとして機能していた
    • 例として sumchecker+3.0.1.patch@electron+get+2.0.3.patchextract-zip+2.0.1.patch が含まれていた
  • 中核となる悪性コードは typescript+5.9.2.patch にあった
    • typescript.js_tsc.js の先頭に即時実行スタブを挿入する
    • スタブは base64 文字列をデコードし、各バイトをキー 73 で XOR 復号した後、new Function(...) で実行する
    • requireBufferWebAssemblyprocess__dirname が実行関数に渡される
  • 実行チェーンはいくつもの段階を経る
    • 4つの postinstall フックが patch-package を実行する
    • そのうち1つは patch ファイルに git update-index --skip-worktree を適用し、git status から隠す
    • ローダーは operators/3.png ファイルの末尾に付加された隠しチャンクを読み取る
    • カスタム wAsm チャンクの小さな WASM スタブを実行する
    • 1.68MB の難読化された第2段階ペイロードを、目立たない別の Node プロセスとして実行する
  • 攻撃コードは実行後の痕跡を減らすよう設計されていた
    • 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 展開付きで任意のプロセスを実行
    • lscdpwdcpmv: 一般的なファイルシステム操作
    • 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.jsmutex.js が入っている

後になって見えた警告サイン

  • メッセージには、よく見ると LLM の痕跡と思われる表現があった
  • LinkedIn プロフィールは一見まともに見えたが、学位や資格の列挙が不自然で、実際の活動もなかった
  • Web サイトのソーシャルメディアリンクには実際の履歴があったが、名前は 2025 年 11 月に変更されていた
    • 投稿は具体性に乏しく、企業への曖昧な称賛に近かった
  • 会社の Web サイトは派手だったが、実際の存在感はほとんどなかった
  • 攻撃者は正式なカレンダー招待を送らず、時間と Google Meet だけを伝えてきた
    • 通話中もカメラはずっとオフで、移動中だと話していた
  • シンガポール拠点の VC、CEST 時間帯での活動、カナダの開発者への接触、米国顧客を狙う .cc ドメインが同時に見られた
    • 離れた地域の組織の信頼性を確認するのはさらに難しかった
  • 個々のシグナルだけでは決定打ではなかったが、複数の黄信号が積み重なると赤信号と見なせるパターンだった

攻撃の背後と範囲

  • 背後を断定することはできない
  • この攻撃は開発者を標的にしており、偽人物、説得力のあるカバーストーリー、複数の偽サイト、辛抱強い日程調整、巧妙な git の罠を含んでいた
  • 2026 年に複数のアクターが使っている「偽面接詐欺」の流れとつながっている
  • Reddit の Rust コミュニティでも 同様に標的にされたという事例 が言及されている
  • 同じ手口が Rust リポジトリの罠 build.rs スクリプトとして構成されていたなら、だまされていたかもしれないほど、開発者のワークフローに密着していた

1件のコメント

 
GN⁺ 5 시간 전
Lobste.rs のコメント
  • タイトルで国家の支援を受けた攻撃者かもしれないと推測しているのが紛らわしい。ここには、それほどの準備や複雑さが必ず必要に見える部分はない
    可能性としては想像できるが、ほかのシナリオと同じくらいにしかもっともらしく見えない

    • こうした巧妙な詐欺はリソースを多く使うので、かなり珍しいからだと思う。巧妙な詐欺を見ると、国家が背後にいるのかもしれないと感じやすい
      それでも、ほぼ間違いなく国家支援の攻撃者ではないと思う。この種の攻撃は、今ではそこまで難しくない
  • 1週間前の私のブログ記事で説明した仮想例と今回の攻撃が似ているのは、本当に偶然だ: the hypothetical I describe in my blog post from a week ago
    技術に詳しい専門家でもだまされ得る例として、もっともらしく見える攻撃をいくつか考え、そのうちの一つを選んだだけだった。人を狙ったさまざまな巧妙な詐欺が増えているのは見ていたが、面接詐欺という流れが進行中だとは知らなかった。だから今回の攻撃を知って、少しぞっとした

    • 本当にぞっとする。その記事についての Lobsters discussion へのリンクもある
  • 先週、Lua Ventures の D____ S_____ から、まったく同じような面接オファーを受け取った。大半の採用担当者スパムと同じように無視したが、そうしてよかった

    • Rust 関係の人なのか気になる。Rust コミュニティの主要人物たちが Lua の標的になっていたが、Rust に限った話なのか、もっと広い範囲なのか知りたい
  • 数日前か数週間前に、こういう投稿があった気がする

  • 「本物のメールのように見えた」というのが驚きだ。あまりにも明らかにLLM生成文なので、2文目から疑っていたと思う

    • 私にはそこまで明らかではなかった。単にLinkedIn風の文体のように感じた。それも時々LLMが書いたように聞こえるが、においがあまりに似ていて、両者を区別できる能力が自分にあるのかよく分からない