ランサムウェアに組み込まれたオンデマンドポリモーフィック型コード

最近では、セキュリティ業界だけでなく日常生活でも、ランサムウェアという言葉を良く耳にするようになりました。新しいランサムウェアは毎日のように見つかりますが、マルウェアコードの実際の実装方法を目にする機会はあまりありません。

ランサムウェアは、さまざまな異なるテクニックや攻撃ベクターを使ってコンピューターシステムに侵入します。また、さまざまな手段を使って検出をすり抜け、分析を回避します。分析を回避する方法として、メタモーフィック、暗号化、ポリモーフィックといったアルゴリズムが使用されています。

メタモーフィックアルゴリズムについては、以前のブログ記事 (http://blog.fortinet.com/2016/01/26/metamorphic-code-in-ransomware)でご紹介しましたが、簡単に言うと、メタモーフィックアルゴリズムを使用することで、マルウェアは自分のバイナリの異なるコピーを生成し、しかも、それを通常のコードであるかのように見せることができます。

マルウェアが使用するもう1つのテクニックである暗号化では、キーを使用してマルウェアコードを暗号化することで、逆アセンブラを使っても解読できないようにします。ただし、自分の異なるコピーを生成する目的で、ポリモーフィックアルゴリズムが使用されます。

ポリモーフィックアルゴリズムでは、異なるキーを使って自分の異なるコピーを暗号化し、生成します。そのため、1つのキーがわかっただけではそのマルウェアの異なるコピーを検出できません。

メモリ内での復号

多くのマルウェアは、単純な復号アルゴリズムを使ってマルウェアコードを仮想メモリ内で復号します。研究者がマルウェアコードを読み取って分析できる可能性があるのは、そのためです。また、アンチウィルスエンジンが読み取って悪意あるコードかどうかを判断できる可能性もあります。マルウェアコードがメモリ内に復号されていれば、暗号キーはそれほど重要ではありません。異なるキーを使用するマルウェアであっても、復号された同じマルウェアコードをメモリ内に生成するためです。

ポリモーフィック型マルウェアは、新しいキーを生成してメモリ内のマルウェアコードを暗号化し、自分の新しいコピーを異なるファイルに書き込みます。したがって、コピーを作成するたびに異なるバイナリが生成されます。

ただし、最初の復号された同じコピーがメモリ内に必ず残るため、研究者がマルウェアの復号されたバージョンをメモリからダンプできれば、静的な分析を実行できます。

しかし、マルウェアがメモリ内で自分の異なるコピーを生成できるとしたらどうでしょうか。その場合は、マルウェアの復号されたバージョンをダンプすることも、メモリ内のマルウェアコードを読み取ることもできなくなります。

オンデマンドポリモーフィックアルゴリズム

Virlockは、上記のブログ記事でご紹介した、ポリモーフィックアルゴリズムを使用するランサムウェアです。私はこのランサムウェアで使われているアルゴリズムを、オンデマンドポリモーフィックアルゴリズムと名付けました。

キーを使用する通常のポリモーフィック型マルウェアと同様に、このマルウェアもマルウェアコードをメモリ内で復号します。唯一Virlockが他のマルウェアと異なるのは、必要な段階でコードを復号し、その後に再びコードを暗号化する点にあります。このマルウェアにはさらに、暗号化してメモリに戻すときに異なるキーを使用するために、暗号化されたマルウェアの新しいインスタンスが最初のバイナリと異なるものとなるという複雑さがあります。Virlockがこのコードを使用して復号と暗号化のパターンを繰り返していくと、メモリ内のマルウェアは、メモリ内に読み込まれる前の最初の暗号化されたコピーとはまったく異なるものになります。マルウェアそのものの異なるコピーを取り出したとしても、メモリの内容が単純にファイルにコピーされるだけです。


図1

図1は、暗号化されたマルウェアコードのブロックです。最初の16バイトだけを抜き出すと、右側のようになります。このコードのブロックは、最初の実行可能ファイルの暗号化されたマルウェアコードとまったく同一のコピーです。


図2

図2は、図1に示したコードの同じブロックの復号されたバージョンです。必要なバイトを復号した後に、マルウェアは復号されたコードを実行し、異なるキーを使って再びコードを暗号化します。


図3

図3は、新しく暗号化されたコードのブロックですが、最初のバイトとまったく異なるものになっているのがわかります。このマルウェアは、コードの特定のブロックの実行が必要となるたびに、実行後にそのブロックを暗号化して、異なるバイトのセットに戻します。

マルウェアをダンプできない理由

図3に示した暗号化されたバイトが最終的なバイトとなるわけではなく、Virlockがこれを使用すると判断したり、コードのこの部分が別のタスクの実行に必要になったりするたびに、別のバイトに変わることになります。異なるキーを使用して、復号と再暗号化が何回も繰り返されます。

研究者がマルウェア全体を1度にダンプして、逆アセンブラで分析できないのは、そのためです。どの段階においても、コードの特定のブロックしか復号されていないため、マルウェア全体の復号されたコピーをダンプするのは不可能です。マルウェア全体を分析する唯一の手段として、デバッガーですべてのコードを追いかける方法が考えられますが、時間も手間もかかるため、分析を諦める研究者も少なくないでしょう。

まとめ

1つ1つのバイトの比較で大きな違いを見つけるのは困難ですが、メモリ内のマルウェア全体を参照する機会があったら、変わっている箇所を強調して色分けしてみると良いでしょう。違いがいくつも見つかれば、クリスマスの電飾のようにきれいに色分けされて表示されるはずです。

さまざまなテクニックや戦略が組み込まれたマルウェアやランサムウェアが次々と登場します。フォーティネットは毎日、新たな脅威の分析という困難な作業に取り組んでいます。

SHA256: 5b3e4563240cfc40dd484b0f41c2985d1fdf6207b904445bb04f935388e82046