「アニマルファーム」と呼ばれるサイバー攻撃グループは、これまでキャスパー、バニー、ババールといった欧米アニメの主人公名が付されたマルウェアを生み出してきた。巧妙につくられたバックドア「Dino」(ディーノ)もまた「アニマルファーム」の関係者が開発したものと推定されてきたが、その内実が公開されることは今までなかった。
この記事は、ESETが運営するマルウェアやセキュリティに関する情報サイト
「We Live Security」の記事を基に、日本向けの解説を加えて編集したものです。
「アニマルファーム」とは、あるサイバー攻撃集団に対してカナダの通信安全保障局(CSE)が内々で付けた名称である。CSEでは2009年からその足取りをつかんでおり、技術レベルとしては「中程度」と評価し、総合的に見て、フランスの諜報機関ではないかと推定していた。このことは極秘であったが、2014年3月に米情報工学者のエドワード・スノーデン氏が暴露したことで周知のこととなった。
この間に、アニマルファームが作成したマルウェアが幾つか発見されてきた。
1)Casper(キャスパー)
2014年3月に発見されたステルス(=不可視)型のマルウェアであり、その名は作成者によって付けられた。米アニメ「出てこいキャスパー」(1959-1961)の主人公の白いお化けの名前に由来すると考えられる。
2)Bunny(バニー)
2011年10月に発見されたドロッパー型のマルウェアであり、その名は作成者によって付けられた。1940年から現在に至る米ワーナー・ブラザーズのアニメに登場する「バッグス・バニー」というウサギの名前に由来すると考えられる。
3)Babar(ババール)
2015年2月ごろに発見されたスパイウェアであり、その名はやはり、作成者によって付けられた。1931年にフランスの絵本作家によって描かれた絵本「ぞうのババール」の主人公の象の名前に由来すると推定される。20世紀末、21世紀初頭にアニメ化されフランスではよく知られたキャラクターである。
これらのマルウェアについてはESETやG DATAをはじめとした他の研究機関によって解析が行われてきたが、Dinoについては、カスペルスキーが端緒を開いただけでまだ十分には知られていない。そこで以下では、2013年にイランを標的として使用されたDinoを基に、少し詳しく考察を行いたい。
はじめに
Dinoのオリジナルの感染手法はまだ解明されておらず、現時点で推測されているのは、インストールの流れを見せなくするために、アンインストール・コマンドを内包していた別のプログラムによってインストールされたのではないか、ということである。
もしもこうした仕組みによってDinoが仕掛けられたとすれば、攻撃側の目的は、標的のファイルを盗み出すことと考えられる。
なお、Dinoという名称も、他と同様に、作成者が付けた実行ファイル名「Dino.exe」に由来している。アニマルファームのマルウェアであることから、Dinoは、1960年代の米アニメ「原始家族フリントストーン」のペット恐竜の名前に由来する、と考えるのが妥当のようだ。
一方、マルウェアとしてのDinoはバックドアに分類可能だが、モジュール形式で構築されており、かなり手が込んでいる。特に革新的なのは、不可視的にコマンドを実行するカスタムファイルシステムと、Unixコマンドの「cron」と似たような方式で動作する複雑なタスクスケジュールモジュールである。
バイナリには多数のエラーメッセージが含まれており、Dinoの開発者がどのような表現を選んだのかが分かる。また、幾つかの技巧の特徴からも、Dinoがフランス語を母語としている人物が作成したと考えられるのである。
Dinoの基本事項
1)モジュールリスト
DinoはC++で開発されており、かなりはっきりとしたモジュール構造を持っている。下記の表はDinoのバイナリに含まれるモジュールのリストである。なおモジュール名は開発者が付けたものである。
モジュール名
|
モジュール用途
|
---|---|
PSM | Dinoモジュール用ディスクコピー暗号化 |
CORE | 設定の保存 |
CRONTAB | タスクスケジューラ |
FMGR | ファイルのアップロード、ダウンロード管理 |
CMDEXEC | コマンド実行管理 |
CMDEXECQ | コマンド実行用キュの保存 |
ENVVAR | 多様な環境の保存 |
2)データ構造
Dinoはアニマルファームの開発者が「データストア」(DataStore)と名付けるカスタムデータ構造に大きく依存している。特にDinoの全モジュールがこの構造内にそのコンテンツとして保存されており、Dinoを解析する鍵の一つとなっている。
「データストア」とは、キー配列に始まり整数や文字列のような8つの可能な値を含む「マップ」のことである。このデータ構造の実装は、ハッシュ値のテーブルに基づいている。これは、キーに関連付けられた値を取得することを意味し、その値を取得するデータ群(バケット)を配置するためにキーのハッシュを計算しなければならない。
Dinoのハッシュはキー上で一連のXOR演算により計算された1バイト値であり、各バケットは、キー/値の組み合わせを含むリンクされたリストを開始する。キーに関連する値を取得する部分に当たるコードは、下記の図1のようになっている。
最終的には、データストアのオブジェクトは、カスタムフォーマットでシリアル化することができる。このフォーマットはマジックワード「DxSx」で始まっている。これは特にPSMモジュールでDinoのモジュールコンテンツを暗号化ファイルに保存するために使われている。より正確に言うと、メモリ上でモジュールのコンテンツに変更が加わると、PSMモジュールはそれをデータストアの系列として保存する。Dinoを再起動すると、モジュールはファイルの系列化から開放され、メモリ内にロードされる。
非常に興味深いことに、ディスクのファイルを暗号化するためのキーは「PsmIsANiceM0du1eWith0SugarInside」となっている。
3)Dinoの設定
最初Dinoの設定は、Dinoのバイナリの終了時にzip形式のアーカイブに含まれる系列化された「データストア」のオブジェクト内に保存されている。実行時に、このオブジェクトは系列化から開放され、COREモジュール内に保存される。Dinoの「conf -l CORE」というコマンドを使って設定内容を一覧表示できる。各行に対しそれぞれのキー名、関連付けられた値、この値のタイプが表示される。
InitialWaitDone:00000001 DWORD
InteractiveDelay:00000005 DWORD
MaxNothingSaidCount:00000078 DWORD
InstallDate: 5523F782 QWORD
fields:78537844…[REDACTED]…66B3900 BYTES
recID:11173-01-PRS WIDESTR
Version:1.2 WIDESTR
BD_Keys: 4D41474943424F58…[REDACTED]…9EB3506 BYTES
CC_Keys: 4D41474943424F58…[REDACTED]…0000000 BYTES
MaxDelay:00000E10 DWORD
ComServer0:hXXp://www.azhar.bf/…[REDACTED]…/postal.php STR
ComServer1:hXXp://www.rsvniima.org/…[REDACTED]…/din12/postal.php STR
ComServer2:hXXp://www.azhar.bf/…[REDACTED]…/postal.php STR
ComServer3:hXXp://www.rsvniima.org/…[REDACTED]…/din12/postal.php STR
ComServer4:hXXp://dneprorudnoe.info//…[REDACTED]…/postal.php STR
ComServer5:hXXp://dneprorudnoe.info//…[REDACTED]…/postal.php STR
ComServer6:hXXp://dneprorudnoe.info//…[REDACTED]…/postal.php STR
NextSendReceive:5CC33097FB72D001 BYTES
CC:000064F7-72E4-3F7D-C817-474D-A9BDBDF7 STR
DaysOfLife:00000000 DWORD
GUID:12FEB4A9EEDEE411B283000C29FD2872 BYTES
InitialDelay:00000000 DWORD
now:5523F78E QWORD
hash:A88E8181CA5CE35AE70C76145DFB820D BYTES
InitialCommands:78537844…[REDACTED]…000000 BYTES
xT0rvwz:DC188352A…[REDACTED]…00000 BYTES
tr4qa589:K/[RAFtIP?ciD?:D STR
jopcft4T:a.ini WIDESTR
ほとんどのキーの名称でおおよその役割が分かる。幾つかのキーについては、もう少し説明しておく。
recID
アニマルファームのバイナリにはIDが含まれており、この10進数値が標的を識別している。この場合は「11173-01-PRS」となる。例えば、Casperは「13001」に設定されたIDを使用し、一方Babarのサンプルでは「12075-01」や「11162-01」が使われている。なお、Dinoに追加された接尾語“PRS”の意味は不明である。
ComServer
これらのキーにはC&CサーバーのURLが含まれている。解析当初は、全てのURLが停止していた。このC&Cは正当なWebサイトを侵害している可能性があるが、アニマルファームの標準的操作手順でもある。
Version
Dinoのコードのバージョンを意味し、ここでは「1.2」に設定されており、これはC&C URLの一つで使われる「din12」フォルダで確認される。記録から「d13」フォルダは別のアニマルファームのC&Cで見られる。これはDinoのバージョン1.3がある時点で展開されるであろうことを示唆している。
BD_Keys、CC_Keys
C&Cサーバーとのネットワーク通信を暗号化する暗号鍵が含まれている。これらは「MAGICBOX」といった単語で始まる。
なお、最後の3つのキーは「xT0rvwz」「tr4qa589」「jopcft4T」といたように難読化され、後に説明するカスタムファイルシステムのパラメータを保存する。
4)コマンド
次の表はDinoの開発者が名付けたバイナリで受け入れられるコマンドリストである。これらの各コマンドが1以上の引数を取ることができる。
コマンド
|
目的
|
---|---|
sysinfo | マシンの偵察情報取得 |
killBD | カスタムファイルシステムを用いたDinoのアンインストール(詳細は下記のramFS参照 ) |
! | パラメータとして渡されたWindowsバッチコマンドの実行 |
cd | カレントディレクトリの変更 |
pwd | カレントディレクトリのパスを表示 |
dir | 追加情報を使ってディレクトリ内のファイルリスト表示 |
set | ENVVARモジュールに保存されている環境変数の設定、削除 |
conf | モジュールコンテンツの表示もしくはアップデート |
search | 検索されたファイルはアーカイブされ、パターンに一致する名称のファイル検索。FMGRモジュールを用いてC&Cにアップロードされる |
archive | ファイルをパスごとアーカイブ |
unarchive | その場にアーカイブを開放 |
download | FMGRモジュールを用いてC&Cにファイル転送予約 |
cancel | FMGRモジュールにある次のファイル転送予約の削除 |
cancelall | FMGRモジュールにある全てのファイル転送予約の削除 |
cronadd | CRONTABモジュールにより決められた時間に実行されるコマンド予約(詳細は下記のCRONTAB参照) |
cronlist | CRONTABモジュールに登録されているエントリのリスト表示 |
crondel | CRONTABモジュール内エントリの削除 |
wakeup | CRONTABモジュールを用いてある時間の後マルウェア覚醒の予約 |
restart | 該当なし:未実装 |
showip | 感染マシンのパブリックIP表示 |
cominfos | カレントC&Cサーバー情報の表示 |
comallinfos | 全てのC&Cサーバー情報の表示 |
wget | カレントC&Cサーバーからファイルをマシンにダウンロード |
delayttk | マルウェアのアンインストール遅延、ただし予約がある場合 |
この中で特に興味深いコマンドは「search」である。このコマンドによって非常に正確にファイル検索ができる。例えば「.doc」拡張子のあるファイル、10キロバイト以上のファイルサイズを持つもの、ここ3日間に編集されたファイル、といったような検索が可能である。つまりDinoの最終的な目的が、こうした検索機能によってファイルを盗み出すことにあると考えることができるのである。
起動時にDinoは設定ファイル内「InitialCommands」に保存されているコマンドを順次実行する。ここで解析しているサンプルは次のようになる。
cominfos
!ipconfig /all
!ipconfig /displaydns
!tracert www.google.com
これらのコマンドは攻撃者が偵察できるようにするステップとなる。この実行はCMDEXECモジュールで管理され、CMDEXECQモジュール内のキュとして格納されているコマンドであり、結果はC&Cサーバーに送られる。
それでは次に、2つの興味深い事象を掘り下げてみたい。1つはマルウェアに用いられるカスタムファイルシステムで、もう1つがタスク予約を担うCRONTABである。
RamFS(一時ファイルシステム)
Dinoには開発者が「ramFS」と名付けたカスタムファイルシステムがある。これはメモリ上にファイルを格納する複雑なデータ構造を提供する。その各ファイルには、通常のファイルシステムで使用されるファイル名に対応する名称がある。RamFSもまた、ファイルに格納され実行されるカスタムコマンドのセットに付属している。RamFSは別のアニマルファームのバイナリ(下記の帰属問題を参照)にも存在しており、これは注目すべきことである。
1)アーキテクチャ
初めramFSのコンテンツは、キー「xT0rvwz」としてDinoの設定内に暗号化され格納される。一方、対応するRC4キーはキー「tr4qa589」に格納される。ファイルシステムがいったん複合化されると、512バイトのメモリ・チャンクの関連するリストとして、メモリに格納される。各メモリ・チャンクは、個別にRC4暗号化されている。RamFSにファイルが見つかると、各チャンクは複合化され、それにのっているプロセスを行い、再度暗号化される。そのため、ramFSの顕著な痕跡はあまり残らない。
このファイルシステムにおけるハイレベルな特色は次のとおり。
- ファイル名とファイルのコンテンツがユニコードでエンコードされている
- ファイル名の長さは260文字の制限がある
- 一度複合化されるとファイルのコンテンツは540バイトのチャンクとして扱われる
- ファイルに関連するメタデータがない
メモリ構造とramFSの特徴とが一致するようなファイルシステムを見つけられないため、このファイルシステムはアニマルファームのオリジナルであると思われる。
2)コマンド
RamFSの環境下ではコマンド実行が可能である。リストは下記のようにまとめられる。
コマンド
|
意味
|
---|---|
CD | 実ファイルシステム上のカレントディレクトリ移動 |
MD | 該当なし:未実装 |
INSTALL | Dinoのインストールまたはアンインストール、Windows上にサービスとしてのレジストリ登録 |
EXTRACT | マシン上のramFSに保存されたファイルの抽出 |
DELETE | マシン上に保存されているファイルの削除 |
EXEC | RamFSに格納されているファイルの実行 |
INJECT | 実行プロセスにramFSに格納されているファイルを注入 |
SLEEP | 一定時間のスリープ |
KILL | 実行プロセスの終了 |
AUTODEL | 該当なし:未実装 |
3)DinoにおけるramFSの使われ方
Dinoの場合、ramFSはマシンからマルウェアを削除する命令を含むある特別なファイルのためのプロテクトストレージとなり得る。開発者はこのファイルを「cleaner」と名付けた。このファイルはDinoが「killBD」コマンドを受けると実行される(「BD」はマルウェアの開発者の頭字語である)。
図2は、この「cleaner」ファイルのコード内実行部分である。まず、Dinoの設定(「a.ini」)からファイル名を取得し、次にramFSを復号化するキーを取得する。最後に内部に格納されている「cleaner」ファイルを実行するためにファイルシステムをメモリ上にマウントする。冗長的なエラーメッセージはとりわけコードの目的を理解しやすくしてくれる。

