FFRIエンジニアブログ

株式会社FFRIセキュリティのエンジニアが執筆する技術者向けブログです

Contiランサムウェアの進化

はじめに

FFRIセキュリティ ソフトウェアエンジニアの小島です。最近まで「Conti」と呼ばれるランサムウェアによる攻撃が活発に行われてきました。幸いなことに、本原稿を書いている 2022 年 5 月に正式に運用が停止されたのですが、それまでは、ランサムウェアの中でもとりわけ猛威を振るってきました。

Conti ランサムウェアは、標的型フィッシングメールに添付されたり、ZLoader などの他のマルウェアによってインストールされることで端末に感染します。感染した端末内のファイルは暗号化され、さらに同一ネットワーク上で共有されているファイルも暗号化されてしまいます。

2021 年には少なくとも 1 億 8000 万ドル[1]の被害を出しており、この金額は全ランサムウェアの中で最大です。CISA は 2021 年 9 月に 1 回目の注意喚起を行っています。2022 年 2 月には米国および国際機関に対する Conti ランサムウェアによる攻撃が 1000 件以上に増加したとして 2 回目の注意喚起を行っており、2022 年 3 月には 3 回目の注意喚起を行っています[2]。

現在では、Conti ランサムウェアは運用が停止されており、Conti ランサムウェアとしてのブランドは無くなりました。しかし、Conti は他の有名なランサムウェアグループと提携していると言われており、完全に脅威が無くなったとは言い切れません。

さらに、Conti ランサムウェアの機能を引き継ぐ別のランサムウェアとして生まれ変わり、新たな被害をもたらす可能性も考えられます。

ここでは、Conti ランサムウェアが確認されてから運用が停止されるまでに Conti ランサムウェアの機能について、どのような点が進化してきたのかに焦点を当てて紹介します。

Conti ランサムウェアはバージョンが上がるにつれ、より高速化・高度化しており、2020 年 7 月頃に確認されてから約 2 年間という短い期間で進化してきました。

少なくとも現在までに 3 つのバージョンが確認されており、バージョン 1 は 2020 年 7 月頃、バージョン 2 は 2020 年 10 月頃、バージョン 3 は 2020 年 11 月頃に確認されています。

図1 各バージョンが出現した時期

暗号化アルゴリズムの高速化

進化した点の 1 つ目としてファイルを暗号化する際に使用するアルゴリズムが挙げられます。バージョン 1 では「AES-256」というアルゴリズムが使用されていましたが、バージョン 2 では「ChaCha8」というアルゴリズムに変更され高速化が図られています。

AES-256 は、共通鍵暗号のアルゴリズムの一種です。「AES」が暗号化アルゴリズムの種類を表し、「256」は鍵の長さが 256bit であることを表します。AES では鍵の長さが 128bit、192bit、256bit の 3 種類があり、鍵が長くなるほどより解読されにくくなるため、AES-256 は AES の中で最も解読されにくいということになります。

ChaCha8 というアルゴリズムは AES-256 と同様に共通鍵暗号のアルゴリズムの一種です。「ChaCha」が暗号化アルゴリズムの種類を表し、「8」は 8 ラウンドであることを表します。ChaCha には ChaCha8 以外にも ChaCha12 や ChaCha20 など、ラウンドが異なる複数のバリエーションが存在し、ラウンドの数が大きくなるほど解読されにくくなります。「ラウンド」とは ChaCha により暗号化する際に行う演算のことであり、ラウンドは 2 種類存在するため、2 種類のラウンドを 4 回ずつ繰り返す場合に 8 ラウンドとなります[3]。

AES と ChaCha はどちらも共通鍵暗号ですが、アルゴリズムの実装が大きく異なります。AES では主に以下の処理によって構成されています[4]。

  • SubBytes
  • ShiftRows
  • MixColumns
  • AddRoundKey

上記の処理の内、SubBytes においては「S-Box」と呼ばれる処理を行っており、その中に非線形変換処理が含まれているため、複雑な計算が必要になると考えられます[5]。

一方、ChaCha は加算、XOR、ビットのローテーションなど、単純な計算で暗号化を行うため、高速に暗号化を行うことができると言われています。

実際に Python の「PyCryptodome」というライブラリを用いて AES-256 と ChaCha20 により 1MB のデータを暗号化した場合の時間を比較した結果、ChaCha20 の方が約 12 ~ 13%短くなっていました。暗号化アルゴリズムが変更された Conti ランサムウェアで使われている ChaCha8 は ChaCha20 よりもラウンド数が少ないため、ChaCha8 で暗号化した場合にはさらに暗号化が高速になると考えられます。

AES-256 から ChaCha8 に変更したことにより暗号化が高速化されていることから、同じ実行時間でもより多くのファイルを暗号化できることになり、よりファイルの復旧が困難になりました。Conti ランサムウェアはバージョン 1 の時点ですでにマルチスレッドによる高速化がされているため、マルチスレッド以外の方法でさらに高速化を行うために暗号化アルゴリズムを変更した可能性が考えられます。

ファイルレスによるステルス化

進化した点の 2 つ目としてファイルレスでの攻撃手法を使用している点が挙げられます。この攻撃手法はバージョン 2 の辺りから使用されるようになっていると考えられます。

Conti ランサムウェアが使用している手法は、PE ファイルをファイルではなくメモリーに書き込み、PE ファイルの処理を実行する手法です。攻撃に使用する PE ファイルをファイルとして書き込まないため、ファイルレスでの攻撃が可能になります。

図2 PEファイル(メモリー上)の実行の流れ

