This post is also available in: English (英語)
概要
ほかの多くの複雑なソフトウェア システムと同じく、マルウェアもソフトウェアの構成 (configuration) という概念に依存しています。あるマルウェアがどのように振る舞うのか、そのガイドラインを決めているのがこうした構成で、私たちが調査しているさまざまなマルウェア ファミリーも、構成機能を持つものがよく見られます。マルウェアに埋め込まれた構成データからは、サイバー犯罪者らの意図について、貴重な洞察をもらえます。反面、その重要性がゆえに、マルウェア作者は意図的にファイルから静的な構成データ解析をしづらいようにしています。
ここ数年、私たちはマルウェア内部の構成を抽出するシステムを開発してきました。私たちは、複数のマルウェア ファミリー用に作成された抽出ツールのコードをリサーチ コミュニティと共有します。Python で書かれたこれらの抽出ツールは、特定マルウェア サンプルに関連するメモリー ダンプから、その構成データをスキャン・抽出するように設計されています。
また、GuLoader、RedLine Stealer の 2 つのマルウェア ファミリーが採用している構成保護技術についても紹介します。詳細は、ロンドンで開催された Virus Bulletin 2023 で私たちが発表した ホワイトペーパー、スライド、ビデオをご覧ください。
パロアルトネットワークスのお客様は、WildFireを含むクラウド配信型セキュリティサービスを備えた次世代ファイアウォールにより、これらの脅威に対し、さらに強力な保護を受けています。侵害の懸念があり弊社にインシデントレスポンスに関するご相談をなさりたい場合は、こちらのフォームからご連絡いただくか、infojapan@paloaltonetworks.comまでメールにてご連絡いただくか、下記の電話番号までお問い合わせください(ご相談は弊社製品のお客様には限定されません)。
関連する Unit 42 のトピック | Malware, Memory Detection, RedLine Stealer, GuLoader |
GuLoader の技術分析
GuLoader の作者らは C2 構成の難読化に多大な労力を費やしていました。図 1 は、GuLoader の難読化技術の変遷を示したタイムラインです。
GuLoader マルウェアの構成を抽出する私たちの以前のアプローチはこうした技術の推移を受けて使えなくなりました。GuLoader の作者の新たな技術には、暗号文の分割や制御フローの難読化などがあります。
暗号文の分割
図 2 の一番上の部分をご覧ください。ここでは、暗号化された構成データ (暗号文) を保存する GuLoader の以前の方法を「旧方式」としています。この旧方式では、暗号文が連続したバイト列として保存されています。
図 2 下側の図に新たなアプローチを GuLoader の「新方式」として示しています。このアプローチでは関数での計算から暗号文を得ています。この関数では、まず暗号文が 4 バイトの DWORD に分割されます。各 DWORD はランダム化された数学演算を用いて個別に暗号化されます。
たとえば、GuLoader の新方式から暗号文最初の DWORD を取り出すには、図 3 に示した数学演算を実行しなければなりません。
この新方式での完全な暗号文を取得するため、私たちは個々の DWORD に対して上の図 3 に示した方法と同様の一連の演算を実行しています。その後、これらの DWORD 値を連結し、完全な暗号文を得ています。
制御フローの難読化
2023 年の初め、私たちは、当初の VirusTotal (VT) 検出数がゼロだった GuLoader サンプルを見つけました。Hex-Rays IDA Pro を使ってこのマルウェアのサンプルを逆アセンブルして解析したところ、それ以上の解析を妨げようとする命令 (instruction) が見つかりました。これらの解析対策命令は、EXCEPTION_BREAKPOINT、EXCEPTION_ACCESS_VIOLATION、EXCEPTION_SINGLE_STEP などの違反を引き起こすように設計されていました。
図 4 は GuLoader が解析対策のためにこれらすべての命令をどのように実装していたかを示したものです。
上の図 4 で指摘した解析対策命令のせいで、IDA プロセッサ モジュール拡張を書くという私たちの以前の解決策が無効になってしまいました。Intel x86 CPU の命令長は可変なので、EXCEPTION_ACCESS_VIOLATION や EXCEPTION_SINGLE_STEP といった例外をトリガーする膨大な命令の組み合わせを検出できなかったのです。
以前の解決策が使えなくなったため、私たちは手作業でコードを解析し、これら解析対策命令を見つけてバイパスし、構成を抽出せねばなりませんでした。どのように構成を抽出したかは、Virus Bulletin のホワイトペーパーで詳しく説明しています。
RedLine Stealer の技術分析
この分析で使用した RedLine Stealer サンプルの SHA256 ハッシュは a4cf69f849e9ea0ab4eba1cdc1ef2a973591bc7bb55901fdbceb412fb1147ef9 です。dnSpy という MSIL デコンパイラーを使うと構成データをすばやく特定できます (図 5)。
私たちは Python で復号ルーチンを実装しました (図 6)。読者の皆さんにはぜひ、手動で暗号文と鍵のサンプルを取得し、図 6 のスクリプトで復号がうまくいくかどうかをテストしていただければと思います。
次は、構成 (図 7 と図 8) の場所を突き止め、Python で復号関数を準備します。ただし、データを復号する前に、dnSpy が生成した逆コンパイルの結果から、暗号文とキーを手動で取得しなければなりませんでした。
C でコードを書く場合、システム メモリーに直接アクセスすることから、C コードからコンパイルした実行可能ファイルを「ネイティブ実行可能ファイル (native executable)」と呼ぶことがあります。一方、.NET MSIL ではすべてがマネージドです。ネイティブ C コードの場合、あるポインターはバイナリーのどこかに格納された文字配列へとつながります。ところが、コンパイルされた MSIL の場合、私たちが目にするのはトークンだけです。
これらのトークンにアクセスするさい、ランタイム ライブラリー (CLR) が暗号文が実際にどこに格納されているかをパースしてくれます。おかげで、アナリストの心配ごとが 1 つ減ります。たとえば、図 7 で dnSpy が生成したコメントは、文字列 IP がトークン番号 0x04000013 であることを示しています。
次に、IDA Pro でこの RedLine Stealer サンプルを開き、同じ関数に移動します。図 8 は、ldstr コマンドが、seg000:29F1、seg000:29FB、seg000:2A05、seg000:2A0F に格納されているメタデータ文字列へのオブジェクト参照をプッシュしているようすです。図 8 ではオブジェクト参照を黒い四角で囲んでいます。
これらのメタデータ文字列はそれぞれ、seg000:29F6、seg000:2A00、seg000:2A0A、seg000:2A14 に格納されている命令によってセットされています。stsfld 命令は、静的フィールドの値を評価スタックの値に置き換えます。各フィールドの評価スタック上の値は赤枠で囲ってあります。
図 7 の IP フィールドだけでは構成を静的に抽出できません。この IP フィールド用にスタックにプッシュされた文字列がどこから来ているのかは、まだ特定されていません。Microsoft によれば、図 8 に示した ldstr 命令のオペランド タイプは文字列トークンで、文字列トークンは #US (User-Stream) テーブルに格納されているようです。
この文字列トークンを見つけるため、私たちは PEfile の .NET 版のような dnfile というオープンソース ライブラリーを使いました。Dnfile を使えば、.NET のランタイム識別子 (RID) を与えるだけで、#US トークンに簡単にアクセスできます。Dnfile はまた、ユーザー ストリームにアクセスするためのインターフェイスやそのほかさまざまなものを提供しています。
図 9 に示した Python の実装は、オフセットによりユーザー ストリームにアクセスする方法の例です。トークンによってユーザー ストリームを得た後、図 9 に示す復号ルーチンにそのユーザー文字列を渡します。これで復号された構成が返るはずです。
結論
本稿では GuLoader と RedLine Stealer で使われている手法を掘り下げて、さまざまなマルウェア ファミリーの C2 構成の場所を特定し、抽出するプロセスを取り上げました。
これらのマルウェア構成解析から得た知見を活用すれば、悪意のあるソフトウェアに対する検出力、解析力、効果的対策の開発力を高められます。継続的な協力と知識の共有を通じて、私たちは団結してサイバー犯罪者に一歩先んじてデジタル システムやネットワークを守ることができます。
パロアルトネットワークスのお客様は、以下の製品を通じて、本稿で取り上げた脅威からさらに強力に保護されています。
- WildFireなどクラウド配信型セキュリティサービスを有効にした次世代ファイアウォールは本稿で解説したファイルを悪意のあるものとして検出します。
侵害の懸念があり弊社にインシデントレスポンスに関するご相談をなさりたい場合は、こちらのフォームからご連絡いただくか、infojapan@paloaltonetworks.comまでメールにてご連絡いただくか、下記の電話番号までお問い合わせください(ご相談は弊社製品のお客様には限定されません)。
- 北米フリーダイヤル: 866.486.4842 (866.4.UNIT42)
- EMEA: +31.20.299.3130
- APAC: +65.6983.8730
- 日本: (+81) 50-1790-0200
パロアルトネットワークスは、これらの調査結果を Cyber Threat Alliance (CTA: サイバー脅威アライアンス) のメンバーと共有しました。CTA のメンバーはこのインテリジェンスを使って、お客様に保護を迅速に提供し、悪意のあるサイバー攻撃者を体系的に阻害できます。詳細は Cyber Threat Alliance にてご確認ください。
IoC (侵害指標)
本稿で分析した GuLoader サンプルの SHA256 ハッシュ
- 32ea41ff050f09d0b92967588a131e0a170cb46baf7ee58d03277d09336f89d9
本稿で分析した RedLine Stealer サンプルの SHA256 ハッシュ
- a4cf69f849e9ea0ab4eba1cdc1ef2a973591bc7bb55901fdbceb412fb1147ef9