LinkedIn Job Offer Backdoor: Analysis of a Social Engineering Attack

あるソフトウェアエンジニアが、最近、巧妙なソーシャルエンジニアリング攻撃の詳細を公開しました。それは、「暗号資産スタートアップ」を名乗る偽のLinkedInリクルーターが、被害者のマシンにバックドアをインストールしようとしたものです。この攻撃は、開発者の一般的なワークフロー(潜在的な仕事のためにコードベースを確認する)を悪用し、被害者を騙して npm install を実行させ、リモートコード実行(RCE)ペイロードを起動させました。

The Attack Vector: npm install as a Trigger

この攻撃の主なメカニズムは、npmのライフサイクルスクリプトの使用です。攻撃者は公開GitHubリポジトリを提供し、ターゲットに対して「非推奨のNode modulesの問題を確認してほしい」と指示しました。これにより、実質的に環境構築のために npm install を実行させるよう仕向けました。

提供されたリポジトリでは、package.json ファイルは次のように設定されていました:

  • prepare スクリプトは npm run app:pre を実行するように設定されていました。
  • app:pre スクリプトは node app/index.js を実行していました。

npmは npm install の後に自動的に prepare スクリプトを実行するため、ユーザーが手動でアプリケーションを実行する必要はなく、依存関係のインストール直後に悪意のあるコードが実行されます。

Technical Breakdown of the Backdoor

悪意のあるペイロードは、テストスイートを装って app/test/index.js 内に隠されていました。コードは、検出を避けるためにいくつかの難読化技術を使用していました:

  1. String Fragmentation: C2 (Command and Control) サーバーのURLは、単純な文字列検索を避けるために断片化されて組み立てられていました:

    const protocol = "https",
      domain = "store",
      separator = "://",
      path = "/icons/",
      token = "77",
      subdomain = "rest-icon-handler",
      bearrtoken = "logo";
    

    これはURLとして結合されます:https://rest-icon-handler.store/icons/77

  2. Obfuscation via Comments: 実際の実行ペイロードは、手動でのレビューを妨げるために、コメントアウトされたテストコードの壁に囲まれた、単一の圧縮された行(225行目)に埋め込まれていました。

  3. Execution Flow: エントリーポイントである app/index.js には const test = require('./test') という行が含まれており、起動時に app/test/index.js 内のコードを読み込み、実行していました。

Identity Theft and Impersonation

攻撃者は、信頼を築くために、盗まれた、あるいは借用されたアイデンティティを使用しました。GitHubリポジトリのコミット履歴(39 commits)は、プロジェクトとは無関係な実在のフルスタックエンジニアに帰属していました。そのエンジニアに連絡を取ったところ、以前にもGitHubでなりすましを受けていたことが確認されましたが、このリポジトリとは一切関係がありませんでした。

同様に、リクルーターのLinkedInプロフィールは、実在の芸術ジャーナリストのものでした。リクルーターを装う攻撃者は、技術的な習熟度が突然、予期せず変化したことが見て取れました。非技術的なプロフィールであるにもかかわらず、被害者がインストールに関する問題に直面した際、特定のNode.jsバージョン(例:Node.js v24)について議論するようになりました。

Community Insights and Patterns

Hacker Newsでの開発者間の議論では、これがソフトウェアエンジニア、特に暗号資産/Web3分野のエンジニアを標的とした、広範なパターンであることが明らかになりました。

Common Tactics

  • High-Pressure Recruitment: 攻撃者はしばしば、偽のプロフィールを使用して、壊れたPoC(概念実証)を「修正」するために、候補者にコードをローカルで実行させるよう強く迫ります。
  • Impersonation: コミット履歴を通じて、リポジトリを正当に見せるために、実在の人々のアイデンティティを使用します。
  • AI-Enhanced Social Engineering: 一部の被害者は、信頼を築くために、ビデオ通話(カメラオフ)を含む、長く、自然に感じられる面接プロセスを報告しています。これは、マルウェアをインストールさせるための最終的な要求の前に、信頼を構築するための段階です。

Security Recommendations

  • Sandboxing: 元のレポートの著者は、Hetznerの使い捨てVPSと、読み取り専用のAIエージェントを使用してコードを分析しました。これにより、バックドアは数秒で検出されました。
  • npm install への警戒: 信頼できないリポジトリで npm install を実行する際は、極めて慎重になってください。ライフサイクルスクリプトは任意のコードを実行できます。
  • Identity Verification: リクルーターが面接プロセス中にコードのローカル実行を促す場合、特にそのプロフィールが技術的な専門知識と一致しない場合は、注意してください。

"This is uncomfortably close to a normal interview task now. Someone sends you a repo, a install is broken, and asks you to take a look. A lot of developers would run npm install before thinking twice, especially if they were tired or looking for work."

Platform Response

著者は、リポジトリをGitHubに、リクルーターをLinkedInに報告しました。しかし、レポートでは、GitHubとLinkedInは、これらの悪意のあるリポジトリやプロフィールに対して対応が遅れることが多いと指摘されています。活動的な脅威が長期間にわたって生存し続けていることが報告されています。

Sources