北朝鮮系ハッカー、国旗SVG画像に4段階マルウェアを分散隠蔽――ウイルス対策の検知はゼロ
2026年7月20日 13:09
北朝鮮系の「Contagious Interview」ハッカーは、採用担当者になりすまして開発者にマルウェアを実行させる手口を何年も続けてきた。しかし、Elastic Security Labsが今回明らかにした手法は、オンライン上で見知らぬ相手からコーディング課題を受け取ったことのあるすべての開発者に関わる点で異なる。
攻撃者は、国旗のSVG画像ファイルに含まれるHTMLコメントブロック内にペイロードを隠し、悪意あるコードを一見無害な多数の国旗画像に分割して埋め込み、サーバー起動時に自動で再構成して実行していた。Elasticが調査結果を公開した時点で、トロイの木馬化されたリポジトリを検知したウイルス対策エンジンは一つもなかった。これは惜しくも検知を逃したという話ではない。ピクセル単位の画像改変を検出するよう設計されたウイルス対策ツールには、SVGのコメントブロックの意味内容を解析する仕組みがなく、北朝鮮の攻撃者はその構造的な隙を理解していた。
Elasticが社内で「REF9403」と追跡しているこのキャンペーンは、長期にわたるContagious Interview作戦の最新の展開である。CrowdStrikeは先月、2026年3月までの12カ月間にテクノロジーセクターを狙った国家支援型の対話型侵入の47%を同作戦が占めていたと報告している。ElasticがREF9403を発見したのは、顧客テレメトリーを通じてではなく、攻撃者が2026年5月下旬、偽の求人を使ってElastic自身のコミュニティSlackワークスペースを標的にしたためだった。
■Elastic自体の開発者も標的にした偽の求人
2026年5月26日、ElasticのコミュニティSlackワークスペースの「#jobs」チャンネルに、「Maxwell」と名乗るユーザーが投稿を行った。投稿内容は、ECプラットフォームのアップグレードに伴い、Next.js、NestJS、PostgreSQL、Auth.jsのスキルを持つ開発者を募集するというものだった。この募集に応じたユーザーはダイレクトメッセージに誘導され、コーディング課題を装ったトロイの木馬化されたGitHubリポジトリを渡された。
このリポジトリは、単なる空のシェルではなかった。GitHub上でGreatStackDevが公開していた正規のオープンソーステンプレート「GoCart」をクローンした、完全に機能するECプロジェクトであり、実際の採用候補者に企業が送ってきても不自然ではない種類のプロジェクトと見分けがつかなかった。攻撃者は無害に見える変数名を使って意図を隠しながら、コード上の戦略的な箇所に小さな悪意あるスニペットを挿入していた。
Elasticの研究者は、このMaxwellの事例を手がかりに、同じ基礎的な手法を示すトロイの木馬化された関連リポジトリ群を特定した。そこには、next-ecommerce-private-main.zip、shopping-platform-main.zip、ecommerce-platform.zip、さらに4つの追加バリアントが含まれていた。Elasticがレポートを公開した時点で、いずれもウイルス対策による検知はゼロだった。Elasticは、これらの誘いがElastic従業員を特に狙ったものだという証拠は見つかっていないとも述べている。あらゆる開発者コミュニティのフォーラムが標的になり得る。
■ウイルス対策ソフトを欺く「SVGコメントブロック」の悪用
ウイルス対策ソフトによる検知数がゼロだったのは、偶然ではない。構造上の問題だった。
従来のウイルス対策ツールは、画像ベースのステガノグラフィーを評価する際、ピクセルデータの統計的な異常を探す。たとえば、視覚コンテンツに隠し情報が埋め込まれたことを示す、色値の最下位ビットの改変などである。REF9403の手法は、ピクセルデータには一切触れていない。攻撃者は悪意あるペイロードをBase64でエンコードされた断片に分割し、プロジェクトのassets/flags/ディレクトリにあるすべてのSVG国旗画像のHTMLコメントブロック、つまり「」構文内に注入していた。AE.svg、AF.svgなどのファイルは、レンダリングすると完全に正常に見える。だが各ファイルには、コメント内容を解析せずに画像をレンダリングまたはピクセルスキャンするツールには見えない、エンコード済みデータの断片を含むコメントブロックが埋め込まれていた。
リポジトリ内のJavaScriptファイル「serverValidation.js」は、すべてのSVGファイルをアルファベット順に読み込み、それぞれのコメント内容を抽出し、断片を連結して完全なBase64文字列を再構成していた。その文字列は、セキュリティツールに検知されやすい標準的なJavaScriptのデコード手段であるBuffer.from()やatob()を意図的に避けるため、「Check()」という独自関数でデコードされていた。再構成されたペイロードは、その後eval()で実行された。
さらに、このマルウェアは商用のJavaScript難読化サービス「obfuscator.io」によって保護されていた。文字列配列の抽出とインデックスベースの参照、自己回転型の改ざん対策配列、その他の手法を使い、静的コード解析を妨げる仕組みである。
この関数は、サーバーが起動するたびに自動実行された。server/index.jsが初期ミドルウェア設定後にrunServerValidation()を呼び出しており、さらにpackage.jsonではnpm run devとnpm startの両方がserver/index.jsを起動するよう設定されていたためだ。開発者が評価のためにプロジェクトを起動しただけで、直ちに侵害されることになる。Elasticが把握する限り、この具体的な感染チェーンは、Contagious Interviewの過去の活動ではこれまで文書化されていなかった。
■4つのステージで並行実行されるマルウェアの動作
ペイロードが実行されると、4つのモジュールが並行して展開された。いずれも、開発者のタスクマネージャー上で目立たないよう「npm-cache」プロセスを装っていた。
ステージ1は、ブラウザの資格情報と暗号資産ウォレットの窃取を行うモジュールである。実行時にOSを識別し、Windows、macOS、Linux上のChrome、Edge、Brave、Operaに保存された資格情報データベース、自動入力データ、拡張機能のローカルストレージを標的にした。標的となるブラウザ拡張機能は25種類のハードコードされたリストで管理されており、MetaMask、Rabby、Phantom、Keplr、Trust Walletが上位に含まれていた。上位8つのウォレットについては、C2サーバーが受信を確認するまで窃取を再試行する優先度付けの仕組みも備えていた。macOSでは、これに加えてシステムキーチェーンデータベースも外部送信していた。資格情報データはすべてldb.rightwidth[.]devに送信された。
ステージ2は、ファイル窃取モジュールである。被害者のファイルシステムを再帰的に探索し、.env*、.pem、.json、.ts、.js、.pdf、.docx、.xlsx、AWSおよびAzureの資格情報ディレクトリ、SSHキー、シェル履歴ファイルなどのパターンに一致するファイルを標的にした。Windowsではマウントされたすべてのドライブが対象となり、macOSとLinuxではホームディレクトリに限定されていた。ファイルは暗号化されずにupload.rightwidth[.]devへ送信された。マルウェアの除外リストには意図的な対象範囲の絞り込みが見られ、.claude、.cursor、.gemini、.windsurfなど、AIコーディングツールに関連するディレクトリを明示的にスキップしていた。これは、攻撃者が現在の開発者向けツールの状況を把握していることを裏付けている。
ステージ3は、Socket.IOを使ったリモートアクセス型トロイの木馬(RAT)である。HTTPS経由でcontroller.rightwidth[.]devへの永続的かつ暗号化されたC2チャネルを確立した。このRATは複数インスタンスの起動を防ぐPIDロックを実装し、3つのOSすべてに対応したサンドボックスおよび仮想マシン検知も備えていた。解析環境の疑いがある場合でも実行は停止せず、C2応答内でそれを示す設計になっており、攻撃者がセキュリティ研究者を選別する助けにしていた可能性が高い。攻撃者は任意のシェルコマンドを発行し、リアルタイムで出力を受け取ることができた。これは一度限りの資格情報窃取ではない。被害者のマシンへの永続的で対話的なアクセスである。
ステージ4は、クリップボード監視とWindows向けドロッパーである。500ミリ秒ごとに被害者のクリップボードをポーリングし、新しい内容があればC2サーバーへ外部送信していた。通常業務の中でAPIキー、シードフレーズ、秘密鍵をコピーする可能性のある開発者を狙った機能である。Windows環境に限り、このモジュールはfile.rightwidth[.]devから追加の3つのバイナリもダウンロードしていた。これらは.txtファイルを装い、.exeにリネームされたうえで実行された。Elasticの分析時点では、その第2段階バイナリを配信するC2サーバーはオフラインだったため、内容は取得できなかった。
■北朝鮮のハッカー集団「Contagious Interview」への帰属
Elasticによる帰属判断は、複数の独立した技術的指標に基づいている。メインのJavaScriptペイロードは、NTT Security Holdingsが2024年12月に初めて文書化し、2025年5月までに4つの後継バージョンが追跡されていたマルウェアファミリー「OTTERCOOKIE」とコードの類似性を示している。一致する文字列、振る舞いのパターン、スクリプトの構成は、Microsoftによる過去のContagious Interviewに関する報告とも合致している。観測されたAPIエンドポイントである/api/service/makelog、/api/service/process/
Contagious Interviewは、2023年後半にPalo Alto Networks Unit 42によって初めて公に文書化された。CL-STA-0240、DeceptiveDevelopment、DEV#POPPER、Famous Chollima、UNC5342などの別名でも追跡されている。北朝鮮の偵察総局の下で活動するLazarus Group内の、金銭的動機を持つサブセットと広く理解されており、暗号資産窃取を通じて外貨を獲得することを目的としている。その収益について、米政府機関は北朝鮮の兵器計画との関連を指摘している。
より広範なキャンペーンの規模を見れば、これは孤立した脅威ではないことが分かる。Socketの研究者は、2025年1月から2026年4月までに、npm、PyPI、Go modules、crates.io、Packagistにわたって、Contagious Interviewの活動に関連する1,700以上の悪意あるパッケージを追跡していた。CrowdStrikeの最新の年次報告書では、同社がこのクラスターに用いる名称であるFamous Chollimaが、2026年3月までの12カ月間にテクノロジーセクターを狙った国家支援型の対話型侵入全体の47%を占めていたとされている。
■拡大するサプライチェーンへの脅威
REF9403のソーシャルエンジニアリング手法、つまりMaxwellという人物像、Slackチャンネル、偽の求人は、オープンソースエコシステム全体で技術的な配信を同時に自動化してきた作戦の人的な層である。
2025年12月から活動している「PolinRider」と呼ばれる関連するContagious Interviewのサブキャンペーンは、別の経路を取っていた。正規のパッケージメンテナーのアカウントを侵害し、Gitの履歴を書き換えて悪意ある変更をより古いものに見せかけ、npm、Packagist、Go modules、Chrome拡張機能に感染パッケージのバージョンを配布する手法である。2026年4月11日までに、PolinRiderは1,047人のユニークな所有者に属する1,951件の公開GitHubリポジトリを侵害していた。2026年6月下旬から7月上旬にかけては、4つのエコシステムにわたり、108件のユニークな悪意あるパッケージおよびブラウザ拡張機能へと拡大した。
REF9403とPolinRiderの双方が示しているのは、Contagious Interviewが本格的にマルチモーダル化しているということだ。偽の求人、偽の採用担当者、偽のSlack上の人物像といったソーシャルエンジニアリング層は今も存在し、開発者コミュニティがオープンで協調的に設計されているからこそ有効に機能している。しかし、このキャンペーンはもはやその層だけに依存していない。不審な求人に一切応じない開発者であっても、日常的なnpm installや、侵害された信頼済みメンテナーからの依存関係アップデートを通じて到達される可能性がある。
Elasticのレポートは、この構造的なリスクを端的に示している。1人の開発者を侵害すれば、その開発者が関わるすべての下流組織に対する広範なサプライチェーン攻撃に必要な最初の足がかりを得られる可能性がある。個人は侵入口であり、標的はサプライチェーンである。
■開発者とセキュリティチームが今取るべき対策
Elasticは7月18日の報告書で、検知ルール、MITRE ATT&CKの技術マッピング、確認済みの7つのトロイの木馬化リポジトリすべてのSHA-256ハッシュ一覧を公開した。
開発者は、Slack、Discord、LinkedIn、その他どのプラットフォームであっても、未承諾のダイレクトメッセージや求人を通じて届いたリポジトリを、コードベース全体の手動監査を終えるまで実行してはならない。監査には、アセットディレクトリとサーバー側スクリプトも含める必要がある。特に、eval()や動的コード実行の呼び出し、外部アセットを読み込むサーバー起動ファイルには注意すべきだ。
未承諾の求人を通じて受け取ったプロジェクトをすでに実行している場合は、今すぐそのプロジェクトを監査する必要がある。Elasticが特定した7つのリポジトリ名、next-ecommerce-private-main.zipやshopping-platform-main.zipなどを確認し、serverValidation.jsというファイル、またはSVGアセットを読み込んでBase64コンテンツを再構成する関数がないかを調べるべきだ。
ネットワーク境界では、rightwidth[.]devドメイン群をブロックまたは監視する必要がある。確認済みのC2サブドメインは、ldb.rightwidth[.]dev、upload.rightwidth[.]dev、controller.rightwidth[.]dev、file.rightwidth[.]devである。
最近不審なプロジェクトを実行した場合は、ブラウザに保存された資格情報と暗号資産ウォレット拡張機能を確認すべきだ。露出した可能性のあるマシンについては、APIキー、SSHキー、クラウド資格情報、npmトークン、ウォレットのシードフレーズをすべてローテーションする必要がある。
セキュリティチームとプラットフォームチームは、CI/CDパイプラインで強制するリンティングルールを通じて、サーバー側JavaScriptでのeval()使用を制限することを検討すべきだ。REF9403のペイロードはインストール時ではなくサーバー起動時に実行されたため、2026年7月8日に出荷されたnpm v12のインストールスクリプト遮断のデフォルト設定では、この攻撃は防げなかった。静的アセットディレクトリも、JavaScriptソースファイルと同じ水準で精査する必要がある。
■注目ポイントQ&A
●なぜウイルス対策ソフトはこれらのリポジトリ内のマルウェアを検知できなかったのですか?
ペイロードが、ステガノグラフィー検出ツールが通常調べる画像のピクセルデータではなく、SVGファイル内のHTMLコメントブロックに隠されていたためです。SVGはテキストベースの画像フォーマットであり、そのコメント構文「」は完全に正当なものです。SVGをレンダリングしたりピクセル単位でスキャンしたりするウイルス対策ツールには、コメントブロックの意味的な内容を抽出して解析する仕組みがありません。コメント内に保存された断片は、コメント内容を明示的に解析し、その中のBase64エンコード文字列を探してデコードするスキャナーでなければ、意味のないテキストに見えます。ベンダーが一つもリポジトリを検知しなかった理由は、偶然ではなく、SVGファイルの評価方法に存在する既知の隙を狙った構造的な回避策だったからです。
●このキャンペーンの悪意あるリポジトリを実行してしまったかどうか、どうすれば確認できますか?
プロジェクトディレクトリやダウンロード履歴に、確認済みの7つのリポジトリ名がないか確認してください。対象は、next-ecommerce-private-main.zip、shopping-platform-main.zip、ecommerce-platform.zip、ecommerce-platform-main.zip、shopping-platform.rar、shop-main.zip、ecommerce-main.zipです。また、求人やダイレクトメッセージを通じて受け取ったECプロジェクトのサーバーディレクトリ内に、serverValidation.jsというファイルがないかも確認してください。いずれかに該当する場合は、そのマシンは侵害されたものとして扱い、他の対応より先に、npmトークン、GitHubトークン、クラウドプロバイダーのキー(AWS、Azure、GCP)、SSHキー、暗号資産ウォレットのシードフレーズを含むすべての資格情報をローテーションしてください。ブラウザに保存された資格情報を確認し、暗号資産ウォレット拡張機能にアクセスがあったかどうかも調べる必要があります。組織のセキュリティチームにインシデントを報告し、該当する場合はCISAにも報告してください。
●Contagious Interviewキャンペーンとは何ですか?誰が関与していますか?
Contagious Interviewは、少なくとも2022年12月からソフトウェア開発者を標的にしている、北朝鮮の国家支援型サイバー攻撃作戦です。北朝鮮の偵察総局の下で活動するLazarus Group内の、金銭的動機を持つクラスターに広く帰属されており、Famous Chollima、DEV#POPPER、DeceptiveDevelopment、UNC5342、Void Dokkaebiなど複数の別名でも追跡されています。この作戦の主な金銭的目的は、北朝鮮体制のための外貨獲得に向けた暗号資産窃取です。2023年後半にPalo Alto Networks Unit 42によって初めて公に文書化され、その後Socket、Microsoft、JFrog、Proofpoint、Trend Micro、Elastic、SANSなどが追跡してきました。2026年4月時点で、研究者は5つのオープンソースエコシステムにまたがる1,700以上の悪意あるパッケージをこの作戦に関連付けていました。
●npm v12を使用していれば、この種の攻撃を防げますか?
少なくともREF9403については、防げません。2026年7月8日に出荷されたnpm v12は、postinstallなどのライフサイクルスクリプトの実行をデフォルトでブロックします。これは、インストール時フックに依存していた過去のContagious Interviewの手法を止められた可能性がある重要なセキュリティ改善です。しかし、REF9403のペイロードは異なるタイミングで発火します。npm installの段階ではなく、開発者がnpm run devまたはnpm startでサーバーを実行したときに動作します。そのため、npm v12のスクリプト遮断のデフォルト設定では、この攻撃は中断されません。REF9403に対する有効な防御は、信頼できない送信元から受け取ったプロジェクトを実行する前にサーバー側スクリプトとアセットディレクトリを手動でレビューすること、rightwidth[.]devドメイン群をネットワークレベルでブロックすること、サーバー側JavaScriptでのeval()使用を検知するリンティングルールを設けることです。
元記事: North Korea Buried Four-Stage Malware in Flag Images: Zero Antivirus Detections