2021年5月26日

CryptOne パッカーをDeep Dive

脅威アクターは、サイバーセキュリティのプロによる検知を回避するための方法を継続的に開発・改良しています。これは、マルウェアにパッキングアルゴリズムを適用して、検出、分析、防止が困難なファイルを作成する技術です。パッカーは、開発者がコードを違法コピーやリバースエンジニアリングから保護するための合法的なツールですが、悪用されると、邪悪な目的に使用される可能性があります。

最近、CryptOneと呼ばれるパッキングソフトウェアが一部の脅威アクターの間で人気を博しています。Fox-IT が最初に報じたところによると、Wastedlockerを開発したグループが、Netwalker、Gozi ISFB v3、ZLoader、Smokeloaderなどと同様にCryptOneを使い始めたとのことです。

CryptOneのパッカーは、Emotetがそれを使い始めたときに注目されました。私たちはEmotetグループを綿密に追跡し、このマルウェアに関する複数の記事 を、その活動が中断され、停止されるまで発表しました。撤去される前に生成された最新のサンプルの中には、CryptOneによってパックされたものもありました。

パックされたサンプルの分析を始めたところ、Fox-ITが報告していなかったCryptOneを使用しているマルウェアファミリーがさらに見つかりました。Dridex、Qakbot、Cobaltstrikeなどです。

このブログ記事では、このパッカーが脅威アクターの間で人気を博した特徴、解凍プロセスの概要、サンプルがCryptOneでパックされているかどうかを判断できる指標について詳しく説明します。

機能

  1. マルチステージ: アンパックのプロセスは、目的のマルウェアが実行されるまで、2つのステージで構成されています。最初の段階では、パッキングソフトウェアによって作成されるDLLがあります。このDLLには、セクションの1つに暗号化されたデータが含まれており、このデータはRWXバッファにコピーされた後、復号化されます。このデータには、シェルコードと別の暗号化されたデータのブロックが含まれています。シェルコードについては、後で詳しく説明します。


    復号後のシェルコードの始まり
  2. エントロピーの低減: 前述の通り、ペイロードは暗号化されたリソースとして隠されています。暗号化されたデータは、データのエントロピーを増加させ、ローダがより疑わしく見える原因となります。これらのサンプルでは、RWX権限のあるバッファを割り当てていますが、暗号化されたデータはそのままコピーされません。むしろ、いくつかのバイトがスキップされながらチャンクでコピーされます。飛ばされたバイトはすべて同じ値になります。これは、リバースエンジニアリングを困難にするためだと考えています。しかし、パディングは暗号化されたデータのエントロピーを減らし、ローダーを疑われないようにするために存在していると考えています。


    暗号化されたデータは、同じ値のチャンクでパディングされる
  3. サンドボックス回避: サンドボックスは、マルウェアを限られた時間だけ実行させるものです。分析が終了するまでマルウェアが非活動状態であれば、検出を回避することができます。サンドボックスソリューションはこの問題を認識しているため、スリープ機能を長時間使用することはできません。CryptOneソフトウェアが作成したローダーは、スリープをシミュレートしています。このローダーには、ループで実行されたり、マルウェアの機能とは無関係なシステムコールを実行したりする無用なコードの小塊が含まれています。この動作のもう一つの説明は、サンドボックスのレポートを無用な情報で埋め尽くし、重要なアラートを発見しにくくすることです。通常、各システムコールはサンドボックスによって記録され、レポートに追加されます。パッカーは多くのシステムコールを実行して、処理が困難なレポートを作成します。

  4. 静的解析サブバージョン: ローダーは、決して実行されず、アンパックプロセスを中断しないが、いくつかの逆アセンブルアルゴリズムを混乱させる可能性のあるコードブロックを挿入することによって、静的解析を破ろうとします。例えば、常に読み飛ばされる無限再帰を含む関数などです。

  5. Killswitch: この特性は Fox-IT 社から報告されたものです。このローダーは、interface_{b196b287-bab4-101a-b69c-00aa00341d07}というレジストリキーの存在を確認します。キーが存在しない場合は、無限ループに入ります。ローダーは、RegOpenKeyに送られるパラメータを隠そうとします。任意の値がグローバル変数に格納されます。その後、この値はレジスタにコピーされ、APIコールに必要な実際の値に達するまで減少させられます。この手法は、複数のファミリーで確認されました。また、一部のサンプルでは、レジストリキーの文字列が実行時に復号化されていました。このキルスイッチは、制御サーバーへの感染を避けるための予防策である可能性があります。もうひとつのキルスイッチは、Emotetのローダーにのみ見られました。これは、ユーザー "JhD "の下で実行された場合に終了します。

シェルコード

ローダーによって復号化されたデータは、WinAPIの名前、暗号化されたPEファイル、そしてシェルコードという構成になっています。シェルコードは、目的のマルウェアであるPEを復号化した後、以下の手順で反射的にローディングを行います。

  1. WinAPIの名前のアドレスを解決します。これはDLLのkernelbaseを使って行われます。ほとんどのシェルコードはkernel32を使用するので、これは珍しいことです。これは、多くのセキュリティ製品がkernel32の関数内にフックを設置していることが知られているため、セキュリティ製品による検出を回避するためかもしれません。
  2. UnmapViewOfFileを使ってローダーイメージのマッピングを解除する。これも一般的ではない手法です。通常、新しいバッファはランダムなアドレスに割り当てられますが、CryptOneのシェルコードは、目的のマルウェアをローダーが入っていたのと同じアドレスにコピーしようとします。
  3. PEのヘッダーとセクションをコピー
  4. インポートアドレステーブルを正しいアドレスに修正
  5. 再配置表に記載された再配置の実施
  6. 各セクションの特性に合わせてメモリ保護を変更
  7. 画像のLDRエントリの次のフィールドを更新する:エントリポイント、DLLベース、画像のサイズ
  8. PEB構造のイメージベースアドレスフィールドの更新

これらのステップがすべて実行された後、シェルコードは目的のマルウェアのエントリーポイントにジャンプします。

まとめ

CryptOneは洗練されたパッカーであり、検出には独自の課題があります。複数の実行段階で構成されており、静的解析を覆し、データのエントロピーを減らし、逆アセンブルのアルゴリズムを混乱させることで検出を回避しようとします。また、サンドボックスの検出を回避しようとしたり、長時間にわたって非アクティブな状態を維持し、レポートに無用な情報を記入することでダメージを与えようとします。

これらの機能は、マルウェアの検出率を下げる必要がある攻撃者にとって魅力的であり、近い将来、より多くの脅威アクターが利用するようになるかもしれません。

マルウェアを阻止するための業界最先端のアプローチについて詳しくお聞きになりたい方は、こちらまで お問い合わせいただければ、デモをご用意いたします。

/blog/why-emotets-latest-wave-is-harder-to-catch-than-ever-before/
/blog/why-emotets-latest-wave-is-harder-to-catch-than-ever-before-part-2/
/blog/emotet-malware-2020/