マルウェア

GuLoader、RedLine Stealer など解析対策を施したマルウェアから構成データを抽出する

Clock Icon 3 min read

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 の難読化技術の変遷を示したタイムラインです。

画像 1 は、GuLoader が使用する難読化技術のタイムラインです。2020 年: ありふれた場所に隠れるHTTP という文字列を検索すれば C2 URL が見つかる2022 年: C2 URL を暗号化し「HTTP」からは始めなくなる2022 年第 4 四半期: 暗号文を分割。実際に暗号文を使う前に、関数を使ってブロック単位で復号する必要がある2023 年第 1 四半期: 制御フローを難読化。制御フロー難読化を段階的に適用し、暗号文を入手しづらいようにする
図 1. GuLoader による難読化技術利用の変遷

GuLoader マルウェアの構成を抽出する私たちの以前のアプローチはこうした技術の推移を受けて使えなくなりました。GuLoader の作者の新たな技術には、暗号文の分割制御フローの難読化などがあります。

暗号文の分割

図 2 の一番上の部分をご覧ください。ここでは、暗号化された構成データ (暗号文) を保存する GuLoader の以前の方法を「旧方式」としています。この旧方式では、暗号文が連続したバイト列として保存されています。

画像 2 は 2 枚のスクリーンショットを重ねたものです。1 つめは暗号文保存の旧方式です。スクリーンショット一番上の最初の行のテキストをハイライトしています。最初のスクリーンショットの下 2 つめのスクリーンショットが表示されています。これは新方式を示しています。この図にはコード スニペットが 3 つ表示されていて、テキストがこれら 3 つのすべてにまたがっています。
図 2. 新旧暗号文保存方式の比較

図 2 下側の図に新たなアプローチを GuLoader の「新方式」として示しています。このアプローチでは関数での計算から暗号文を得ています。この関数では、まず暗号文が 4 バイトの DWORD に分割されます。各 DWORD はランダム化された数学演算を用いて個別に暗号化されます。

たとえば、GuLoader の新方式から暗号文最初の DWORD を取り出すには、図 3 に示した数学演算を実行しなければなりません。

画像 3 は暗号文の DWORD を取り出す数学演算のスクリーンショットです。
図 3. GuLoader の暗号文保存の新方式で暗号文の DWORD を計算する例

この新方式での完全な暗号文を取得するため、私たちは個々の DWORD に対して上の図 3 に示した方法と同様の一連の演算を実行しています。その後、これらの DWORD 値を連結し、完全な暗号文を得ています。

制御フローの難読化

2023 年の初め、私たちは、当初の VirusTotal (VT) 検出数がゼロだった GuLoader サンプルを見つけました。Hex-Rays IDA Pro を使ってこのマルウェアのサンプルを逆アセンブルして解析したところ、それ以上の解析を妨げようとする命令 (instruction) が見つかりました。これらの解析対策命令は、EXCEPTION_BREAKPOINTEXCEPTION_ACCESS_VIOLATIONEXCEPTION_SINGLE_STEP などの違反を引き起こすように設計されていました。

図 4 は GuLoader が解析対策のためにこれらすべての命令をどのように実装していたかを示したものです。

画像 4 は GuLoader サンプルの何行ものコードのスクリーンショットです。赤い枠で囲ってあるのは、解析対策用の命令です。
図 4. GuLoader サンプルを逆アセンブル解析すると解析対策の命令が見つかった

上の図 4 で指摘した解析対策命令のせいで、IDA プロセッサ モジュール拡張を書くという私たちの以前の解決策が無効になってしまいました。Intel x86 CPU の命令長は可変なので、EXCEPTION_ACCESS_VIOLATIONEXCEPTION_SINGLE_STEP といった例外をトリガーする膨大な命令の組み合わせを検出できなかったのです。

以前の解決策が使えなくなったため、私たちは手作業でコードを解析し、これら解析対策命令を見つけてバイパスし、構成を抽出せねばなりませんでした。どのように構成を抽出したかは、Virus Bulletin のホワイトペーパーで詳しく説明しています。

RedLine Stealer の技術分析

この分析で使用した RedLine Stealer サンプルの SHA256 ハッシュは a4cf69f849e9ea0ab4eba1cdc1ef2a973591bc7bb55901fdbceb412fb1147ef9 です。dnSpy という MSIL デコンパイラーを使うと構成データをすばやく特定できます (図 5)。

画像 5 は暗号化された構成ブロックを含む RedLine Stealer サンプルのスクリーンショットです。全部で 6 つのトークン引数があります。
図 5. dnSpy のスクリーンショット。RedLine Stealer サンプルの暗号化された構成ブロックが含まれている

