マルウェア解析の現場から-06 「DGA」

マルウェア解析の目的は場面に応じて様々ですが、目的の一つはマルウェア対策に有用な情報を得ることです。マルウェア対策の基本的な方法には、ファイルを検査してそのファイルがマルウェアかどうかを判別する手法があります。マルウェアと同じコード(バイナリ列)が検索対象ファイル内に存在するかを調べるパターンマッチング、そしてこの仕組みを応用して検出可能な範囲を拡大したヒューリスティック的な検索手法です。ファイルを検査するこれらの手法は、マスメーリングワームのように飛んでくる流れ弾をブロックするには高い効果を発揮しました。しかし現在の攻撃者は、事前に自身が作成したマルウェアの検出状況を確認し、検出されない状態のファイルを用意してから攻撃を開始することがあります。そこで登場してきたのが、色々な検出技術を多層的に組み合わせて総合的な防御力を高めようという考え方です。コンピュータ内で行われる不正と思われる振る舞い(自身を自動起動するよう設定するなど)の検知や、マルウェアが行う通信の検知など、層が増えれば増えるほどそのすべてを突破するのは困難になり、いずれかの検出技術で検出できる可能性が高まります。一つの絶対的な検出手法があればシンプルで分かりやすいのですが、そのような方法がない現状では採りえる最善の方法と言えるでしょう。しかし、防御する側が新たな対策を講じれば攻撃者はその対策手法を分析して対策の網をかいくぐろうとします。結果として攻撃手法はさらに巧妙さを増していくのです。前置きが長くなりましたが、今回ご紹介するのはそのような巧妙さを増したマルウェアの一例です。

 

■接続先 C&Cサーバ名の生成

最近解析したマルウェア「BKDR_MOTHAK.A」は、C&Cサーバとの通信に HTTPプロトコルの GET および POSTメソッドを使用していました。感染端末から直接アクセスできない場合には、Internet Explorer または Firefox に設定されているプロキシ情報を取得して使用します。また、送受信するデータは暗号化されています。と、ここまでは従来から存在する「HTTP BOT」と大きな違いはありません。今回注目したいのは、接続先の C&Cサーバ名です。コードを一見すると、「f19d<省略>bdf2.cn」というハードコードされた(プログラム中にそのまま書かれた)名前を固定で使用しているように見えます(図1参照)。

図1
図1

しかし実際は、接続に失敗すると接続先 C&Cサーバ名を生成する仕組みを備えているのです。この接続先サーバ名を生成するコードは次のようになっています(図2参照)。

図2
図2

 このコードだけでは見えていない部分もあるので解説すると、仕組みはこうです。

  1. 「domain_name(初期値:”domainm”)」の文字列の最後尾に「domain_start(初期値:0)」をインクリメント(1増加)して得た数字を繋げて文字列を生成する。
    (例:”domainm1″)
  2. 1. で生成した文字列を基にして 16バイトの値を算出する。
    (例:89 E3 AA EC C2 BA 17 34 37 DF 44 21 36 62 07 04)
  3. 2. で生成した値の先頭 8バイトの 1バイト毎を 16進値として文字列に変換する。
    (例:”89e3<省略>1734″)
  4. 3. で生成した文字列に「.net」または「.cn」を順番に付加してドメイン名を生成する。
    (例:”89e3<省略>1734.net”)
  5. 接続先ドメイン名を変えての再試行の回数が「domain_max(初期値:100)」を超えたら、「domain_start」を初期値に戻して 1. から繰り返す。

つまり、「domainm1」「domainm2」「domainm3」・・・、と順に繰り返し「domainm100」までドメイン名の基となる文字列を生成するのです。そして、実際のドメイン名はこの生成した文字列を基に算出した値の文字列に「.cn」または「.net」を順に付加して生成しているのです。

■生成されたドメイン名の登録状況

生成されたドメイン名のホストに接続するためには、当然ながら DNS の仕組みに則ってあらかじめそのドメイン名が DNS に登録され名前解決できる必要があります。そこで先ほど解説したアルゴリズムで生成される可能性のある名前(「domainm0」~「domainm100」)に対して、DNS の登録状況を調べてみました(図3参照)。

図3
図3

結果としては、「domainm0」から「domainm2」までは登録がありましたが、「domainm3」以降は登録がありませんでした。登録がある IPアドレスはまだ接続可能な状態だったので、「domainm3」以降はまだ使う必要がなくただ予備として確保してあるような状況と言えるでしょうか。また、この登録状況を見ると、登録されているドメインの登録有効期限がすべて 2010年11月19日になっていることに気付かれるかと思います。実はこれを調査したのは 11月の初めでしたが、登録有効期限を迎えてどうなったかというと、すべて 2011年11月19日まで一年間更新されていました。このような不正な目的で利用されるドメイン名はすぐに利用されなくなり代わって新しい名前が使われることが多いですが、攻撃者はこれらのドメイン名をもうしばらく使い続けるつもりのようです。ところで、この表の中の「domainm0」の場合に生成されるドメイン名を見てください。この名前は実はハードコードされ最初に必ず利用する名前「f19d<省略>bdf2.cn」と同じになっています。それにもかかわらず一つだけハードコードもされているのは、解析者に対して接続先がこのドメイン名のみだと思わせようとするマルウェア作者の意図があるのかもしれません。

■INIファイルの存在

このドメイン名生成のアルゴリズムの中には「domain_name」「domain_start」「domain_max」といった名前が出てきました。実はこのマルウェアは、ここで使用する値の内容を外部ファイルから読み込む仕組みを備えています。一般に「INIファイル」と呼ばれている仕組みと同様です。このマルウェアが作成する INIファイル”msftcore.dat” の最初の状態は次のようになっています(図4参照)。

図4
図4

INIファイルが用意されているということは、そこで指定可能な設定項目の内容を簡単にカスタマイズできることを意味しています。つまり攻撃者には、接続先を図3 に挙げたドメイン名以外に変えることも簡単にできてしまうのです。

 

さて、今回見てきた接続先ドメイン名生成の仕組み自体は、新しいものではありません。このような仕組みは「Domain Generation Algorithm(DGA)」と呼ばれており、多くの被害を及ぼしたワーム「WORM_DOWNAD(別名:Conficker)」が用いることで有名になりましたし、最近でも ボットネット「ZeuS」(関連不正プログラム「TSPY_ZBOT」など)と関連して動作する「PE_LICAT」が利用することが分かっています(※1)。では攻撃者がこの DGA の仕組みを用いる理由は何でしょうか。それは明らかに URLフィルタリングへの対策でしょう。ファイル検索のみによらないマルウェア対策の代表的な手法として、マルウェアに関連する通信を検知してブロックする手法がありますが、その最も基本的な方法はマルウェアが行うと分かっている特定の URL への接続をブロックすることです。しかし DGA が用いられ、生成アルゴリズムもカスタマイズできてしまうことから、従来行われてきた不正URL のブラックリスト化だけでは完全な対策にならないことは明らかです。このような状況に対応するには、今回のような解析を通して生成アルゴリズムを明らかにし URLブラックリストの精度を可能な限り高めること、そして接続先URL が安全かどうかを総合的に判断する「Webレピュテーション」技術を導入することが必要になるでしょう。そして一つの技術では完全には防げない可能性を考え、様々な対策手法を併用して総合的に防御力を高める「多層防御」を行うことが肝要と言えそうです。

■参考■
※1:「ZeuS, Still a Threat; Now Also Spreading Through LICAT」(英語情報)