キヤノンMJ/サイバーセキュリティ情報局

マルウェアの検出を回避させるツール「クリプター」について解説

  • この記事をはてなブックマークに追加
  • 本文印刷

本記事はキヤノンマーケティングジャパンが提供する「サイバーセキュリティ情報局」に掲載された「マルウェアのファイルを暗号化して難読化するツール「AceCryptor」の概要と普及状況の全容を解説」を再編集したものです。

 多数のマルウェア系統で悪用されているクリプター(ファイルやプログラムを暗号化するツール)の技術的分析結果と、「CaaS:クリプター・アズ・ア・サービス」として拡散されている現状について、ESET社の研究者が解説します。

 このブログでは、Avast社が最初に文書化したAceCryptorの動作について詳細を解説します。サイバー攻撃者の分業化や専門化が進んでいる中で、マルウェアの検出を回避するために暗号化して難読化するツール(クリプター)が生まれています。このAceCryptorは2016年から存在しており、数十のマルウェア系統をパッキング(暗号化)するために使用されているため、このマルウェアの多くの技術的な部分はすでに解明されています。AceCryptorは、シンプルで広く利用されているパッカーであり、DJVUの難読化SmokeLoaderのステージ1RedLine Stealerのステージ1、2、3などでも利用されているため、読者の方はすでにどこかで読んだことがあるかもしれません。すべてではありませんが、公開されている多くのブログでは、このクリプターとパッキングされるこれらのマルウェアを別個に識別していません。本ブログでは、このクリプターの亜種について技術的に分析した結果、このクリプターによって暗号化され展開されているマルウェア系統の概要や、AceCryptorが実環境でどの程度普及しているかを説明し、すべての点と点をつなげてその全容をお伝えします。

 マルウェア作成者にとっての難題は、マルウェアが検知されないように保護することです。クリプターは、配信するマルウェアを保護する最初のレイヤーとして機能します。サイバー攻撃者は独自のクリプターを作成および維持できますが、クライムウェアを使用しているサイバー攻撃者にとって、クリプターを絶対に検出されない状態で維持するためには、膨大な時間がかかり、技術的にも困難なタスクになることが多くあります。マルウェアが検知されないように保護する機能への需要は、マルウェアを配信および展開する複数のサービスとしてのクリプター(CaaS: cryptor-as-a-service)を生み出すことになりました。これらのクリプターは、ペイロードを隠ぺいするために、いくつもの仮想マシン検出機能、デバッグ対策、解析対策の技術を組み合わせている場合があります。

本ブログの要点

・AceCryptorは、有名な数十のマルウェアに対して、パッキングサービス(検出されないように暗号化して配信・展開するサービス)を提供しています。
・AceCryptorの検体は世界各国で非常に多く検出されています。複数のサイバー攻撃者がAceCryptorを使用し、それぞれのキャンペーンでマルウェアを暗号化して配信・展開しています。
・AceCryptorは高度に難読化されており、長年にわたって検出を回避するための多くの技法を取り入れてきました。
・AceCryptorには複数の亜種があります。このブログではこれらの亜種についても説明します。
・別のマルウェアの一部や攻撃の段階としてこのクリプターについて説明しているほかのリサーチャーによる技術的な分析もありますが、ESET Researchは、AceCryptorの機能を包括的に解説するだけでなく、その歴史や現在の拡散状況についても解明することを目指してきました。
・ESET製品は、2021年から2022年にかけてAceCryptorでパッキングされたマルウェアの攻撃を受けた8万社以上のお客さま様を保護しています。

統計情報とパッキングされているマルウェア系統の概要

 2016年にAceCryptorが初めて登場して以来、多くのマルウェアの作成者がこのクリプターのサービスを利用しており、Emotetなどの最も有名なクライムウェアでも、自前のクリプターを使用していなかった時期にはAceCryptorを使用していました。2021年から2022年にかけて、ESET製品は8万件以上のAceCryptorのユニークサンプルを検出しました。AceCryptorにはさまざまなマルウェアがパッキングされていることから、AceCryptorはCaaS(サービスのしてのクリプター)として販売されていると考えられます。このサービスの正確な販売価格は不明ですが、検出されているユニークファイル数を考えると、AceCryptorの作成者は大きな利益を得ている可能性があります。

 過去数年間に収集された検体の総数が多いため、以下の統計は2021年および2022年に検出された検体のみを対象としています。図1に示すように、この2年間における検出数は均等に分布しています。これは、多数のサイバー攻撃者がそれぞれキャンペーンを実行してマルウェアを配信していることを示しています。