「cleaner」ファイルには 文字列「INSTALL -A“wusvcd” U」が含まれる。これは一度実行されると、マシンからマルウェアがアンインストールされる。「wusvcd」はマシン上でDinoのレジスタとして使用されている文字列である。
それゆえ、ramFSはその使い手に使い捨て可能な実行環境を与え、システム上にほとんど痕跡を残さずに、マシン上で実行されるファイルのプロテクトコンテナとして役務提供を行う。
4)Unix形式のタスクスケジュール
管理コマンド「cronadd」「cronlist」そして「crondel」は、それぞれCRONTABモジュールに登録されているスケジュール化されたタスクを追加、リスト化、削除を行う。これらのタスクはDinoのコマンドになっている。
スケジュール化されたタスクを定義する構文は、Unixコマンドのcronに用いられているものと似ている。特にコマンドを実行する時刻が「分 時 日 月 年 曜日」の文字形式で与えられるところがある。大抵のUnixにおけるcronの実装がその各起動時に「@reboot」を受け入れるのに対し、これらの文字列は「@boot」に置き換えることができる。
例として、ここでは、2015年4月7日15:44に実行をスケジュール化された「wakeup」コマンド実行後の「cronlist」コマンドリストを紹介する。
ご覧のように、各エントリはIdで指定される。このIdは0xC0をから始まる16進数の増分文字列となる。「Local」フィールドは不明(ほかに可能な値として「-l」がある)。 「Count」パラメータはコマンドが実行される時間の回数で「-1」はコマンドがたった1回しか実行されないことを意味する。最後に「Visibility」フィールドはコマンド実行がC&Cサーバーに報告されるかどうか(ほかに可能な値として「Silent」がある)を示している。
帰属問題
1)Dinoとアニマルファームの関係
Dinoとアニマルファームのマルウェア間で共有されているコードの量からして、Dinoがアニマルファームに属することはほぼ間違いない。これらの共通する特徴から、次のような指摘ができる。
- Dino実行の初めの部分では、カレントプロセス名はサンドボックスで使われるプロセス名に対してチェックされている。

