This post is also available in: English (英語)
概要
本稿では「DoubleZero」という名前の.NETワイパーの分析を例にとり、ファイル内の特定の構造にもとづいて.NETサンプルの悪性度を予測する機械学習モデルについて解説します。同脅威をPEの構造解析で検出する上での課題を特定した後、検出時に機械学習モデルが拾いあげた手がかりを検証し、結論を述べてしめくくります。
ワイパー(データを破壊ないし消去するマルウェア)はとくに目新しい脅威ではありませんが、ロシア・ウクライナ間で進行中のサイバー活動関連で新たなワイパーがここのところ複数発見されていることから、ワイパーの利用を特定して防御する方法について世間の関心がふたたび高まっています。
パロアルトネットワークスのお客様は、WildFireや高度な脅威防御などのクラウド型セキュリティサービスを有効にした次世代ファイアウォールとCortex XDRにより.NETマルウェアからの保護を受けています。
関連するUnit 42のトピック | Machine Learning, WildFire, .NET Framework |
DoubleZero Wiperとは
DoubleZero Wiperは2022年3月にウクライナのCERTが公開したワイパーです。HermeticWiper、IsaacWiper、CaddyWiperなど、数多あるワイパーの1つで、同国が標的となっていたようです。
DoubleZeroはC#で実装され、幾重にも難読化されています。このワイパーは、以下のような典型的な非可逆的かつ破壊的な動作が可能です。
- 対象ホスト上で最高の特権を奪取する
- 各ボリュームからすべての標的となるファイルをあるだけ探し出す
- 対象ファイルやディスクボリュームを短時間で破壊する
HermeticWiperなどのワイパーがMBR (Master Boot Record)やGPT (GUIDパーティションテーブル)を破壊するのとは異なり、DoubleZeroは選んだファイルの先頭4,096バイトのみをファイルシステムドライバでワイプ(消去)します。私たちは本稿ではこの特定.NET サンプルの特徴量エンジニアリングのみを取り扱います。Splunkによる記事は、同ワイパーサンプルのより詳細な技術的分析を行っています。
SHA256 | 3b2e708eaa4744c76a633391cf2c983f4a098b46436525619e5ea44e105355fe |
ファイルサイズ | 419.50KB |
PEファイルの構造を調べる
リサーチャーの間では長年、Microsoft WindowsのPortable Executable(PE)マルウェアの検出にPEのファイル構造を使うのが一般的でした。この戦術の背景には「同一マルウェアファミリの亜種はファイル構造が似る傾向がある」という考えがあります。
機械学習モデルもファイル構造にもとづいてPEマルウェアを検出します。そのためこれまでは、PEヘッダの特徴、インポート、セクションの属性を使って、既知のマルウェアの特徴を認識してきました。
.NET PEファイル構造はPEフォーマットをベースにしていますが、その機能の多くは.NET特有の構造内にエンコードされています。次のセクションでは、.NETの構造的属性について深く掘り下げていきます。
.NETファイルの内部を見る
.NETオープンソースフレームワークは2002年に導入され、ほとんどのMicrosoft Windowsプラットフォームでデフォルトで利用可能です。このフレームワークのおかげで、開発者はその強力な組み込みメソッドを使って、インターネットやファイルシステム、暗号化などにアクセスできます。こうしたオプションが何もしなくても利用可能な状態になっているということが、システム管理者にとってもマルウェア作者にとっても同フレームワークを魅力的なものにしています。
フレームワークさえ利用可能な状態になっていれば、Microsoft WindowsのPEローダーは.NETサンプルをロードして実行する方法をすでに知っていることになります。これは、.NETアセンブリがPEファイルのフォーマットを再利用するからです。
コード生成の際、.NET互換の言語のソースコードは、プラットフォームに依存しない共通中間言語(Common Intermediate Language: CIL)のバイトコードにコンパイルされます。Cor20ヘッダを参照するための特別な.NET IMAGE_DIRECTORY_ENTRY_COM_DESCRIPTORは、データディレクトリに存在します(図1参照)。Cor20ヘッダ(別名CLRヘッダ)には、バージョン情報やリソース情報、メタデータヘッダの位置など、.NET特有の情報が含まれています。リソース、ストリーム、型参照、メソッド、CILバイトコード、外部アセンブリの使用状況などは、すべてメタデータに記録されています。より詳細な説明はdotnetfileの記事を参照してください。
依存ライブラリやAPIがインポートテーブルにある多くのPEファイルとは異なり、.NETファイルのインポートテーブルには単一モジュール(mscoree.dll)と単一インポート関数(実行ファイルでは_CorExeMain、ダイナミックロードライブラリでは_CorDllMain)だけが含まれています。リソースは.rsrcセクションではなく.NETのストレージストリーム内に含まれています。
PEヘッダのエントリポイントはmscoree.dllの_CorExeMainないし_CorDllMainを指していますが、実際のエントリポイントはCor20ヘッダ内に見つかります(図2)。したがって、PEマルウェアファイルの識別にもっとも有用な属性の一部は.NETマルウェアについてはあまり手がかりをくれない場合があります。
メタデータテーブル内には、Module、MethodDef、Assemblyなどのテーブルが定義されています。PEファイルの構造だけを調べる場合と比べ、.NETのファイル構造を調べれば、当該ファイルに関する情報をもっとたくさん得られることがわかります。私たちは、.NETの機械学習ソリューションに一般的なPEの特徴量だけを使うのではなく、とくに.NETサンプル群の構造をパースして得られたデータを追加しました。こうしてカスタマイズした特徴量は、弊社の機械学習ソリューションの品質向上に貢献しています。
.NETマルウェア検出に機械学習を応用する
私たちは、機械学習モデルに、.NETサンプルのPEファイル構造、.NETファイル構造、そのほかのファイルの特徴を学習したカスタム特徴量についての学習をさせました(図3)。
.NETは顧客環境で頻繁に使われているファイルタイプのため、支障をきたすような誤検出の発生に備え、短時間で対応する必要があります。つまり、リサーチャーはこのモデルの機能をよく理解する必要があるし、予測はリバースエンジニアリングが可能でなければなりません。
.NETファイルはあまりにもありふれているので、良性サンプルと悪性サンプルの分布は非常にアンバランスです。したがって私たちが学習させたモデルは、検出精度を維持しつつ、誤検出率は極めて低く抑える必要があります。
DoubleZero Wiperを検出する
このマルウェアのサンプルはほかの.NET実行ファイル同様、mscoree.dllの_CorExeMainという単一のインポートを持ちます。これには.textセクションと.relocセクションのみが含まれています。これらのセクションはすべてPEファイルフォーマットに固有で、そのエントロピーはかなり低めです。したがって、このファイルのPE構造から学習できることはあまりありません。
CILバイトコードは、パターンベース検出に不可欠の文字列リソースを隠すために難読化を使っています。また実際のオペレーションの間にガベージコードを混ぜ込んだり、制御フローを平坦化したりしてコードを追いづらくしています。それでも、逆コンパイルしたコードに存在するインポートライブラリや関連するAPI呼び出しを観察すれば、このマルウェアの目的について多くのことが読み取れます。
System.DirectoryServices.ActiveDirectoryやSystem.Security.AccessControlをインポートしていることから、Active Directoryやファイルのアクセスコントロール属性とやりとりする意図があることがわかります。
System.Text.RegularExpressionsが正規表現の関数をインポートしていますが、これは特定のファイルをパターン検索するときに使われるものです。
悪性コードの利用をもっとも顕著に示す指標はアンマネージDLL関数の呼び出しです。プラットフォーム呼び出し (P/Invoke)を使うと.NETのマネージコードからアンマネージ関数を呼び出せるようになります。低レベルAPIの直接呼び出しは、サンドボックスによるAPIフックを回避する解析対策技術としてよく知られています。このサンプルは以下のアンマネージAPIを使っています。
- ntdll.ntopenfile
- ntdll.ntfscontrolfile
- ntdll.rtlntstatustodoserror
- ntdll.rtladjustprivilege
- kernel32.closehandle
- kernel32.getfilesizeex
- kernel32.getlasterror
- user32.exitwindowsex
ほとんどのユースケースでは、.NETランタイムライブラリにこれらと同等のことができるマネージ関数があるのでそれらを使えばよいはずですが、このサンプルはntdll.dll内のアンマネージAPIの一部を使うことで、より低レベルでの動作を意図しています。
標的となるファイルや正規表現のパターンは意外にも平文で格納されています(図4)。脅威アクターによるこの潜在的なミスからは、同サンプルの目的に関するさらに深い洞察が得られます。
難読化はされていますが、ntdll.NtFsControlFileの呼び出しに対する引数FsControlCodeは0x980c8 = FSCTL_SET_ZERO_DATAであることがわかります。これが、ワイパーがntdll.NtOpenFileで開いた標的ファイルに4K分のNullバイトを書き込む方法です。
このサンプルでは、特権定数9、17、18、19を指定してntdll.RtlAdjustPrivilegeを複数回呼び出しています。これらの特権定数はそれぞれ、SeTakeOwnershipPrivilege、SeBackupPrivilege、SeRestorePrivilege、SeShutdownPrivilegeにあたります。ワイパーはこれらの特権を使って標的となるファイルを破壊し、すべてのアクションが終了した後にシステムを再起動する権限を確保しています。
LockBitのようなランサムウェアやHermeticWiperとは異なり、DoubleZeroは被害を受けたファイルの復旧に利用されうるシャドウコピーを削除しません。ただしこのワイパーはlsassという名前のプロセスをすべて終了させます。LsassはWindowsシステムにとっては重要なので、このプロセスを停止させるようなアプリケーションは悪意のあるものである可能性が高いでしょう。
前述のファイルの特徴は機械学習モデルがサンプルを検出する手がかりとなります。難読化は悪意のある.NETファイルにはよく見られますが、このサンプルの場合、アンマネージAPIを複数使っていること、センシティブな標的パスのパターンを使っていることなどが潜在的な悪性度の指標として際立っています。
結論
マルウェアファミリは亜種間でファイル構造が似る傾向があるので、リサーチャーは何年も前からPEファイルの構造を亜種の検出に利用してきました。ただ、.NETフレームワークの場合、フレームワーク自体は著名なものの、PEファイルと同じ戦略でファイルを検出するのがなかなか難しく、PEマルウェアのファイル識別では有用な属性のなかには.NETマルウェアの識別においてはたいした手がかりにならない場合があります。
本稿では、.NETサンプルとPEのサンプルの根本的な違いを浮き彫りにすることで、手がかりがどこに隠れているかを特定するヒントを提供しました。またそのさい、.NET特有のデータ構造を正しく解析すれば機械学習の特徴量エンジニアリングを向上させられることについても解説しました。
また、インポートライブラリやアンマネージAPIの呼び出し、暗号化されていない文字列が本.NETマルウェアの検出に最も有用な特徴量であることを示しました。本稿はDoubleZeroという最近のワイパーを例にとって分析しましたが、.NETの検出で重要となる特徴量は汎用化できるので、今後の研究活動に広く役立つことでしょう。
パロアルトネットワークスのお客様は、WildFireや高度な脅威防御などのクラウド型セキュリティサービスを有効にした次世代ファイアウォールとCortex XDRにより.NETマルウェアからの保護を受けています。
IoC
3b2e708eaa4744c76a633391cf2c983f4a098b46436525619e5ea44e105355fe
追加リソース
DoubleZero Wiperとは
Threat Update DoubleZero Destructor
HermeticWiper
IsaacWiper and HermeticWizard
CaddyWiper
dotnetfileオープンソースPythonライブラリ: .NET PEファイルの解析がかつてないほど簡単に