図1. 2021年と2022年のAceCryptor検出数(7日移動平均値)

 AceCryptorによってパッキングされたマルウェアを調査した結果、ESET製品が検出している200以上のマルウェア名が見つかりました。マルウェアはアップデートや難読化されることがあり、1つのマルウェア系統に複数の亜種が存在し、いくつもの検出名が存在する場合があります。例えば、「MSIL/Spy.RedLine.A」と「MSIL/Spy.RedLine.B」は、どちらもRedLine Stealerマルウェアの検出名です。いくつかのほかのマルウェアの検出名は、系統別ではなくクラス別(ClipBankerやAgentなど)にしています。これは、解凍されたマルウェアの検体の多くが、それほど普及していない、あるいは、さまざまなパブリックリポジトリで公開されている既知のマルウェアに多少の変更を加えた一般的なクリップボードデータの窃取ツールやトロイの木馬などであるためです。SmokeLoader、RedLine Stealer、RanumBot、Raccoon Stealer、STOPランサムウェア、Amadey、Fareit、Pitou、Tofsee、Taurus、Phobos、Formbook、Danabot、Warzoneなどの多数のマルウェア系統が、クリプターを解凍した後に見つかっています。図2は、AceCryptorによってパッキングされている一般的なマルウェア系統に属する検体数の概要を示しています。

図2. 2021年と2022年にAceCryptorでパッキングされたマルウェア系統

 AceCryptorなどのCaaSプロバイダーの活動を監視すれば、このサービスを利用しているマルウェアも監視できます。2022年第1四半期に初めて登場したRedLine Stealerマルウェアの例を見てみましょう。図3に示すように、RedLine Stealerを配信しているサイバー攻撃者は、RedLine Stealerが見つかった当初から現在までAceCryptorを使用しています。したがって、AceCryptorやほかのCaaSを確実に検出することができれば、新たな脅威を可視化できるだけではなく、サイバー攻撃者の活動を監視するためにも役立ちます。

図3. AceCryptorを利用するRedLine Stealerのインシデント数(7日間平均値)

標的となった国や組織

 さまざまなマルウェアがAceCryptorでパッキングされており、多くのマルウェア作成者の攻撃対象も多岐にわたっていることから、AceCryptorは世界各国のあらゆる場所で検出されています。2021年と2022年に、ESETのテレメトリ(監視データ)ではAceCryptorが24万件以上検出されています。これは月平均に換算すると、1万件以上になります。図4では、2021年と2022年の間にAceCryptorが最も多く検出された国を見ることができます。

図4. ESETテレメトリに基づくAceCryptorの影響を受けている国のヒートマップ

 2021年と2022年に、ESET製品は8万社以上のお客さまのコンピューターでAceCryptorによってパッキングされたマルウェアの亜種を検出しブロックしています。また、AceCryptorのそれぞれ異なる検体(ユニーク検体)を8万件以上発見しています。もちろん、これらの検体が複数のコンピューターで検出される、あるいは、1台のコンピューターがESET製品のソフトウェアで複数回保護されることもありますが、これだけの数のユニークハッシュが見つかっていることは、AceCryptorの作成者が難読化と検出回避に積極的に取り組んでいることを示しています。AceCryptorの難読化に関する技術的な詳細については、このブログの「技術的な分析」で詳細を解説します。

 重要なポイントは、AceCryptorのユニーク検体数は非常に多いにもかかわらず、パッキングされているユニークマルウェアの数は7,000未満であることです。これは、多くのマルウェアの作成者がクリプターサービスに依存するようになっており、自前のクリプターを実装するために時間とリソースを投資するよりも、このようなサービスを利用する方が効率的であることを示しています。