Bunnyのサンプルにもこれとよく似たチェックがある(「klavme」「myapp」「TESTAPP」および「afyjevmv.exe」に対して)。
- 特定のAPI関数の呼び出しを隠すため、Dinoでは昔アニマルファームが取っていたやり方を採用している。つまり、関数名からハッシュを計算し、API関数のアドレスを探すために使っている。Dinoで使われる実際のハッシュアルゴリズムはCasperのものと同じで、7ビットrotate-left(ROL)とexclusive-or (XOR) の組み合わせになっている。
- Dinoのカスタムファイル、いわゆるramFSは、アニマルファームが使用するドロッパーにも見られる。これらのバイナリで、ファイルシステムはペイロードの永続性を設定する。例として、ここではramFSのコンテキストにあるNBOTドロッパーによって実行されるコマンドを紹介しておく。

- 最後にDinoがアニマルファームの一部だと考える理由として、Dinoのsysinfoコマンド出力が流出したCSEのスライドにおいて指摘されている内容(SNOWBALL)から「beacon」のバージョンアップの様子とよく似ていることも注目すべき点である。この「SNOWBALL」は、SNOWGLOBE操作の一部分であり、そこにBabarを発見することができる。
Dino’s sysinfo example output |
---|
Login/Domain (owner): Administrator/JOHN (john) Computer name: JOHN Organization (country): (United States) RecId: 11173-01-PRS MaxDelay: 3600 Version: 1.2 OS version (SP): 5.1 (Service Pack 3) WOW64: No Default browser: firefox.exe IE version: Mozilla/4.0 (compatible; MSIE 7.0; Win32) First launch: 04/01/2015 18:31:14 Time to kill: N/A Last launch : 04/01/2015 19:21:44 Mode: N/A | Rights: Admin | UAC: No ID: 4635BEF0-D89D-11E4-B283-000C-29FD2872 InstallAv: 0 Inj: Yes |
SNOWBALL implant beacon |

