どんな状態?Dridexの未発見、新レシピ

先日のLocky ランサムウェアの勃発により、Dridexはより広い意味でランサムウェア拡散の代名詞とも言える状態になってきました。ですが、Dridexはまだ通常の悪行、つまり銀行系トロイの木馬としての悪行も行っています。今度のHITBAMS2016で、Kernel Exploit hunting and mitigation(カーネルエクスプロイトの発見と緩和策)の話をするのですが、そのための素材を準備していたところ、Dridexの新たな亜種(SHA1:455817A04F9D0A7094038D006518C85BE3892C99)を発見しました。これが少々興味深いものなのです。

アンチウイルスキラーの達人

何度か簡単に文字列をチェックしてみたところ、Dridexはいくつかの主要セキュリティソフトウェアベンダーの回避を試みていると私たちは考えました。Dridexが用いている回避メカニズムが、こうしたセキュリティソフトウェアのすべてをどのように緩和しようとするのかは、今回は詳しく検証しませんでした。なぜなら、それらはこれ以前の亜種に存在しているものだからです。ですが、別のセキュリティベンダーを標的とする新たなモジュールの文字列を発見しました。そこで、このモジュールを見てみることにしました。Dridexの最新亜種とそれ以前の亜種のバイナリの差分を取ってみると、dropper_routine1というルーチンに新たな変更があり、その1つが気になりました。


図1: Dridexの最新亜種とそれ以前の亜種の差分を取った結果

影響を受けるセキュリティベンダーの製品が感染したマシン上にインストールされているのが見つかると、内部でmod9 と呼ばれるモジュールをダウンロードする dropper_routine1 に新たに変更があることがわかりました。そこで私たちは、このモジュールをダウンロードしてみました。これで、上記のセキュリティソフトウェア製品を回避する能力がDridexに備わっているという私たちの仮説を裏付けることとなりました。

この問題について、影響のあるセキュリティベンダーの友人に連絡を取ってみましたが、本記事を書いている時点では彼らからまだ何の返答もありません。さらに、この脆弱性がどの程度本物であり、彼らの製品への影響がどれほど深刻なのかがまだわかっていません。この脆弱性を悪用しても、たいしたことにはならないからです。そこで私たちは、現時点ではmod9 の詳細な実装については公開しないことにしました。

「module 5」に隠された謎

Dridex(Dyreとしているベンダーもある)は2015年5月、Microsoft Windows製品のカーネルの脆弱性CVE-2015-0057(パッチ公開済)を悪用する初のマルウェアファミリーとして発見されました。パッチは2015年2月、Dridexがこの脆弱性の悪用を開始する前にMicrosoftから MS15-010として公開されました。簡単に言えば、カーネルの脆弱性を悪用することで、このマルウェアは感染したマシン上でシステムの特権(NT AUTHORITYSYSTEM)を得るため、特権を昇格(EoP)することができるようになります。これにより、マルウェアは何のセキュリティ制限もなく、システムにフルアクセスできるようになります。しかし、このEoPペイロードは2015年7月以降に拡散されたDridexの亜種からは排除されていることに私たちは気づきました。

実際、Dridexを最近調べてみたところ、このマルウェアが現在も特権の昇格にEoPペイロードを利用しているにもかかわらず、そのペイロードはドロッパーのバイナリに直接埋め込まれていないことがわかったのです。しかしDridexのドロッパーは以下の条件が満たされると、内部で mod5 と呼ばれる、このEoPペイロードをダウンロードします。

  1. Microsoftの更新パッチKB3034344およびKB3013455がマシンにインストールされていないことを確認
  2. 現在のユーザーが管理者として実行していないことを確認

一方、現在のユーザーが管理者として実行している場合、ユーザーアクセス制御(UAC)を迂回するテクニックを利用して、プロセスの整合性レベルを「高」に昇格させます。Dridexが配備しているUAC迂回テクニックの1つに、AppCompatというホワイトリスト機能がありました。ただ、ここで言っておきますが、このUAC迂回テクニックも、Microsoftによってパッチが公開済みです。