配信

 AceCryptorは複数のサイバー攻撃者によって使用されており、AceCryptorによってパッキングされるマルウェアもまた、さまざまな方法で配信されています。ESETのテレメトリによると、AceCryptorでパッキングされるマルウェアは、主にトロイの木馬化した海賊版ソフトウェアのインストーラーや、悪意のあるファイルが添付されたスパムメールを使用してデバイスを感染させていました。

 あるマルウェアに感染したため、AceCryptorで保護されている新しいマルウェアをダウンロードするケースもあります。例えば、Amadeyボットネットは、AceCryptorでパッキングされたRedLine Stealerをダウンロードしています。

 また、AceCryptorによってパッキングされるマルウェアには、新しい別のマルウェアをダウンロードするものもあります。

技術的な分析

 現在、AceCryptorは、3つのレイヤーから構成される多段階型のアーキテクチャを採用しています。現在の最初のレイヤーには、TEA(小さな暗号化アルゴリズム)を用いて第2レイヤーを復号するバージョンと、Microsoft Visual/Quick/C++のLCG(線形合同法)を用いて第2レイヤーを復号する2つのバージョンがあります。第2レイヤーは、マルウェアを保護するための仕掛けを実行し、復号して第3レイヤーを起動するシェルコードです。最後の第3レイヤーもシェルコードであり、いくつかの調査対策を実行します。このシェルコードのタスクはペイロードを起動することです。第3レイヤーには2つのバージョンがあります。1つはプロセスホローイングを行い、もう1つはリフレクティブローダーを使用して最終ペイロードのPEで自身のイメージを上書きするバージョンです。

図5. AceCryptorのアーキテクチャ

第1レイヤー

 第1レイヤーには2つのバージョンがありますが、それらは同じように機能します。これらのバージョンは主な以下の処理を実行します。

1. 暗号化した第2レイヤーを割り当てられたメモリーにロードする。
2. レイヤー2を復号する。
3. レイヤー2をコールする、あるいはジャンプする。

 この段階で最も重要なのは難読化です。長年にわたり、新しい難読化の手法が追加されており、バイナリのほとんどすべての部分が何らかの方法でランダム化され難読化されています。これのため、YARAルールや静的な検出方法を使用することが非常に困難です。

・ループ

 AceCryptorの作成者は、ループを活用していくつもの難読化を行っています。まず、最も分かりやすい手法は、解析を難しくするために、ジャンクコードのあるループを使用することです。ESET社は、AceCryptorの最初の検体を登録した2016年以降、ジャンクコードが利用されていることを確認しています。これらのループは多くのAPIコールで埋め尽くされており、その処理内容をアナリストが分析できないようにしているだけでなく、APIコールをフックするサンドボックスで大量のログを発生させて、サンドボックスも利用できないようにしています。ループにはMOV命令や算術演算が多数含まれていることもあります。これもアナリストを混乱させ、解析に時間がかかるようにするためのものです。

図6. AceCryptorのループによる難読化と重要なコード部分の隠ぺい蔽

 ループを使用する2つ目の目的は、実行を遅延させることです。AceCryptorについては第2レイヤーを即座に起動するバージョンや、ループが含まれており数十分も実行を遅延させるバージョンが確認されています。マルウェアの一部の実行を遅延する手法はこれまでも見られており、SleepなどのAPIコールを使用する場合にはいくつかのアラートが発行される場合もあります。アラートが発行されない場合でも、Cuckoo Sandboxのようなサンドボックスは、遅延を回避し重要な部分を解析するためのスリープスキップの手法を実装しています。また、ループやジャンクコードを実行して遅延する手法が実装されている場合、動的な解析を行うときに、アナリストはどのループがジャンクループでありスキップ可能かを識別しなければならず、複雑な作業になります。

 ループを使用した第3の難読化手法は、ループの中に重要な演算を隠すものです。ジャンクループの中には、特定の反復を待機し、その反復の間だけ何らかの処理を実行するものがあります。通常、APIはGetProcAddress関数を使ってロードされますが、これは後で使用されたり、暗号化されたデータのオフセットのような定数がアンマスクされたりします。ループの特定の反復が発生しないと、その検体は後でクラッシュします。これはジャンクコードと組み合わさっており、マルウェアを動的に解析するためには、最初にどのループやループの反復をスキップでき、どのループがスキップできないかを解析しなければなりません。つまり、アナリストは時間をかけてジャンクコードを解析するか、すべてのジャンクコードが実行されるまで待機しなければなりません。図6には、2つのループがありますが、1つ目のループを実行した後には重要な操作が含まれており、もう1つのループには大量のジャンクコードが含まれています。重要な演算を行うループにもジャンクコードが含まれている場合があるため、すべてのループをこのように簡単に識別できるわけではありません。多くの検体で、実際に容易に識別することはできなくなっています。

