LinkedInの採用提案に潜むバックドア
(roman.pt)- リクルーターがLinkedInメッセージで接触し、リードエンジニア採用を名目に公開GitHubリポジトリのレビューを依頼したソーシャルエンジニアリング攻撃の事例
- レビュー依頼されたコードにはテストスイートを装ったバックドアが隠されており、「deprecated Node modules の問題を確認してほしい」という依頼が
npm installの実行を誘うおとりになっていた - 不審に感じてローカルではなく使い捨てVPS上で読み取り専用エージェントを使ってコードを点検したところ、問題のファイルが数秒で検出された
- リポジトリのコミットとリクルータープロフィールはいずれも実在人物の身元を盗用しており、それぞれ実在の開発者と芸術分野のジャーナリストになりすましていた
- 疑念を持つこととセキュリティ衛生(security hygiene)、そして読み取り専用エージェントの活用が、直接コードを読むより効果的だったという実践的な防御の教訓を示している
接触の経緯
- 先週、小規模な暗号資産スタートアップのリクルーターからLinkedInメッセージを受け取った
- 数日にわたって何度かメッセージをやり取りし、リードエンジニアを必要としている壊れた proof-of-conceptについて説明を受けた
- レビュー用として公開GitHubリポジトリを渡され、「deprecated Node modules の問題を確認してほしい」と依頼された
- 既存コードベースのレビュー依頼自体は珍しくないが、違和感を覚えて一段と警戒した
点検方法
- クローン後に依存関係をインストールする代わりに、Hetznerの使い捨てVPSを立ち上げ、そこでリポジトリをクローンした
- Piを読み取り専用モードに設定し、ファイル読み取りツールだけを有効にした状態で実行した
- 使用コマンド:
pi --tools read,grep,find,ls
- 使用コマンド:
- エージェントにコードベースのレビューと疑わしい項目の指摘を求めると、
app/test/index.jsでほぼ即座に停止した
バックドアの構造
- リポジトリはReactフロントエンド + Nodeバックエンドの構成
- 罠は約250行の
app/test/index.jsにあり、テストスイートを装っていた - 内部ではURLを断片に分割して組み立てることで隠していた
- protocol、domain、separator、path、token、subdomain などの変数を結合して
https://rest-icon-handler.store/icons/77を構成していた
- protocol、domain、separator、path、token、subdomain などの変数を結合して
- コメントアウトされたテストのダミーの間にペイロードが隠されており、サーバーが送ってきたものを何でもユーザーのマシン上で実行する仕組みだった
- ペイロードは225行目にあった
トリガーメカニズム
- このファイルはテスト実行を待たない
app/index.jsがconst test = require('./test')を実行してapp/test/index.jsをロードし、起動する
package.jsonがapp/index.jsを起動段階に接続している- 核心は**
prepareスクリプト**で、npm はnpm installの後にprepareを自動実行する- そのため、依存関係のインストールだけでバックドアが実行される
- 「deprecated Node modules の問題を確認してほしい」という指示は、結局**
npm installの実行を誘うおとり**だった - サンドボックスでペイロードを実行して第2段階ペイロードを観察することもできたが、サーバーが渡すコードを実行するという証拠だけで中断した
1人目の盗用された身元
- コミットは実在するフルスタック開発者の名前とメールアドレスで作成されていた
- 普通のLinkedInプロフィール、個人ウェブサイト、長い履歴を持つGitHubアカウントを保有していた
- コードベースを引き継いだふりをして、その開発者に問い合わせた
- 彼はその会社で働いたことはなく、以前にもGitHubでなりすましに遭ってリポジトリが削除されたことがあり、このリポジトリとも無関係だと答えた
- 本人もこうしたリポジトリを報告している最中だと明かした
- コミット履歴全体の39件のコミットが、そのリポジトリに一度も触れたことのない1人の開発者名義に帰属していた
2人目の盗用された身元
- リクルータープロフィールは実在する芸術分野のジャーナリストのもので、文化分野の経歴しかなく、技術的要素は皆無だった
- インストールできないと返すと、非技術職のジャーナリストが即座に npm・Node バージョンの専門家に変貌し、
npm installの実行を強く迫ってきた
誰にでも起こりうる
- こうした攻撃の話は聞いており、HNでも読んでいたが、自分が直接標的になるとやや不意を突かれた
- 最初のメッセージの時点で疑ってはいたが、疲れていた日や急いでいた日なら、深く考える前に
npm installを実行していたかもしれない
- 最初のメッセージの時点で疑ってはいたが、疲れていた日や急いでいた日なら、深く考える前に
- リポジトリレビュー依頼を含むLinkedInメッセージには、少しの警戒心とセキュリティ衛生が必要だ
- 読み取り専用エージェントでコードをレビューしたことは、直接読むより効果的だった
- バックドアは不器用な初心者コードのように偽装されていたが、エージェントは数秒で検出した
- リポジトリはGitHubに、リクルーターはLinkedInに通報したが、現時点でも変化はなく、コードは依然として公開されたまま
1件のコメント
Hacker Newsの反応
小規模な暗号資産スタートアップのリクルーターが、壊れた概念実証リポジトリを見てほしいとして公開GitHubリポジトリを送り、「deprecated Node modules issue」を確認してほしいと言ってきた、という流れ自体が npm install を誘導するフィッシング だった
prepareスクリプトがnpm installの後に自動実行され、サーバーが配信する任意コードをローカルで実行させるバックドアであり、LinkedInでこうしたフィッシングに遭いうるというのは驚くほど深刻に見える$companyで働いていると主張するユーザーについて、会社側がそれを否定する手段を提供しておらず、プロフィールに書かれているだけで 公式企業ページ に表示されるうちの会社にも同じ詐欺を働く偽リクルーターがいたが、LinkedIn Premiumでの活動履歴も多いかなりもっともらしい偽プロフィールだったものの、実際の社員ではなかった
何度報告しても削除されず、最終的にはLinkedInで働く知人に酒をおごって解決したが、すべてのスタートアップがそんなコネを持っているわけではない
今のように人が次々やられているのを見ると、PNPMのようなツールを使ったり、コードを取得する過程での任意コード実行という、最も obvious で最も悪用されやすい穴を塞がないのが理解できない
コードをダウンロードしようとした瞬間に任意コードを実行するツールは、もうやめるべきだ
最後に覚えているのは、Windowsの
.scrスクリーンセーバーファイルに偽装したダウンロードで、LinkedInにまで来たのはさらに悪い段階だプラットフォーム側には「求人が増えている」ように見えるだろうから、あまり気にしないのではないか。GoogleやMetaのような広告ネットワークが詐欺広告をそれほど気にしないのと似ている
bullshitpowershellladendoucument.pdf.docxのようなものを送ってくるフィッシングは経験したことがあるが、LinkedIn DM で直接送ってくるのはかなり大胆な戦略だこれは明らかに犯罪のはずだが、こういうことを通報して助けを求められる、サイバー犯罪版の 911 のような有名な窓口がなぜないのかわからない
社会は現実のリスクに追いつき、支援網をもっと早く整えるべきであり、組織犯罪には組織的な防御が必要だ
返信は来ない可能性が高いが、米国市民にとっては、あるいはもしかすると誰にとっても、自分の知る限り インターネット版911 に最も近い存在だ
もう一つの問題は、この種の詐欺を作るための労力はほぼゼロに近い一方で、捕まえて起訴するには膨大な労力と天文学的なコストがかかるという非対称性だ
Microsoftサポートを装って高齢者を狙う詐欺電話と似た位置づけで、容疑者を捕まえるのはほぼ不可能だ
痕跡を非常にうまく隠しているか、あるいはもっとよくあるのは、西側の人間を相手に詐欺を働くことを政府が気にしない、あるいは黙認する国に住んでいるからだ
犯罪を通報しても、助けてもらえたり連絡をもらえたりする可能性は低い
これは今や、ありふれた面接課題と不快なほど近い
誰かがリポジトリを送ってきて、インストールが壊れているので見てほしいと言う状況は自然で、多くの開発者は疲れていたり求職中だったりすると、深く考える前に
npm installを実行してしまうかもしれない鈍く見られたくなくて、そもそも実行してよいかを確認する段階を飛ばしてしまう
「リポジトリはGitHubに、リクルーターはLinkedInに報告したが、まだ何も変わっておらず、コードもそのまま残っている」とは、ああ、Microsoft
カナダ首相が全カナダ国民向けの暗号資産投資計画を発表する偽動画にリンクしており、登録リンクまで付いていたが、通報したところ、調査の結果ポリシー違反は見つからなかったという返答が来た
3つともセキュリティや安定性に問題があり、MicrosoftがAIにさらに深く入り込むほど、改善するどころか悪化しているように見える
社内のAI生産性、ある人たちが10倍だと言っていたその生産性が、いったいどこへ向かっているのかわからない
そうすればすぐに削除されていただろう
同じドメインを複数の標的に使っているようだ
3か月前のRedditスレッドにも似た話がある: https://www.reddit.com/r/openclaw/comments/1rlet0h/someone_t...
なぜ世界中のすべてのOSがいまだに npm をブロックしていないのか理解できない
この人たちは絶対に学ばないようだ
この種の詐欺はさまざまな技術で可能だったし、Makefile ですら成立していただろう
Macに、ようやくまともな 仮想化フレームワーク ができてほしい
1995年みたいに、保護もなしにインターネットからランダムなスクリプトを落としてくるのにはもうかなりうんざりしている
見知らぬ相手に会って、その相手の持ち物を自分のコンピュータの奥深くに入れるときは、防護具を使うのを忘れるべきではない
curl | bashスクリプトを実行するのも同じくらいひどいが、ここにいる多くの開発者はいまだにこの悪習について疑わしい前提を持っているここ数週間で出回ったいくつかの小規模な Shai-Hulud 系インシデントが、これがどれほど悪いかを示している
IntelliJでnpmコマンドを Dockerコンテナ 内で実行するよう設定できる
LinkedInで受け取った求人提案はどれもあまりに怪しかった
プラットフォーム上で応募しろとか、自己紹介動画を録画しろとか、コードプラットフォームの裏にある 補正用コーディングテスト を解けといったものだった
会社ノートPCの保証金名目で小切手を書いてくれと言われたが、表面的に見てもおかしい話なのに、長く求職していて切迫しており、ついに仕事が得られたと本当に喜んでいた
長期失業者は、十分な貯蓄がある人や転職しようとしている在職者なら絶対に見逃さないような重大な危険信号すら、見過ごしてしまうほど追い詰められることが多い
最近の NPMパッケージ作者 の多くは、こういう形でハックされているのではないか?
axiosの担当者も、LinkedIn経由の同様のアプローチに引っかかったように見える
LinkedInは求人情報のためだけに使っているが、この数か月で無駄な求人があまりにも増えた
Ladders、Swooped のようなところと似た会社の求人が大量に見えるし、もうLinkedInを完全にやめる時期なのかもしれない