前の「IDAの操作メモ - データ領域のコード解析 -」で現れたコードに関して、続きのおまけです。
ちょっと思った感想を書くネタで挙げました。
なお、GWを使った検証ネタはここまでなので、この先は大分飛び飛びに、思いついたときにメモする程度の予定です。
復号化されて実行されるコードは、実は早くも次の復号化処理でした。
動かすまでもなく、素で読んでわかるレベルですが、XORを使った非常に単純な復号処理です。
0x004E4AB2に、暗号化が単純にならないための簡単な処理が入ってはいますが。これがなければ、32ビット長の鍵による単純なXORによる暗号化(と呼べるかどうかもアヤシイレベル)です。
ちょっとだけ解説すると、EAXはデータのアドレスを示しており、EDXの一番下の1バイト(dl)とXORして復号しています。その後、EAXは1バイト次のアドレスへ移動し、EDXは1バイト分右ローテートすることで、次のループでは下2バイト目の1バイトの値とXORできるようにしています。これを、ECXに設定された回数繰り返すという、非常に単純なストリーム暗号です。
復号されると、ようやく何かをしそうなコードが見えてきます。
以下は、復号化直後にジャンプした先の解析結果です。
0x004E4F77でEBXをいきなりsubで減算していますが、その後の処理のオフセット計算から、素直に値が見づらくはしているものの、相対アドレスで関数をコールしたりデータを参照できるようにしていることが分かります。
さて、「IDAの操作メモ - ハードウェアブレークポイントの使用例 -」で解析した暗号の技法も、今回分析した暗号も、非常に単純なものでした。マルウェアを動かして復号しましたが、分析結果から復号ツールを作ることも容易でしょう。そういった意味では、非常に脆弱な暗号を用いていると言えます。
では、この単純な暗号化でアンチウィルスを回避できるのか?といえば、恐らくはYesです。アンチウィルスは、マルウェアのハッシュ値や、悪意ある処理などに見られる特徴をシグニチャをターゲットにしています。しかし、今回の処理を見る限りでは、シグニチャに当たる部分は暗号化されていて検知できなかったと思います。ハッシュ値も、鍵の値を少し変えるだけで変わってしまいます。最近、亜種を含めると億単位の検体が見つかるといわれていますが、同じ中身でC&Cのアドレスを変えただけのもの、鍵が違うだけのものなど、1つのものから派生した亜種が相当数あるんだろうと思います。
実際、2年ほど前に大きな脅威になったと言われているWannaCryは、ワーム機能が他の端末にどんどん感染拡大していく機能が脅威の一つでした。EternalBlueエクスプロイトが巧妙かつ高い権限で動くことも大きな要因ですが、感染するにあたり、マルウェアの送信では32ビットのXORという非常に単純な暗号化をしていました。しかも、DoublePulsarバックドアは、鍵はランダムに作るものの、同じセッションの通信データで鍵を搬送しているなど、「種が分かっていれば」非常に脆弱な暗号方式でした(GIACのペーパー参照:2.5でDoublePulsarの通信にも少し触れている)。しかし、現実では、ペイロードに対するシグニチャが作れず、従って感染がなかなか止められない、という事態になりました。
ここから言えることは、暗号の強度が低くても、従来の方法では防ぐのが難しいということです。いくら「見れば分かる」程度の暗号であっても、広く使われていて自動アンパックツールが出回っているようなものでない限り、大量に流れてくるデータやプログラムを、自動的に様々な方法で復号することは、処理のコストの観点から厳しいということです。
こういったことから、最近では「振る舞い検知」が注目され始めています。また、分析にAIを使うようになってきました。
ただし、どういったメッシュで「振る舞い」を捉え、どのように判定していくかは今後の課題になりそうです。例えば、今回の暗号の復号処理だけでは、処理が小さすぎて、シグニチャを作るのも振る舞いを捉えるのも難しそうです。一方、アンチウィルスを回避した後の処理であれば、振る舞いも捉えやすいのかもしれません。また、仮に感染しても、実害が発生する前に発見、除去することも考えられます。これらは、これからの防御技術の発展のポイントの一つになるのではないかと思います。