・ランダム化 - YARAルールへの対抗

 第1レイヤーのもう1つ重要な要素はランダム化です。先に説明したジャンクコードとループは、各検体でランダムに配置されています。このランダム化の目的は以下の通りです。

・反復回数を変更する

・APIコールを変更する

・APIコール数を変更する

・ジャンクな算術演算やMOV命令を変更する

 このようなランダム化によって、復号アルゴリズムや鍵の特定が非常に複雑になる場合があります。図7と図8は、TEAアルゴリズムの難読化されていないバージョンと難読化されたバージョンを示しています。難読化されたバージョンでは、ジャンクな算術演算命令だけでなく、アルゴリズムの一部もサブルーティチン化され、既知の定数(図7にあるsumやdelta)がマスクされており、アルゴリズムを正しく識別することが困難になっています。

図7. TEAの復号機能 - 難読化されていないバージョン

図8. TEAの復号機能 - 難読化されているバージョン

 ランダム化されるのはコードだけではありません。現在、暗号化された第2レイヤーとその復号鍵は、通常、.textまたは.dataセクションに保存されていますが、オフセットを使用して隠ぺいされていることがあり、そのオフセットは検体によって異なります。また、第2レイヤーの復号に成功すると、いくつかの検体では復号したデータの先頭に第2レイヤーのコードが置かれますが、先頭にランダムなデータブロックが配置される検体もあるため、第2レイヤーのコードの先頭を見つけるためには正しいオフセットを把握しなければなりません。

 AceCryptorの作成者は、以下の要素もランダム化します。

・PDBのパスは必ずC:\で始まりますが、それ以外の部分はランダムです。

・図9に示すように、リソースにもランダムな名前とコンテンツが含まれています。AceCryptorの作成者は、ランダムに生成されたデータを含む多くのリソースを検体に入れ込んでいます。これは、検体が疑われる可能性を低くし、暗号化されたデータの場所を特定することを困難にするために行われていると考えられます。リソースには以下が含まれる場合があります。

  ◯文字列テーブル
  ◯メニュー
  ◯ビットマップ
  ◯バイナリデータ

・コード内で使用される文字列

・アイコン(多くの検体で使用されているアイコンは、似ているように見えますが、若干修正が加えられていたり、ランダム化されていたりしており、それぞれが異なっています)

・ランダムなダミーセクション名。

・第2レイヤーデータのメモリー割り当て関数(GlobalAlloc、LocalAlloc、およびVirtualAlloc)

・コードを実行するために重要となるいくつかのAPIの使用(これらは静的にインポートされるか、GetModuleHandleAおよびGetProcAddressを介して取得される場合があります)

図9. AceCryptorのリソースは、検体が疑われることがないように、ランダムに生成されたコンテンツを使用してランダムに生成される

図10. AceCryptorのリソースに含まれるランダムな文字列

・過去のバージョン

 長年をかけて、AceCryptorの作成者は開発能力を向上させており、クリプターを進化させてきました。多くの微細な変更、更新、改良が行われていますが、旧バージョンの第1レイヤーの注意すべき特徴として以下が挙げられます。

・2016年に、AceCryptorはXTEA暗号化アルゴリズムを使用する第1レイヤーのバージョンを使用していました。

・2017年から2018年にかけて、AceCryptorは別の第1レイヤーバージョンを使用していましたが、このバージョンでは、暗号化アルゴリズムとしてRC4が使用されていました。

・第1レイヤーの最初のXTEA、TEA、およびLCGバージョンが登場したのは2016年でした。LCGバージョンとは異なり、XTEAバージョンはすぐに使用されなくなり、代わりにTEAバージョンが使用されるようになりました。

・旧バージョンでは、暗号化された第2レイヤーはBMP画像で隠ぺいされたリソースに含まれていました。この画像は、幅と高さがランダムに生成され、画像の中央部分が切り取られ、暗号化されたデータに置換されています。データは、正しいオフセットを把握しなければ見つけることはできませんでした。