これらを合わせると、Dinoがアニマルファームの関係者によって開発されたと考えることができるのである。
2)フランス語圏の開発者
すでに述べたこと以外で少なくとも2点以上、Dinoによって、アニマルファームの開発者がフランス語圏の人物であるという証拠がある。
- Dinoのバイナリには、その言語コード値が1036であるリソースが含まれている。この言語コードの本来の目的は、世界中の異なる地域において、その地域の言語で開発者がリソース(メニュー、アイコン、バージョン情報など)が得られることである。興味深いことに、開発者が手動で言語コードを指定しない限り、コンパイラが開発者のマシン上の言語を設定する。1036という値または0x40cがどの言語に対応するか、すでにお分かりであろう。それはフランス語なのである。
もちろん非フランス語圏の開発者が帰属性を欺くために、作為的にこの値を設定したと考えられなくもない。しかし、直近のアニマルファームのバイナリ(例えばCasper)では、この言語コードが標準英語(USA)の言語コードに設定されていた。そのため、アニマルファームの開発者は一番初めの作成時にこの値を設定し忘れ、あるときそれに気付き、標準値としようと決めたように思われる。
このDinoのサンプルから読み取れるのは、言語コードとして1036を用いたというだけではない。 - Dinoのバイナリは静的にGnuMPライブラリとリンクしている。このライブラリは、暗号化アルゴリズムで大きな数を効率よく処理するのに使われる。DinoのGnuMPコードは開発者のマシンに由来するファイルパスが含まれている。
..\..\src\arithmetique\mpn\mul.c ..\..\src\arithmetique\printf\doprnt.c ..\..\src\arithmetique\mpn\tdiv_qr.c ..\..\src\arithmetique\mpn\mul_fft.c ..\..\src\arithmetique\mpn\get_str.c |
すでに気付かれている方もいるかもしれないが、“arithmetique”は“arithmetic”のフランス語なのである。
3)結論
Dinoのバイナリを見ると、カスタムデータ構造からホームメイドのファイルシステムまで開発者の一貫した意気込みが感じられる。ほかのアニマルファームのバイナリと同様に、専門能力が高く経験豊かな開発者であると見受けられる。
しかしCasperと比べると、Dinoは、知識もしくは知性にやや劣ると思われる側面も見られる。例えば、Dinoのログのメッセージ出力にこのことが表れている。

