Cuckoo Sandboxのanti-anti-sandbox処理(1)からの引き続きで,Cuckoo Sandboxのanti-anti-sandbox処理(2)です.
Cuckoo Sandboxでは仮想マシン上で動くゲストOSを解析環境として利用します.このゲストOSが仕事用や家庭用などの通常の用途の環境としてあまりに不自然だと,マルウェアは怪しいと気づくかもしれません.たとえば通常の環境では「最近使用したファイル」にファイルがたくさん並んでいて,ここに何もファイルがなかったら怪しいですよね.インストール直後ならいざ知らず,OSを数時間使うだけで,そこにファイルがたまっていくはずです.なお,「最近使用したファイル」は,エクスプローラーを起動すれば何も指示しなくてもウィンドウ内に表示されるので,そこで確認できます.
Cuckoo Sandboxは,おそらく解析環境であると見破られにくくするために,ゲストOSにダミーファイルを作成します.Cuckoo Sandboxのソースツリーのrecentfiles.pyというファイルに書かれたPythonプログラムに,その作成処理が記述されています.
Github: master/cuckoo/data/analyzer/windows/modules/auxiliary/recentfiles.py
このプログラムを読めばわかりますが,ダミーファイルのファイル名は,10~20文字のランダム文字列に "txt", "rtf", "doc", "docx", "docm", "ppt", "pptx" のどれかの拡張子をランダムで付けたものです.ファイルのサイズと中身も,ランダムな長さのランダムなバイト列です.作る場所はデスクトップなどです.作るファイルの数は5~10です.
ファイル作成に合わせて,"File MRU" という文字列を含むパスのレジストリエントリも書き換えます.
Cuckoo SandboxのゲストOSの画面を見たことのある人は,解析の冒頭でデスクトップに,いかにもランダムなファイル名のWordファイルやテキストファイルがワッと作成されるのを見たことがあると思います.あれはマルウェアが作っているのではなく,Cuckoo Sandboxが作っています.
recentfiles.pyの主にこのへんのコードを読むと,上で述べたような,ダミーファイルを作成する方針がわかります.
for idx in xrange(random.randint(5, 10)):
filename = random_string(10, random.randint(10, 20))
ext = random.choice(self.extensions)
filepath = os.path.join(dirpath, "%s.%s" % (filename, ext))
open(filepath, "wb").write(os.urandom(random.randint(30, 999999)))
SHELL32.SHAddToRecentDocs(SHARD_PATHA, filepath)
set_regkey_full(
"HKEY_CURRENT_USER\\Software\\Microsoft\\Office\\12.0\\"
"Word\\File MRU\\Item %d" % (idx + 1),
"REG_SZ", "[F00000000][T01D1C40000000000]*%s" % filepath,
)
Cuckoo Sandboxは他の方法でも解析環境「らしさ」を払拭しています.たとえば同じディレクトリにあるhuman.pyというプログラムでは,自動的にマウスを動かしてくれたり,ウィンドウ内のボタンをクリックしてくれたりします.
Github: master/cuckoo/data/analyzer/windows/modules/auxiliary/human.py
Cuckoo SandboxのゲストOSの画面を見たことのある人は,やはり,自分が何もしていないのにマウスがヒョコヒョコ動いてボタンもなぜかクリックされるのを見たことがあると思います.あれもCuckooのしわざです.
とはいえ,これらの処理も人間が見れば,明らかにランダムなファイルですし変なマウスの動きですので,怪しいことにはすぐに気づきます.どれくらい解析環境「らしさ」を払拭するのか,どの程度で妥協するのか,まさにいたちごっこの世界です.チューリングテストの話にも近くなってきますね.