第2レイヤー

 AceCryptorの第2レイヤーは2019年に登場しました。それまでは、AceCryptorは第1レイヤーから直接第3レイヤーを起動していました。この第2レイヤーは、第3レイヤーの暗号化と保護をさらに強化する役割を果たしており、図11に示すように、以下の3つの部分から構成されています

・位置独立コード

・レイヤー3に関する情報を含むESET社がL2_INFO_STRUCTと命名した独自の構造体

・レイヤー3のデータ

図11. AceCryptorの第2レイヤーの構造

 最初のステップとして、AceCryptorは、一般的な手法でいくつかのAPI関数のアドレスを取得します。PEB_LDR_DATAを使用してロードされたモジュールをトラバースし、そのエクスポート名のハッシュ値をハードコードされた値と比較して、GetProcAddressとLoadLibraryA関数を解決します。チェックサム関数として、AceCryptorはhashDbに実装されているshl1_add関数を使用し、解決されたAPIを迅速に識別します。

図12. Pythonで実装されたshl1_addハッシュ

 次に、AceCryptorは、LoadLibraryAを使用してkernel32.dllのハンドルを取得し、このハンドルとGetProcAddressを使用して、さらに多くのAPIを解決します。

 次のステップで、AceCryptorは独自の構造体L2_INFO_STRUCT(図13)の情報を使用します。この構造は、図11に示すように、位置独立コードの最後にあります。

図13. 第2レイヤーのL2_INFO_STRUCTの概要

 次のステップで、AceCryptorは、Microsoft Visual/QuickC/C++のLCGを使用して暗号化された第3レイヤーを復号します。復号は決まった場所で行われます。compressionFlagが設定されている場合、AceCryptorはAPI VirtualAllocを使用してメモリーを割り当て、LZO_1Z復元アルゴリズムで復号されたデータの圧縮を解除します。この後、復号され、必要に応じて解凍された第3レイヤーが実行されます。

第3レイヤー - プロセスホローイング

 プロセスホローイングは、コードインジェクション攻撃の一種であり、プロセスに悪意のあるコードを挿入する手法です。最初のステップとして、AceCryptorは、ロードされたモジュールとエクスポートをトラバースし、shl1_addチェックサムを使用する場合と同じ方法でLoadLibraryAおよびGetProcAddress APIのアドレスを取得します。次に、複数のAPI関数のアドレスとDLLハンドルを取得します。

図14. AceCryptorの第3レイヤーの構造 - プロセスホローイング

 次のステップでは、AceCryptorはAPI GetFileAttributesAを使用して、apfHQというファイルのファイルシステム属性をチェックします。これらの属性は フラグの存在しない組み合わせである0x637ADFと比較され、等しい場合に、プログラムは無限ループに入ります。この手法は、隠ぺいのためのさまざまな処理が実行されている最後のレイヤーで使われていること、そして、このレイヤーだけで使用されている手法ではないことから、ESET社は、これは難読化の手法ではなく、この値を返す特定のサンドボックス/エミュレーターに対する対策と考えていますが、その詳細は不明です。

 プログラムが正常に続行する場合、さらに別のサンドボックスやエミュレーター対策のためのチェックが実行されます。ここでAceCryptorは、API RegisterClassExAを使用して、クラス名がsaodkfnosa9inのクラスを登録します。そして、API CreateWindowExAを使用してmfoaskdfnoaという名前のウィンドウを作成します。AceCryptorは、このチェックの最後のステップで、API PostMessageAおよびGetMessageAを使用して、メッセージを渡します。これらのAPIは頻繁に使用されていないことから、このチェックは、これらのAPIを実装していないサンドボックスやエミュレーター、またはエミュレートされたAPIが正しく機能しないサンドボックスを回避するために役立ちます。

図15. 仮想マシン対策およびとエミュレーター対策の手法

 これらのチェックに成功した後、AceCryptorはプロセスホローイングの手法を使用して、現在のプロセスの新しいインスタンスを作成し(GetCommandLineA、CreateProcessA)、最終的なペイロードを新しく作成したプロセスにマッピングし、起動します。

・過去のバージョン

 RegisterClassExA、CreateWindowExA、PostMessageA、 GetMessageAを使った調査対策の手法は、以前のバージョン(例:SHA-1:01906C1B73ECFFD72F98E729D8EDDD8A716B7E3)では、第1レイヤーで使用されていましたが、その後テストが行われ、クリプターのアーキテクチャが進化し、第3レイヤーに移動しています。