Dridexの機能のほとんどは、リモートサーバーからダウンロード可能な様々なモジュールによって実行されており、そのモジュールのほとんどは、mod5以外、オンライン上の様々なDridexに関する記事で取り上げられています。Dridexの最新亜種が利用しているゼロデイがあるのかどうかを確かめるため、私たちはこのモジュールをダウンロードしたくなりました。幸いなことに、リモートサーバーにこのXMLローダーの構成データを送信することで、ダウンロードが可能になります。

<loader><get_module unique=”<MACHINE_NAME>" botnet="<BOTNET_ID>" system="64584" name="mod5" bit="64"/><soft><![CDATA[_LIST_OF_INSTALLED_SOFTWARES_&_LIST_OF_INSTALLED_MICROSOFT_ UPDATES_PATCHES;Starting path: 2]]></soft></loader>

また、このローダーの構成データは、HTTPSを使ってリモートサーバーに送信する前に、ハードコードされた鍵4FzyDVuTsVGUstulVjI3xL7E9NM48ytG5GwtTHbLXzC4pihROeを使ってRC4で暗号化しておく必要があります。

また、返答にあるデータは上記の同じ鍵を使ってRC4で暗号化されています。つまり、上で得たのと同じ鍵で復号が可能だということです。復号したデータは、XML形式でカプセル化されています。一方、タグで囲まれているデータBLOBはBase64でエンコードされています。

<root><module name="mod5" bit="64">BASE64_ENCODED_BLOB</module></root>

ですが、デコードされたBLOBの結果は、分析してみると少し残念なものでした。これも同じCVE-2015-0057のEoPの脆弱性を悪用していることがわかったのです。しかし、Dridexの基本的なネットワークインフラストラクチャーがどのように機能するかを理解することができたため、将来このモジュールの最新動向を容易に追跡していくことができるでしょう。

パッチ適用済みのマシンのパッチを削除?

最近のDridexの分析でもう1つ面白いことがわかりました。Microsoftによる更新をアンインストールするコマンドの文字列を発見したのです。ただ、このコマンドが使われたということはコードのどこにも書かれていませんでした。この機能は、Dridexの将来のバージョンで実装される可能性があるということでしょう。


図2: Microsoftのパッチをアンインストールするコマンドを示すデコード済みの一部文字列

結論

繰り返しますが、このマルウェアはパッチ公開済みの脆弱性を狙う様々なエクスプロイトを利用しています。このマルウェアの機能の一部を停止させるには、Microsoftが公開している最新の更新プログラムをインストールすることが重要であるということを、改めて強調しておきたいと思います。もちろん、それでこのマルウェアに感染しないという保証はありませんが、このマルウェアによって、お使いのマシンが完全に侵害される際のハードルを高くすることはできます。DridexのサンプルはAVエンジンによってMalicious_Behavior.VEX.94として検出されています。また、ボットネットのトラフィックはIPSエンジンによってブロックされています。

付録

サンプルのハッシュ値
Dropper/Loader => 455817A04F9D0A7094038D006518C85BE3892C99
Mod5_x86 => 7C36064F766BD13DB7EC2F444F4605566269F8E7
Mod5_x64 => E608B456C816C07C60931FD6B20F74E46EBD7EF9

C&Cサーバー/P2Pピア
188.93.239.28:4843
38.64.199.33:4843
85.17.155.148:1234

Dropper/Loaderから得た、オフセット0x415E90で始まるデコード済みの文字列
DecodedStr = 00DF70E0 "LOCALAPPDATA"
DecodedStr = 00BF0590 "Low"
DecodedStr = 00BF55A8 ".sdb"
DecodedStr = 00BFA5C0 ".bat"
DecodedStr = 00BFF5D8 "open"
DecodedStr = 00C045F0 "sdbinst.exe"
DecodedStr = 00C09608 "iscsicli.exe"
DecodedStr = 00C0E620 "/q "%s""
DecodedStr = 00C13638 "System32"
DecodedStr = 00C18650 "SysWOW64"
DecodedStr = 00C1D668 "wusa.exe /uninstall /kb:%d /quiet /%srestart"
DecodedStr = 00C22680 "no"
DecodedStr = 00C27698 "force"