GandCrab v5.2ランサムウェアで使用された動的解析の回避手法

最近活発に出回っているGandcrabランサムウェアには、動的解析環境を回避するためのコードが挿入されている。これにより、動的解析環境で正常に作動せずに終了する、または時間遅延によって分析に長時間かかるようにして検出を回避している。

現在確認されている動的解析環境回避コードは、以下の通りである。

– SetErrorMode関数によるAnti-Sandbox

– SetTimer関数による時間遅延

1.SetErrorMode関数によるAnti-Sandbox

まず、Gandcrabが主に使用するPackerには、以下の[図1]のようにSetErrorMode関数を利用してCuckoo Sandboxを回避するコードが存在する。

[図1] SetErrorModeによるAnti-Sandbox

SetErrorMode関数はProcessDefaultHardErrorModeを設定したあと、過去に設定されたErrorModeを返す関数である。ErrorModeは、システムでエラーが発生したときの処理方法について設定している。このとき、[図1]のコードを見ると一般的な状況では以下のようなフローを示す。

[図2] 一般的な状況での実行フロー

(1) SetErrorMode(0x400)

– ErrorModeで0x400を設定し、過去に設定されたErrorMode値が返される。

(2) SetErrorMode(0x0)

– ErrorModeで0x0を設定し、直前に設定された1番の引数値0x400が返される。

(3) CMP, JE, ExitProcess

– (2)の結果で返された値0x400が1番の引数値に使用された0x400と同じかを確認して分岐(ランサムウェアの実行)する。

ここで問題となるのは、Cuckoo Sandbox等で利用されている、SEM_NOALIGNMENTFAULTEXCEPT (0x0004) ErrorModeである。 

(引用元:https://github.com/cuckoosandbox/monitor/blob/master/bin/monitor.c)

[図3] Cuckoo Sandboxで利用されているErrorMode

この値は、Memory alignment faultを自動で変更する値であり、一度設定すると以降、その値を初期化しようとする試みを無視する特性がある。これによって、ErrorModeが設定されたあと、[図1]コードのフローは先ほど示した[図2]のフローとは異なり、以下の[図4]のようなフローを持つようになる。

[図4] SEM_NOALIGNMENTFAULTEXCEPTが設定された環境での実行フロー

(1) SetErrorMode(0x400)

– ErrorModeで0x400を設定しようとするが、以前に設定したSEM_NOALIGNMENTFAULTEXCEPTを初期化しようとする試みが無視され、0x404が設定される。戻り値は[図3]の設定により0x8007を返される。

(2) SetErrorMode(0x0)

– ErrorModeで0x0を設定しようとするが、以前に設定したSEM_NOALIGNMENTFAULTEXCEPTを初期化しようとする試みが無視され、0x4が設定される。戻り値は1番により設定された0x404を返される。

(3) CMP, JE, ExitProcess

– (2)の結果で返された値0x404は1番の引数値に使用された0x400と異なり、プロセスを終了する。

このようにSetErrorMode関数を利用してSandboxを検出し、プロセスの終了によって動的解析環境で正確な結果が出ないように妨害する手法が存在する。

2.SetTimer関数による時間遅延

以下は、SetTimer関数を利用してGandCrabの主要な暗号化動作を一定時間後に発生させる部分について説明する。SetTimerを設定して実行させる方法であり、GandCrabではウィンドウプロシージャおよびメッセージを利用した。 

「AnaLab_sucks」というクラス名でウィンドウプロシージャを作成し、そのプロシージャがSetTimerとして機能するようにする。このとき、GandCrabでは1.337秒のタイマーを設定する。

[図5] CreateWindowExWによってウィンドウプロシージャを作成
[図6] SetTimer 1337msに設定

そして、DispatchMessage関数によって「AnaLab_sucks」というプロシージャが呼び出されるようにするが、上記のように「AnaLab_sucks」はSetTimerが実行されるようになっているため、DispatchMessageで「AnaLab_sucks」を発生させるたびに1.337秒の遅延が発生する。 

最近出回っているGandCrabはDispatchMessageを20回発生させるため、合計で26.74秒の遅延が発生する。

[図7] DispatchMessageWで「AnaLab_sucks」プロシージャを呼び出し
[図8] 20(0x14)回発生チェック後、KillTimerで遅延終了

このように、時間遅延を意図的に発生させることで動的解析環境の即時モニタリング検出を困難にする。当社では、確認および分析を通して、最新ファイルが回避されることなく検出できるように、迅速に適用と対応を続けている。

GandCrabは、現在V3で次の通り診断している。

ファイル診断:Trojan/Win32.GandCrab

行為診断:Malware/MDP.Ransom.M1711

0 0 vote
Article Rating
guest
0 Comments
Inline Feedbacks
View all comments