第3レイヤー - リフレクティブローダー

 このレイヤーにおける最初のステップでは、第2レイヤーと「第3レイヤー - プロセスホローイング」と同様に、API関数のGetProcAddressとLoadLibraryAのアドレスが取得されます。今回の処理が違っている点は、shl1_addのチェックサム関数を使用しておらず、ロードされたモジュールのトラバース、エクスポートのトラバース、文字列の比較によってGetProcAddressを最初に取得していることですが、この処理の目的は不明です。そして、GetProcAddressを使用して、LoadLibraryA関数を取得します。これら2つのAPIを使用して、AceCryptorはさらにいくつかのAPI関数のアドレスとkernel32.dllのハンドルをロードします。

図16. 第3レイヤーのリフレクティブローダーの構造

 このコードでは、AceCryptorがコードとデータを混在させる手法(図17)を確認できます。AceCryptorは、1回のコールで、リターンアドレスにある値を制御します。この値はデフォルトでゼロに設定されていますが、後でAceCryptorは最終的なペイロードのエントリポイントのアドレスをこの値に書き込みます。このプログラムにパッチが適用され、この値に0以外が設定される場合、プログラムはその値が示すアドレスにジャンプし、クラッシュします。

図17. コードとデータが混在している

 次のステップで、AceCryptorは、Cuckooサンドボックス、IDA Pro+BochsおよびNormanサンドボックスに対して、既知の仮想マシンチェックを行います。図19に示すように、値0x04が設定されたフラグSEM_NOALIGNMENTFAULTEXCEPTは常にCuckooサンドボックスによって設定されています。そのため、図18に示すコードにあるSetErrorModeのセカンドコールでは、前のコールで設定された値と同じ値は返されません。

図18. 仮想マシン対策の手法

図19. Cuckooサンドボックスのコード

 最後のステップでは、AceCryptorはまず、最終的なペイロードが(再び)圧縮されているかどうかを確認し、圧縮されている場合はLZO_1Zの解凍機能を使用します。第2レイヤーと同様に、 第3レイヤーのリフレクティブローダーは、ENCRYPTED_DATA_INFO_STRUCT(図16)とESET社が命名した独自の構造体を使用しています。この構造体は、位置独自コードと最終的なペイロードの間にあり、圧縮フラグ、ペイロードのセクション数、圧縮あるいは解凍されたサイズ、エントリポイントアドレス、いくつかのディレクトリのアドレス、イメージ再配置テーブルアドレスなどの情報を含んでいます。AceCryptorは、最終的なペイロードのPEを解析する「第3レイヤー - プロセスホローイング」とは異なり、この情報を使用してリフレクティブコードローディングの手法を使用します。この手法では、自身のイメージを最終ペイロードのイメージに再マッピングし(つまり、セクションをマップ、イメージをリベースし)、そのエントリポイントを呼び出してペイロードを起動します。

結論

 AceCryptorは、長期にわたって広く悪用されているクリプターです。サービスとしてのクリプター(CaaS)としてダークウェブやアンダーグラウンドのフォーラムなどで販売されているものと思われます。このクリプターサービスは、数十種類のマルウェア系統で使用されており、これらの多くは静的検出からマルウェアを保護する手段としてこのクリプターを使用しています。

 多くのサイバー攻撃者がこのクリプターを利用してマルウェアを暗号化して展開しているため、誰もがこのクリプターの被害を受ける恐れがあります。AceCryptorによってパッキングされているマルウェアは多岐にわたるため、AceCryptorによって侵害された組織がどれほど深刻な影響を受けるかを推定することは困難です。AceCryptorは、侵害されているマシンで既に実行されているほかのマルウェアによってドロップされる可能性があります。また、悪意のあるメールの添付ファイルを開いた場合など、その中に含まれるマルウェアが別のマルウェアをダウンロードする場合もあるため、侵害されたマシンを無害な状態にすることが困難となる場合もあります。

 現時点では、AceCryptorを開発しているサイバー攻撃者を特定することはできていません。AceCryptorは今後も広く悪用されることが考えられますが、監視を強化することで、このクリプターを使用するマルウェアの新しいキャンペーンを特定して防止できるようになるはずです。