私たちは Python で復号ルーチンを実装しました (図 6)。読者の皆さんにはぜひ、手動で暗号文と鍵のサンプルを取得し、図 6 のスクリプトで復号がうまくいくかどうかをテストしていただければと思います。

画像 6 は RedLine Stealer の復号ルーチンの Python コードのスクリーンショットです。
図 6. 復号ルーチン。Python で作成したもの

次は、構成 (図 7 と図 8) の場所を突き止め、Python で復号関数を準備します。ただし、データを復号する前に、dnSpy が生成した逆コンパイルの結果から、暗号文とキーを手動で取得しなければなりませんでした。

C でコードを書く場合、システム メモリーに直接アクセスすることから、C コードからコンパイルした実行可能ファイルを「ネイティブ実行可能ファイル (native executable)」と呼ぶことがあります。一方、.NET MSIL ではすべてがマネージドです。ネイティブ C コードの場合、あるポインターはバイナリーのどこかに格納された文字配列へとつながります。ところが、コンパイルされた MSIL の場合、私たちが目にするのはトークンだけです。

これらのトークンにアクセスするさい、ランタイム ライブラリー (CLR) が暗号文が実際にどこに格納されているかをパースしてくれます。おかげで、アナリストの心配ごとが 1 つ減ります。たとえば、図 7 で dnSpy が生成したコメントは、文字列 IP がトークン番号 0x04000013 であることを示しています。

画像 7 は逆コンパイルされた文字列のスクリーンショットです。赤くハイライトされているのは dnSpy の生成内容で、トークン番号にラベルを付けてくれています。
図 7. DnSpy は逆コンパイルした文字列のトークン番号をラベリングしてくれる

次に、IDA Pro でこの RedLine Stealer サンプルを開き、同じ関数に移動します。図 8 は、ldstr コマンドが、seg000:29F1seg000:29FBseg000:2A05seg000:2A0F に格納されているメタデータ文字列へのオブジェクト参照をプッシュしているようすです。図 8 ではオブジェクト参照を黒い四角で囲んでいます。

これらのメタデータ文字列はそれぞれ、seg000:29F6seg000:2A00seg000:2A0Aseg000:2A14 に格納されている命令によってセットされています。stsfld 命令は、静的フィールドの値を評価スタックの値に置き換えます。各フィールドの評価スタック上の値は赤枠で囲ってあります。

画像 8 は 構成設定用関数を IDA Pro 逆アセンブラーで表示したスクリーンショットです。赤枠内は、各静的フィールドに対する評価スタック上の値です。
図 8. 構成設定用関数を IDA Pro 逆アセンブラーで表示したところ

図 7 の IP フィールドだけでは構成を静的に抽出できません。この IP フィールド用にスタックにプッシュされた文字列がどこから来ているのかは、まだ特定されていません。Microsoft によれば、図 8 に示した ldstr 命令のオペランド タイプは文字列トークンで、文字列トークンは #US (User-Stream) テーブルに格納されているようです。

この文字列トークンを見つけるため、私たちは PEfile の .NET 版のような dnfile というオープンソース ライブラリーを使いました。Dnfile を使えば、.NET のランタイム識別子 (RID) を与えるだけで、#US トークンに簡単にアクセスできます。Dnfile はまた、ユーザー ストリームにアクセスするためのインターフェイスやそのほかさまざまなものを提供しています。

図 9 に示した Python の実装は、オフセットによりユーザー ストリームにアクセスする方法の例です。トークンによってユーザー ストリームを得た後、図 9 に示す復号ルーチンにそのユーザー文字列を渡します。これで復号された構成が返るはずです。

画像 9 は多数のコード行からなるスクリーンショットです。ここでは dnfile がリソースを取得しています。
図 9. Python による実装。dnfile を使い、与えた .NET MSIL トークンによりリソースを取得

結論

本稿では GuLoader と RedLine Stealer で使われている手法を掘り下げて、さまざまなマルウェア ファミリーの C2 構成の場所を特定し、抽出するプロセスを取り上げました。

これらのマルウェア構成解析から得た知見を活用すれば、悪意のあるソフトウェアに対する検出力、解析力、効果的対策の開発力を高められます。継続的な協力と知識の共有を通じて、私たちは団結してサイバー犯罪者に一歩先んじてデジタル システムやネットワークを守ることができます。

パロアルトネットワークスのお客様は、以下の製品を通じて、本稿で取り上げた脅威からさらに強力に保護されています。

侵害の懸念があり弊社にインシデントレスポンスに関するご相談をなさりたい場合は、こちらのフォームからご連絡いただくか、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
Enlarged Image