エグゼクティブサマリー
2025年6月から12月にかけて、テキストエディタNotepad++の公式ホスティングインフラが、Lotus Blossomとして知られる国家支援型の脅威グループによって侵害されました。攻撃者は、共有ホスティングプロバイダーの環境を突破しました。
これにより攻撃者は、Notepad++のアップデートサーバーに向けられたトラフィックを傍受・リダイレクトすることが可能になりました。このインフラレベルのハイジャックにより、攻撃者は特定のユーザーを厳選して標的にすることができました。標的は主に東南アジアに位置し、政府、電気通信、重要インフラ部門に及んでいました。攻撃者はこれらの標的に対し、正規のソフトウェアアップデートではなく、悪意のあるアップデートマニフェストを配信しました。
私たちは、このキャンペーンに関連する未報告の追加インフラを特定しました。また、Cobalt Strikeビーコンマルウェアの配信に至るLuaスクリプトインジェクションの亜種、およびChrysalisバックドアを配信するためのDLLサイドローディングを含む、2つの感染チェーンを観測しました。Unit 42はさらに、この脅威活動が以前に報告されていたよりも多くの部門や地域を標的にしていることも突き止めました。
このキャンペーンは、南米、米国、欧州、東南アジアの以下の部門にも影響を及ぼしました:
- クラウドホスティング
- エネルギー
- 金融
- 政府
- 製造
- ソフトウェア開発
Notepad++は、軽量なオープンソースのコードエディタおよびテキスト置換ユーティリティです。その速度、豊富なプラグインエコシステム、そしてユーザーが未保存のセッションを維持しながら膨大なデータファイルを処理できる独自の能力により、広く好まれています。
企業環境において、Notepad++はシステム管理者、ネットワークエンジニア、DevOps担当者にとって不可欠なツールとなっていることがよくあります。これらの担当者は通常、サーバー設定の変更、大容量システムログの解析、重量級のアプリケーションが実用的でないセキュアなジャンプボックス(踏み台サーバー)上でのコード監査にこのツールを使用します。
このような特定のユーザー属性により、Notepad++は脅威アクターにとって戦略的に極めて重要な標的となります。この単一のツールを侵害することで、攻撃者は境界防御を効果的に回避し、組織内で最も高い権限を持つユーザーのセッションに便乗して、ネットワークの基幹インフラへの実質的な管理者アクセス権を手に入れることができるのです。
パロアルトネットワークスのお客様は、以下の方法で、本記事で解説した活動に対する保護と緩和策を受けることができます:
- Advanced URL FilteringおよびAdvanced DNS Securityは、この活動に関連する既知のURLやドメインを悪意のあるものとして識別します。
- Cortex Cloudは、本記事で論じている悪意のある操作、設定変更、または脆弱性悪用を検知・防御するのに役立ちます。
- Cortex XDRおよびXSIAMは、Malware Prevention Engine(マルウェア防御エンジン)を採用しています。
- Advanced Threat Preventionを備えた次世代ファイアウォールは、コモディティ脅威と標的型脅威の両方からネットワークを防御するように設計されています。
また、Unit 42のインシデントレスポンスチームに依頼して、侵害への対応や、リスク低減のためのプロアクティブなアセスメントの提供を受けることも可能です。
| 関連する Unit 42 トピック | DLLサイドローディング、バックドア、サプライチェーン、Cobalt Strike |
Notepad++への攻撃の詳細
このサプライチェーン攻撃は、Notepad++の古いバージョンのアップデーターであるWinGUpにおける不十分な検証コントロールの悪用に依存していました。この悪用により、脅威グループはトラフィックを攻撃者が制御するサーバーへリダイレクトさせることができました。
標的となった被害者がソフトウェアをアップデートしようとすると、悪意のあるNSISインストーラーがダウンロードされました。このインストーラー(多くの場合 update.exe という名称)は、複雑な感染チェーンを開始しました。このチェーンではDLLサイドローディング技術が使用され、正規のBitdefenderコンポーネント(BluetoothService.exe)を悪用して、カスタムバックドアを復号・実行する悪意のあるライブラリ(log.dll)をロードしました。別の感染チェーンでは、攻撃者はNSISインストーラーを利用してコマンドを実行し、悪意のあるLuaスクリプトを走らせてCobalt Strike Beaconをロードしました。
Chrysalisと呼ばれるこのマルウェアは、以下のような高度な回避技術を用いていました:
- Microsoft Warbirdコード保護フレームワークの使用
- アンチウイルスによる検知を回避するためのカスタムAPIハッシング
- 感染したシステムに対する永続的なリモートコントロールの確立
このキャンペーンにおける追加の悪用活動
Unit 42は、2つの個別の攻撃シーケンスの証拠を観測しました:
- 悪意のあるNSISインストーラーが、Cobalt Strike Beaconペイロードをダウンロード・実行するためのインストーラーを含むコンパイル済みLuaスクリプトをドロップするもの。
- 攻撃者がDLLサイドローディングを使用してChrysalisバックドアをメモリに注入するもの。
私たちは、2025年8月中旬から11月の間に、この悪用活動と一致する追加の活動を観測しました。8月のインシデントでは、コマンド&コントロール(C2)IPアドレス 45.76.155[.]202 との通信を観測しました。このIPアドレスへのC2ビーコン通信が数日間続いた後、攻撃者は 45.77.31[.]210 にある2番目のC2サーバーに移行し、通信は9月まで続きました。
2025年9月から11月の事例では、C2サーバーへのアウトバウンド接続と一致する活動を観測しました。これに続いて、報告されているChrysalisバックドアと一致する update.exe のダウンロード要求が行われました。IPアドレスに対してダウンロードが試みられたケースもあれば、ドメインに対して行われたケースもありました。悪意のあるサーバーへのビーコン送信の成功は、悪意のあるペイロードのダウンロード成功から数秒以内に発生し、不特定の期間継続しました。
2025年9月と10月には、シェルコードを注入するために悪意のあるLuaスクリプトを展開するLuaスクリプトインジェクションの亜種を観測しました。この攻撃は EnumWindowStationsW APIを使用し、結果としてCobalt Strikeビーコンマルウェアが配信されました。このケースでは、ダウンロード元は以下でした:
- 45.76.155[.]202/update/update.exe
これとは別に、同じケースでBluetooth DLLサイドローディングの亜種も観測されました。このLuaの亜種は、BluetoothサービスのDLLサイドローディング技術を使用してChrysalisバックドアを展開します。この亜種のダウンロード試行は、別の悪意のあるサーバーから行われました:
- 45.32.144[.]255/update/update.exe
暫定ガイダンス
Notepad++は以下を推奨しています:
- 関連するセキュリティ強化が含まれているバージョン8.9.1をダウンロードすること。
- インストーラーを実行してNotepad++を手動でアップデートすること。
Notepad++によると、ウェブサイトはセキュリティ慣行が大幅に強化された新しいホスティングプロバイダーに移行済みとのことです。
Notepad++自体についても、v8.8.9でWinGUpアップデーターが強化され、ダウンロードされたインストーラーの証明書と署名の両方を検証するようになっています。
さらに、以下の点にも言及されています:
- アップデートサーバーから返されるXMLが署名されるようになりました(XMLDSig)。
- 証明書と署名の検証は、約1ヶ月後にリリース予定の次期バージョン8.9.2から強制適用されます。
Unit 42 Managed Threat Huntingのクエリ
Unit 42 Managed Threat Huntingチームは、Cortex XDRと以下のXQLクエリを使用して、悪用の兆候や異常な活動の追跡を続けています。Cortex XDRをご利用のお客様も、これらのXQLクエリを調査やハンティングに活用いただけます。
活動の大部分は12月2日より前に発生した可能性が高いため、お使いの環境でこれらのクエリが有効かどうか、データ保持期間を確認することをお勧めします。環境で利用可能な場合は、「コールドストレージ」クエリ(cold_dataset = xdr_data)を使用して、ホット保持期間を超えたデータを照会することを検討してください。コールドストレージに対するクエリの実行は、コンピューティングユニットを消費することにご留意ください。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
// Name: DLL sideloading via BYO application // Description: Identifies renamed Bitdefender utility loading a log.dll file // MITRE TTP ID: T1574.001 config case_sensitive = false | dataset = xdr_data | fields actor_process_signature_vendor, actor_process_signature_product, action_module_path, actor_process_image_path, actor_process_image_sha256, agent_os_type, event_type, event_id, agent_hostname, _time, actor_process_image_name | filter event_type = ENUM.LOAD_IMAGE and agent_os_type = ENUM.AGENT_OS_WINDOWS | filter actor_process_signature_vendor contains "Bitdefender SRL" and action_module_path contains "log.dll" | filter actor_process_image_path not contains "Program Files\Bitdefender" | filter not actor_process_image_name in ("eps.rmm64.exe", "downloader.exe", "installer.exe", "epconsole.exe", "EPHost.exe", "epintegrationservice.exe", "EPPowerConsole.exe", "epprotectedservice.exe", "DiscoverySrv.exe", "epsecurityservice.exe", "EPSecurityService.exe", "epupdateservice.exe", "testinitsigs.exe", "EPHost.Integrity.exe", "WatchDog.exe", "ProductAgentService.exe", "EPLowPrivilegeWorker.exe", "Product.Configuration.Tool.exe", "eps.rmm.exe") |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
// Name: Chrysalis Mutex // Description: Identifies a Mutex known to be related to the chrysalis backdoor malware // MITRE TTP ID: T1480.002 config case_sensitive = false | dataset = xdr_data | fields _time, agent_hostname, actor_effective_username, actor_process_image_name, actor_process_image_path, actor_process_command_line, event_type, event_sub_type, action_syscall_string_params | filter event_type = ENUM.SYSTEM_CALL and event_sub_type = ENUM.SYSTEM_CALL_NT_CREATE_MUTANT | alter mutex = json_extract_scalar(action_syscall_string_params, "$.1") | filter mutex = "Global\\Jdhfv_1.0.1" |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
// Name: GUP.exe Writing Unusual Files to Temp Folder // Description: Detects cases where the Notepad++ updater (gup.exe) writes files to a temp folder that that deviate from the normal and expected. // MITRE TTP ID: T1036.005 config case_sensitive = false | dataset = xdr_data | fields _time, agent_hostname, event_type, event_sub_type, action_file_name, action_file_path, actor_effective_username, action_file_extension, action_file_previous_file_path, action_file_sha256, action_file_size, actor_process_image_name, actor_process_image_path, actor_process_command_line, actor_process_image_sha256, causality_actor_process_image_name, causality_actor_process_image_path, os_actor_primary_username, os_actor_process_command_line, os_actor_process_image_name, os_actor_process_image_path, agent_os_type | filter event_type = ENUM.FILE and event_sub_type = ENUM.FILE_WRITE | filter lowercase(actor_process_image_name) = "gup.exe" and action_file_sha256 != null | filter lowercase(actor_process_command_line) !~= "((\\notepad\+\+(?:_?x?\d+?)??|\\nppp?[\.\d]*?(?:portable)??(?:\.x64)??).*?\\plugins|-ihttps:\/\/notepad-plus-plus\.org\/update\/getdownloadurl\.php)" and lowercase(action_file_path) ~= "(\\appdata\\local\\temp\\|\\windows\\temp)" and lowercase(action_file_name) !~= "(npp[\.\d]+?installer)" | sort desc _time |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
// Name: GUP.exe Downloading Improperly Signed Installer // MITRE TTP ID: T1036.001 config case_sensitive = false | dataset = xdr_data | fields _time, agent_hostname, event_type, event_sub_type, action_process_username, action_process_user_sid, action_process_image_name, action_process_image_path, action_process_image_command_line, action_process_image_sha256, action_process_os_pid, action_process_cwd, action_process_file_info, action_process_file_size, action_process_file_web_mark, action_process_signature_vendor, action_process_signature_product, action_process_signature_status, actor_effective_username, actor_effective_user_sid, actor_process_image_name, actor_process_image_path, actor_process_command_line, actor_process_signature_vendor, actor_process_signature_product, actor_process_signature_status, causality_actor_primary_username, causality_actor_process_image_name, causality_actor_process_image_path, causality_actor_process_command_line, os_actor_primary_username, os_actor_process_image_name, os_actor_process_image_path, os_actor_process_image_command_line, os_actor_process_image_sha256, action_process_instance_id, actor_process_instance_id, causality_actor_process_instance_id, agent_os_type, agent_id | filter event_type = ENUM.PROCESS and event_sub_type = ENUM.PROCESS_START and _product = "XDR agent" and _vendor = "PANW" | filter lowercase(actor_process_image_name) = "gup.exe" and actor_process_signature_status not in (null, ENUM.UNSUPPORTED, ENUM.FAILED_TO_OBTAIN ) and action_process_signature_status not in (null, ENUM.UNSUPPORTED, ENUM.FAILED_TO_OBTAIN ) and action_process_image_sha256 not in ( "71431fa7b66f8132453e18e3a5f8ef0af3ca079a7793f828df06fdb5d7bd915d", "2dd5473736ef51e4340cae005e3fc8cdf0e42ec649bc6ed186484a79be409928", "a19aa1cd7ecb9ca3f1fd0e118fffd0d673fba404ced8c39c2e210a63b70f9c15", "e22abc9af328d063e652f0829819124a6a748c224bc8b10f98473f87cda2c0cd", "61c3077b989e272117167c90fc35e7f06bea4f992f3395b40ccee083d7258082", "49d2531893b09cb6a8e3429ca0a734e871a2d96fa2575c0eec3229d383fa233a", "32aa12d3c9521477a5a1e086e400ec0f77f8a97a8190806a0f1953688b883cfb", "8117c82a3821965d92ee3f9f3ae10efcd602bd4b6e52a2fe957d70aafe479744", "05abc57952974d08feafa399d6fdb37945a3fd0a10f37833dd837a5788e421d5", "c6d1e5aacbf69aa18df4caf1346fd69638491a5ad0085729bae91c662d1c62bb", "e1df78704001bba1a3d343f62a1242a4484ff6ad269170714263c03b802eb0b1", "7094a07167648628e47249a16d9d6db922e5aa1255ac4322a2e4900d233372dd" ) | filter lowercase(action_process_image_name) ~= "(npp[\.\d]+?installer)" | dedup agent_id by desc _time | filter action_process_signature_status != ENUM.SIGNED or lowercase(action_process_signature_vendor) != "notepad++" | sort desc _time |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
// Name: GUP.exe Spawning Unusual Subprocesses // Description: Detects cases where the Notepad++ updater (gup.exe) spawns child processes that deviate from the normal and expected. // MITRE TTP ID: T1202 config case_sensitive = false | dataset = xdr_data | fields _time, agent_hostname, event_type, event_sub_type, action_process_username, action_process_user_sid, action_process_image_name, action_process_image_path, action_process_image_command_line, action_process_image_sha256, action_process_os_pid, action_process_cwd, action_process_file_info, action_process_file_size, action_process_file_web_mark, action_process_signature_vendor, action_process_signature_product, action_process_signature_status, actor_effective_username, actor_effective_user_sid, actor_process_image_name, actor_process_image_path, actor_process_command_line, actor_process_signature_vendor, actor_process_signature_product, actor_process_signature_status, causality_actor_primary_username, causality_actor_process_image_name, causality_actor_process_image_path, causality_actor_process_command_line, os_actor_primary_username, os_actor_process_image_name, os_actor_process_image_path, os_actor_process_image_command_line, os_actor_process_image_sha256, action_process_instance_id, actor_process_instance_id, causality_actor_process_instance_id, agent_os_type, agent_id | filter event_type = ENUM.PROCESS and event_sub_type = ENUM.PROCESS_START | filter lowercase(actor_process_image_name) = "gup.exe" | filter lowercase(action_process_image_name) !~= "(npp[\.\d]+?installer|consent\.exe|explorer\.exe|werfault\.exe|smartscreen\.exe|adminbyrequest\.exe|openwith\.exe)" and lowercase(action_process_image_command_line) !~= "(https:\/\/notepad-plus-plus\.org\/|https:\/\/npp-user-manual\.org\/)" and lowercase(actor_process_command_line) !~= "(\\notepad\+\+\\plugins|https:\/\/notepad-plus-plus\.org\/)" | sort desc _time |
結論
今回のキャンペーンは、この種の脅威アクターの運用手法における顕著な進化を示しています。広範なインフラの事前配置から、高度に標的を絞った「ソフト」なサプライチェーン妨害へと舵を切ったことを意味しています。Volt TyphoonやSalt Typhoonといったグループによる最近のキャンペーンは、主に重要インフラの基幹部分やエッジデバイスの侵害に焦点を当て、Living-off-the-Land(自給自足)技術と最小限のマルウェアに依存していました。対照的に今回の作戦は、管理権限を持つ担当者を標的にするという、明確な戦略的優先順位を浮き彫りにしています。
ソフトウェアのビルドパイプラインにコードを注入するのではなく、信頼されたユーティリティのトラフィックフローをハイジャックすることで、脅威アクターはベンダーに気づかれることなく配信メカニズムを武器化することができました。このアドバーサリ・イン・ザ・ミドル(AitM)能力により、流入するアップデート要求の動的なフィンガープリント採取が可能となり、優先ターゲットを極めて選択的にフィルタリングすることが可能になりました。
このキャンペーンの目的は破壊ではなく、長期にわたる価値の高い情報の収集にあります。これは、地政学的に戦略的な多くの地域のシステム管理者や開発者に焦点を当てた選択的な被害者選定と、目立たない軽量なバックドアの使用を選択したことの組み合わせからも明らかです。
パロアルトネットワークスは、今回の発見をCyber Threat Alliance (CTA) のメンバーと共有しました。CTAのメンバーはこのインテリジェンスを活用して、顧客向けの保護を迅速に展開し、悪意のあるサイバーアクターを組織的に阻止しています。詳細は、Cyber Threat Allianceをご覧ください。
パロアルトネットワークスのお客様は、以下に示す当社製品によってより安全に保護されています。本脅威ブリーフについては、関連する新情報が入手でき次第、随時更新いたします。
Palo Alto Networks製品による保護
パロアルトネットワークスのお客様は、多様な製品保護機能とアップデートを活用して、この脅威を特定し、防御することができます。
侵害の疑いがある場合、または緊急の要件がある場合は、Unit 42インシデントレスポンスチームに連絡するか、以下にお電話ください。
- 日本: +81.50.1790.0200
- 北米: フリーダイヤル: +1 (866) 486-4842 (866.4.UNIT42)
- 英国: +44.20.3743.3660
- 欧州・中東: +31.20.299.3130
- アジア: +65.6983.8730
- オーストラリア: +61.2.4062.7950
- インド: 000 800 050 45107
- 韓国: +82.080.467.8774
Advanced WildFire
今回のリサーチで共有されたインジケーター(指標)を精査した結果、Advanced WildFire の機械学習モデルおよび解析手法のレビューとアップデートを実施しました。
Advanced Threat Preventionを備えた次世代ファイアウォール
Advanced Threat Preventionを備えた次世代ファイアウォールは、コモディティ脅威と標的型脅威の両方からネットワークを防御するように設計されています。
次世代ファイアウォール向けクラウド配信型セキュリティサービス
Advanced URL FilteringおよびAdvanced DNS Securityは、この活動に関連する既知のURLやドメインを悪意のあるものとして識別します。
Cortex XDRおよびXSIAM
Cortex XDRおよびXSIAMは、Malware Prevention Engineを採用することで、本記事で解説した脅威の防御を支援します。このアプローチでは、Advanced WildFire、Behavioral Threat Protection(振る舞いベースの脅威防御)、およびLocal Analysisモジュールを含む多層防御を組み合わせ、既知および未知の両方のマルウェアがエンドポイントに危害を加えるのを防ぎます。
Cortex Cloud
今回のキャンペーンで積極的に標的とされたクラウドホスティング業界の組織など、Cortex Cloudをご利用の組織は、クラウド環境内にCortex Cloud XDR endpoint agentやserverless agentsを適切に配置することで、本記事で言及されているマルウェアのダウンロードや実行からより安全に保護されます。
クラウドのポスチャ(セキュリティ状況)とランタイム運用をこれらの脅威から保護するように設計されたCortex Cloudは、本記事で論じている悪意のある操作、設定変更、または脆弱性悪用の検知・防御に役立ちます。
侵害指標 (IoC)
- 1f6d28370f4c2b13f3967b38f67f77eee7f5fba9e7743b6c66a8feb18ae8f33e
- a3cf1c86731703043b3614e085b9c8c224d4125370f420ad031ad63c14d6c3ec
- a511be5164dc1122fb5a7daa3eef9467e43d8458425b15a640235796006590c9
- skycloudcenter[.]com
- self-dns[.]it[.]com
- safe-dns[.]it[.]com
- cdncheck[.]it[.]com
- 95[.]179[.]213[.]0
- 45[.]76[.]155[.]202
- 45[.]77[.]31[.]210
- 61[.]4[.]102[.]97
- 59[.]110[.]7[.]32
- 95[.]179[.]213[.]0/update/AutoUpdater.exe
- 95[.]179[.]213[.]0/update/Upgrade.exe
- 45[.]32[.]144[.]255/update/update.exe
- 45[.]76[.]155[.]202/update/update.exe
- 59[.]110[.]7[.]32/dpixel
- self-dns[.]it[.]com/help/Get-Start
- self-dns[.]it[.]com/resolve
- self-dns[.]it[.]com/dns-query
- safe-dns[.]it[.]com/help/Get-Start
- safe-dns[.]it[.]com/resolve
- safe-dns[.]it[.]com/dns-query