これらのメッセージはDinoの作成事情を理解するのに非常に役立つ。メッセージ中にある多数のスペルミスに感謝したいところである。
なお、Dinoの被害に関しては、2013年にイランで発生したこと以外はほとんど分からない。これはカナダのCSEが記述している被害一覧と一致している。

以上のように、長々とDinoの解析を行い、開発者がフランス語圏の人物であることを証明してきたが、最後に、カナダのCSEが言及している、この仮説を裏付ける指標の一覧を付け加えてこの稿を閉じることにしたい。
4)脅威の痕跡
Indicator
|
Value
|
---|---|
Sample SHA1 | BF551FBDCF5A982705C01094436883A6AD3B75BD |
C&C URL | hXXp://www.azhar.bf/modules/mod_search/found/cache/postal.php |
C&C URL | hXXp://www.rsvniima.org/templates/rsv/icons/din12/postal.php |
C&C URL | hXXp://dneprorudnoe.info/sxd/lang/i18n/charcodes/postal.php |
Path | C:\Program Files\Common Files\wusvcd\wusvcd.exe |
Default storage file names | C:\ProgramFiles\Common Files\wusvcd\wusvcd00000000-0000-0000-0000-0000-00000000.{dax,dat,lck} |
Downloaded file name extension | .tmp_dwn |
Registry key | Software\Microsoft\Windows\Windows\CurrentVersion\Run\wusvcd |