This post is also available in: English (英語)
概要
マルウェア作者はつねに技術を磨き、検知をかいくぐってより巧妙な攻撃を実行しようとします。そうしたなかここ数年よく見かけるのが、署名されていないDLLをロードさせる手法です。
私たちは、持続的標的型攻撃者(Advanced Persistent Threats: APT)がこの手法を使っている可能性があると考え、そのハント(探索)を行いました。この結果、中国のサイバースパイグループStately Taurus(旧称PKPLUG 別名Mustang Panda)や北朝鮮のSelective Pisces(別名Lazarus Group)をはじめとするAPT攻撃グループと、洗練されたペイロードにより、実際の攻撃が広く行われている様子が確認されました。
そこで本稿では、署名されていないDLLのロードを検出することで、お客様の環境における攻撃や脅威発生源の特定につなげる方法を解説します。
パロアルトネットワークスのお客様は、Cortex XDRのエージェントを通じ、悪性DLLのロードに対する保護と検出を受けています。
本稿で扱う脅威アクターグループ名 | |
Unit 42による追跡名 | 別名 |
Stately Taurus | Mustang Panda, PKPLUG, BRONZE PRESIDENT, HoneyMyte, Red Lich, Baijiu |
Selective Pisces | Lazarus Group, ZINC, APT - C - 26 |
目次
悪性DLL: 感染システム上での悪性ペイロード実行によく使われる手法
署名されていないDLLに関連して実地に観測された攻撃の傾向
ペイロードを選んで深堀りしてみる
Stately Taurus (旧称 PKPLUG 別名 Mustang Panda)
Selective Pisces (別名 Lazarus Group)
Raspberry Robin
署名されていないDLLを使って自社環境内の攻撃をハントする方法
ハント用クエリ
結論
悪性DLL: 感染システム上での悪性ペイロード実行によく使われる手法
私たちは、長年にわたるプロアクティブな脅威ハント経験から、「悪性DLLのロードは感染システム上で悪性ペイロードを実行する主たる方法のひとつ」という仮説をたてました。個人のハッカーもAPT攻撃グループもこの手法を使っていることから、この仮説に基づいたリサーチを行ってみることにしました。
私たちが実際に目にする悪性DLLの多くには、次の3つの特徴が共通して見られます。
- ほとんどが特権をもたないパスに書き込まれる
- 署名されていない
- 署名されているプロセスにロードさせることで検出を回避する。そのさいはDLLをロードする専用ユーティリティ(rundll32.exeなど)を使うこともあるし、アクティビティの一環としてDLLをロードする実行ファイルを使うこともある
これらを踏まえ、脅威アクターがよく使う手法は次のようなものであることがわかりました。
- rundll32.exeやregsvr32.exeによるDLLのロード: これらのプロセスは署名された既知のバイナリですが、これらを悪用することで検出を回避しつつコードを実行しようとします。
- DLL検索順ハイジャック: 正規プロセスの検索順序を悪用して悪質DLLをロードさせる手法です。この手法では、既知のDLLと同じ名前のつけられた悪質ペイロードを良性アプリケーションがロードします。
上記の手法による実地観測結果を検証したところ、署名されていない悪性DLLのロード元となる特権なしのパスとして、ProgramData、AppData、ユーザーのホームディレクトリのフォルダとサブフォルダがもっともよく使われていることがわかりました。
次のセクションでは上記の仮説に基づいて得られた知見を紹介します。
署名されていないDLLに関連して実地に観測された攻撃の傾向
先の仮説に基づいてハントを行うにあたり、XQLクエリを2つ作成しました。1つめはrundll32.exeかregsvr32.exeがロードした署名されていないDLLを探すクエリで、2つめは署名されていないDLLをロードする署名されたソフトウェアを探すクエリです。
このハントの結果、署名されていないDLLのロードを行うマルウェアファミリがいろいろ発見されました。図1は過去6ヶ月間(2022年2月~8月)に弊社がこれらの手法で検出したマルウェアを示したものです。
上記の脅威が使う実行テクニックを分析したところ、金融系のトロイの木馬(バンキングトロージャン)や個人の脅威アクターは悪性DLLのロードにrundll32.exeかregsvr32.exeを使うケースが多く、APT攻撃グループはたいていDLLサイドローディング手法を使っていることがわかりました。
ペイロードを選んで深堀りしてみる
Stately Taurus
今回はある組織の環境内で検出されたStately Taurusによるアクティビティを中心に調査することにしました。Stately Taurusは政府組織以外の組織を標的とすることが多い中国のAPTグループで、ペイロードのロードに正規ソフトウェアを悪用することで知られています。
この事例ではDLL検索順序ハイジャック手法で攻撃者の悪性DLLを正規プロセスのメモリ空間にロードさせている様子が確認されました。DLLサイドローディングには、ウイルス対策ソフトやPDFリーダーなどの複数のサードパーティソフトウェアが使われていました。
DLLサイドローディング実行にあたり、同グループはペイロードをProgramDataフォルダにドロップし、そのなかにDLLハイジャック用の良性の実行形式ファイル(AvastSvc.exe)、DLL ファイル(wsc.dll)、暗号化されたペイロード(AvastAuth.dat)という3つのファイルを含めていました。ロードされたDLLはPlugX RATと見られ、これが.datファイルから暗号化されたペイロードをロードしていました。
Selective Pisces
またこのハント用クエリを実行すると、ProgramDataディレクトリ内(図4)に、エントロピーの高い悪性モジュールが複数特定されました。
図4に示した署名されていないモジュールの実行チェーンを調査したところ、署名のついたDreamSecurity MagicLine4NXプロセス(MagicLine4NX.exe)によってディスクにドロップされていたことがわかりました。
このMagicLine4NX.exeが第2段階のペイロードを実行していましたが、このさい、検出避けにDLLサイドローディングを使っている様子が観測されています。この第2段階のペイロードは、mi.dllという名前の新たなDLLを書きこみ、wsmprovhost.exe(WinRMのホストプロセス)をProgramData内のランダムなディレクトリにコピーしていました。Wsmprovhost.exeはWindowsネイティブのバイナリで、同一ディレクトリ内にあるmi.dllをロードしようとします。攻撃者はこのしくみを悪用し、このプロセスを使ってDLLサイドローディング(T1574.002)を実現していました。
このmi.dllというペイロードは、ualapi.dllというさらにべつのペイロードをSystem32ディレクトリ(C:\Windows\System32\ualapi.dll)にドロップする様子が確認されています。このケースでは、System32ディレクトリ内にualapi.dllというDLLは存在していませんでした。攻撃者はこの事実を利用し、悪質ペイロードにualapi.dllという名前を付けることで永続性を確保していました。こうしておけば、spoolsv.exeが起動時に当該DLLをロードしてくれます。
上記ペイロードを分析したところ、これはUnit 42がSelective Piscesの名前で追跡している北朝鮮APT攻撃グループに帰属するものであることが判明しました。同グループがMagicLine4NXのような正規サードパーティソフトウェアを使うことは、今年のはじめにSymantecも同社のブログで解説しています。
Raspberry Robin
最後に、私たちがフィールドでもっともよく目にした攻撃方法を詳しく解説しておきたいと思います。
私たちがクエリから得た結果には、いくつかの特徴が共通して見られます。
- 適当な文字を並べ変えた名前をもつDLLが、ProgramDataフォルダ以下またはAppDataフォルダ以下のランダムなサブフォルダに存在する
- 似たようなエントロピー範囲をもつ(0.66前後)
- いずれもrundll32.exeかregsvr32.exeでロードされている
例: RUNDLL32.EXE C:\ProgramData\<random_folder>\fhcplow_Tudjdm.dll,iarws_sbv
これらの攻撃で行われていたDLLローディングアクティビティは、最近Red Canaryが解説したRaspberry Robinと呼ばれるキャンペーンに帰属するものです。
これらの攻撃は感染USBデバイス上のショートカットファイルから始まります。このショートカットファイルがmsiexec.exeのプロセスを作成してリモートのC2サーバーから悪性DLLを取得します。インストール後はスケジュールタスクが作成され、このタスクでシステム起動時にrundll32.exe/regsvr32.exeでDLLをロードすることにより、永続性を確保します。
署名されていないDLLを使って自社環境内の攻撃をハントする方法
Cortex XDRのXQL Searchを使うと、署名されていないDLLのロードをハント可能です。
結果を絞り込むには以下の点に着目することをお勧めします。
- DLLサイドローディングの有無: 標準のディレクトリ以外に置かれている既知のサードパーティ製ソフトウェアが存在しないか注意する
- ファイルのエントロピーはどのぐらいか: エントロピーの高いバイナリには、実行中に抽出されるパックされたセクションが含まれる可能性がある
- 実行頻度はどのぐらいか: 実行頻度が高い場合、定期的に発生する正当な活動を示している可能性がある。頻度が低い場合、それが調査の手がかりとなる可能性がある
- ファイルパスはどうなっているか: ファイル名が適当な文字の綴り変えで構成されているフォルダやファイルを含む場合はそうでない場合より疑わしいと言える
図6は次のセクションで解説するクエリの結果の一部を、モジュールのエントロピー順にソートしたものです。最初の2行がEmotetの実行例で、ほかは良性のDLLです。
ハント用クエリ
1 2 3 4 5 6 7 8 9 |
// rundll32.exeまたはregsvr32.exeが過去30日間に通常以外のフォルダから署名されていないモジュールをロードしていたかどうかを確認する config case_sensitive = false timeframe = 30d | dataset = xdr_data | filter event_type = ENUM.LOAD_IMAGE and (action_module_path contains "C:\ProgramData" or action_module_path contains "\public" or action_module_path contains "\documents" or action_module_path contains "\pictures" or action_module_path contains "\videos" or action_module_path contains "appdata") and action_module_signature_status = 3 and (actor_process_image_name contains "rundll32.exe" or actor_process_image_name contains "regsvr32.exe") and (actor_process_command_line contains "programdata" or actor_process_command_line contains "\public" or actor_process_command_line contains "\documents" or actor_process_command_line contains "\pictures" or actor_process_command_line contains "\videos" or actor_process_command_line contains "appdata") | alter module_entropy = json_extract_scalar(action_module_file_info, "$.entropy") | fields agent_hostname , action_module_sha256 , action_module_path , actor_process_image_name, actor_process_command_line, module_entropy | comp count (action_module_path) as counter by action_module_path , action_module_sha256 , module_entropy |
1 2 3 4 5 6 7 8 |
// DLLサイドローディングの可能性確認: 署名つきのプロセスが過去30日間に署名されていないDLLをAppData\ProgramData\Publicフォルダからロードしていたかどうかを確認する config case_sensitive = false timeframe = 30d | dataset = xdr_data | filter event_type = ENUM.LOAD_IMAGE and (action_module_path contains "C:\ProgramData" or action_module_path contains "\public" or action_module_path contains "appdata") and action_module_signature_status = 3 and (actor_process_image_name not contains "rundll32.exe" or actor_process_image_name not contains "regsvr32.exe") and actor_process_signature_status = 1 and (actor_process_image_path contains "appdata" or actor_process_image_path contains "programdata" or actor_process_image_path contains "public" ) | alter module_entropy = json_extract_scalar(action_module_file_info, "$.entropy") | fields agent_hostname , action_module_sha256 , action_module_path , actor_process_image_name, actor_process_command_line, module_entropy, actor_process_image_path | comp count (action_module_path) as counter by action_module_path , action_module_sha256 , module_entropy, actor_process_image_path |
結論
悪性DLLをブロックする検出技術は対象モジュールのメモリロード後の振る舞いに依存して行われることが多く、これが悪性モジュールブロックの足かせになってしまうことがあります。
そうした場合でも、本稿で紹介したようなハンティング手法を使えば、署名されていない悪性DLLをプロアクティブに発見できます。
また正規ソフトウェアや振る舞いの観点からネットワークのベースラインを知っておけば、上記クエリで生成される結果の数を絞り込み、疑わしいものに集中できます。
Cortex XDRは、振る舞い脅威防御(Behavioral Threat Protection: BTP)やAnalyticsモジュールを使い、既知のハイジャック技術によってロードされた悪性DLLに対してアラートを発報してブロックし、エクスプロイト後のアクティビティを防止できます。
Stately Taurus関連のIoC(侵害指標)とTTPの指標はATOMでStately Taurusを確認してください。
侵害の懸念があり弊社にインシデントレスポンスに関するご相談をなさりたい場合は、infojapan@paloaltonetworks.com まで電子メールにてご連絡ください(ご相談は弊社製品のお客様には限定されません)。
IoC
脅威アクター | SHA256 |
Selective Pisces | 779a6772d4d35e1b0018a03b75cc6f992d79511321def35956f485debedf1493 |
Selective Pisces | d9b1ad70c0a043d034f8eecd55a8290160227ea66780ccc65d0ffb2ebc2fb787 |
Selective Pisces | 3131985fa7394fa9dbd9c9b26e15ac478a438a57617f1567dc32c35b388c2f60 |
Selective Pisces | 5be717dc9eda4df099e090f2a59c25372d6775e7d6551b21f385cf372247c2fd |
Selective Pisces | 18cc18d02742da3fa88fc8c45fe915d58abb52d3183b270c0f84ae5ff68cf8a2 |
Selective Pisces | 7aa62af5a55022fd89b3f0c025ea508128a03aab5bc7f92787b30a3e9bc5c6e4 |
Selective Pisces | 79b7964bde948b70a7c3869d34fe5d5205e6259d77d9ac7451727d68a751aa7d |
Selective Pisces | cf9ccba037f807c5be523528ed25cee7fbe4733ec19189e393d17f92e76ffccc |
Selective Pisces | 32449fd81cc4f85213ed791478ec941075ff95bb544ba64fa08550dd8af77b69 |
Selective Pisces | 5a8b1f003ae566a8e443623a18c1f1027ec46463c5c5b413c48d91ca1181dbf7 |
Selective Pisces | 5bb4950a05a46f7d377a3a8483484222a8ff59eafdf34460c4b1186984354cf9 |
Stately Taurus | 352fb4985fdd150d251ff9e20ca14023eab4f2888e481cbd8370c4ed40cfbb9a |
Stately Taurus | 6491c646397025bf02709f1bd3025f1622abdc89b550ac38ce6fac938353b954 |
Stately Taurus | e8f55d0f327fd1d5f26428b890ef7fe878e135d494acda24ef01c695a2e9136d |
Raspberry Robin | 06f11ea2d7d566e33ed414993da00ac205793af6851a2d6f809ff845a2b39f57 |
Raspberry Robin | 202dab603585f600dbd884cb5bd5bf010d66cab9133b323c50b050cc1d6a1795 |
Raspberry Robin | f9e4627733e034cfc1c589afd2f6558a158a349290c9ea772d338c38d5a02f0e |
Raspberry Robin | 9fad2f59737721c26fc2a125e18dd67b92493a1220a8bbda91e073c0441437a9 |
Raspberry Robin | 9973045c0489a0382db84aef6356414ef29814334ecbf6639f55c3bec4f8738f |
表1 サンプルのハッシュ