実際に Conti ランサムウェアをデバッガにより解析すると、VirtualAlloc により確保したメモリーに「MZ」から始まるコードを書き込む挙動が見られます。

図3 メモリーの確保

図4 コードの書き込み

書き込まれたコードは「MZ」から始まっていることから PE ファイルであることを表します[6]。PE ファイルにおいて先頭のアドレスから+0x3C の位置は MS-DOS ヘッダー内の「e_lfanew」というフィールドに対応し、NT ヘッダーの位置を表す値が格納されています[7]。

NT ヘッダーの先頭のアドレスから+0x28 の位置が「AddressOfEntryPoint」というフィールドに対応し、PE ファイルのエントリーポイントのオフセットを表す値が格納されています[8]。

図5 PEファイルの構造

メモリー上の PE ファイルの先頭のアドレスは 0x21C0000、AddressOfEntryPoint は 0x19D97 であることから、メモリー上の PE ファイルのエントリーポイントは 0x21C0000+0x19D97(=0x21D9D97)になります。メモリー上の PE ファイルのエントリーポイントが call 命令によるジャンプ先のアドレスと一致していることから、最終的にメモリー上の PE ファイルのエントリーポイントから処理が実行されることになり、ファイルレスで PE ファイルが実行されることになります。

図6 メモリー上のPEファイルの実行

この手法が使われる理由として、大きく分けて以下の 2 つが考えられます。

  1. 検出回避
  2. 解析妨害

マルウェアが PE ファイルを実行する手法として、感染した端末に PE ファイルをファイルとして書き込み、実行する手法が考えられます。この手法の場合、攻撃者の視点で考えると PE ファイルを一旦ファイルとして書き込むことになるため、ファイルが書き込まれた段階でセキュリティ製品により静的に検出されるリスクがあります。

図7 PEファイルをファイルとして書き込む場合

Conti ランサムウェアが使用している手法には「PE ファイルをファイルではなくメモリーに書き込む」という特徴があり、攻撃者の視点で考えると PE ファイルをファイルとして書き込まずに実行できるため、PE ファイルが静的に検出されるリスクを下げることができます。

図8 PEファイルをメモリーに書き込む場合

Conti ランサムウェアは PE ファイルをメモリーに書き込んで実行するため、解析は困難になります。 PE ファイルをファイルとして書き込む場合、感染した端末に書き込まれた PE ファイルを入手できれば、静的解析と動的解析の両方でマルウェアを解析できます。そのため、特定の環境でしか動作せず動的解析が難しいとしても、静的解析により動作させずに解析できます。 一方、Conti ランサムウェアは PE ファイルをファイルとして書き込まないため、端末のシャットダウンなどによりプロセスが終了した場合、プロセスのメモリー上に書き込まれた PE ファイルは痕跡として残りません。

このように Conti ランサムウェアがファイルレスでの攻撃手法を使用するようになったことによって、Conti ランサムウェアの検出や解析がより困難になったと考えられます。

パターンマッチングによる検出の難化

進化した点の 3 つ目としてポリモルフィックコードを使用している点が挙げられます。これはバージョン 3 から使用されるようになったと考えられます。

アルゴリズムを維持しつつ、変化するコードをポリモルフィックコードと言います。ポリモルフィックコードを使用することにより、Conti ランサムウェアをビルドする度に Conti ランサムウェアのコード部分が変化すると考えられます。そのため、パターンマッチングによりコード部分が一致した場合に検出しようとしても、コード部分が変化することから一致しにくくなり、パターンマッチングによる検出が困難になると考えられます。

おわりに

Conti ランサムウェアは短時間でより多くのファイルを暗号化できるようになり、より検出が困難なランサムウェアに短期間で進化してきました。

暗号化されたファイルを復旧する手段として、バックアップしたファイルから復元する方法がありますが、短時間でより多くのファイルが暗号化されてしまう場合、よりバックアップからの復旧に時間がかかることになります。本来であれば、ファイルの暗号化が行われる前に Conti ランサムウェアを検出し、ファイルの暗号化をブロックすることの方が重要です。

Conti ランサムウェアの運用は停止されましたが、別のランサムウェアグループへ移った開発者が、Conti ランサムウェアで使用した高度な手法を転用する可能性もあります。Conti ランサムウェアで使用されていたような高度な手法が他のランサムウェアに転用されたとしても防御できるように対策することが重要になります。

ちなみに、FFRI yarai では HIPS エンジンにより Conti ランサムウェアが検出できることを確認しています(検出速報)(※全ての Conti ランサムウェアが検出できることを保証するものではありません)。

エンジニア募集

FFRIセキュリティではマルウェアの解析などセキュリティの研究開発を行っています。採用に関しては こちら を御覧ください。

参考文献

[1] https://go.chainalysis.com/rs/503-FAP-074/images/Crypto-Crime-Report-2022.pdf

[2] https://www.cisa.gov/uscert/ncas/alerts/aa21-265a

[3] https://cr.yp.to/chacha/chacha-20080128.pdf

[4] https://nvlpubs.nist.gov/nistpubs/fips/nist.fips.197.pdf

[5] https://cir.nii.ac.jp/crid/1573105977388993152

[6] https://docs.microsoft.com/en-us/archive/msdn-magazine/2002/february/inside-windows-win32-portable-executable-file-format-in-detail

[7] https://docs.microsoft.com/en-us/windows/win32/debug/pe-format

[8] https://docs.microsoft.com/en-us/windows/win32/api/winnt/ns-winnt-image_optional_header32