
Windows API呼び出しシーケンスに基づくマルウェア機能のシグネチャベースの検出。サンドボックスAPIトレースのためのYARAのようなものです!
dynmx(ダイナミクスと発音)は、Windows API呼び出しシーケンスに基づいた、行動的なマルウェア特徴のシグネチャベース検出アプローチです。簡略化して言えば、dynmxは、マルウェアサンドボックスから得られるAPI呼び出しトレース(いわゆるファンクションログ)に対する一種のYARAと考えることができます。したがって、この検出アプローチのデータ基盤は、静的に解析されるマルウェアサンプル自体ではなく、マルウェアサンドボックス内での動的解析中に生成されるデータです。現在、dynmxは以下のマルウェアサンドボックスのファンクションログをサポートしています。
report.json ファイル)report.json ファイル)この検出アプローチは、修士論文「Signature-Based Detection of Behavioural Malware Features with Windows API Calls」で詳細に説明されています。このプロジェクトはそのアプローチのプロトタイプ実装であり、修士論文の過程で開発されました。シグネチャは、マルウェアアナリストがdynmxシグネチャDSLで手動で定義し、このツールを使用してファンクションログ内で検出できます。dynmxシグネチャDSLの機能と構文についても、修士論文で確認できます。さらに、サンプルのdynmxシグネチャはリポジトリdynmx-signaturesにあります。API呼び出しに基づくマルウェア特徴の検出に加えて、dynmxはマルウェアによって使用されるOSリソース(いわゆるアクセスアクティビティモデル)を抽出できます。これらのリソースは、API呼び出しを調べ、OSリソースに対する操作を再構築することによって抽出されます。現在、モデルではファイルシステム、レジストリ、ネットワークのカテゴリのOSリソースが考慮されています。
次のセクションでは、マルウェア特徴の検出とリソースの抽出の例を示します。
この例では、SHA-256ハッシュ値がc0832b1008aa0fc828654f9762e37bda019080cbdd92bd2453a05cfb3b79abb3のマルウェアサンプルを選択します。MalwareBazaarによると、このサンプルはマルウェアファミリーAmadeyに属します。このサンプルに対して、VMRayがトレースしたファンクションログも提供する公開VMRay分析レポートが利用可能です。このファンクションログが検出に使用するデータ基盤となります。
マルウェアサンプルがProcess Hollowingと呼ばれるインジェクション技術を使用しているかどうかを知りたい場合、ファンクションログ内で以下のdynmxシグネチャを検出してみることができます。```yaml dynmx_signature: meta: name: process_hollow title: Process Hollowing description: Detection of Process hollowing malware feature detection: proc_hollow: # Create legit process in suspended mode - api_call: ["CreateProcess[AW]", "CreateProcessInternal[AW]"] with: - argument: "dwCreationFlags" operation: "flag is set" value: 0x4 - return_value: "return" operation: "is not" value: 0 store: - name: "hProcess" as: "proc_handle" - name: "hThread" as: "thread_handle" # Injection of malicious code into memory of previously created process - variant: - path: # Allocate memory with read, write, execute permission - api_call: ["VirtualAllocEx", "VirtualAlloc", "(Nt|Zw)AllocateVirtualMemory"] with: - argument: ["hProcess", "ProcessHandle"] operation: "is" value: "$(proc_handle)" - argument: ["flProtect", "Protect"] operation: "is" value: 0x40 - api_call: ["WriteProcessMemory"] with: - argument: "hProcess" operation: "is" value: "$(proc_handle)" - api_call: ["SetThreadContext", "(Nt|Zw)SetContextThread"] with: - argument: "hThread" operation: "is" value: "$(thread_handle)" - path: # Map memory section with read, write, execute permission - api_call: "(Nt|Zw)MapViewOfSection" with: - argument: "ProcessHandle" operation: "is" value: "$(proc_handle)" - argument: "AccessProtection" operation: "is" value: 0x40 # Resume thread to run injected malicious code - api_call: ["ResumeThread", "(Nt|Zw)ResumeThread"] with: - argument: ["hThread", "ThreadHandle"] operation: "is" value: "$(thread_handle)" condition: proc_hollow as sequence
署名に基づくと、*dynmx* を強力にするいくつかのDSL機能が見つかります:
* 代替パスを持つAPI呼び出しシーケンスの定義
* 正規表現によるAPI呼び出し関数名のマッチング
* 複数の演算子による引数と戻り値のマッチング
* 変数の保存(例:API呼び出しシーケンス内でのハンドルの追跡)
* ブール演算子(`AND`、`OR`、`NOT`)を使用した検出条件の定義
上記の署名を *dynmx* でサンプル `c0832b1008aa0fc828654f9762e37bda019080cbdd92bd2453a05cfb3b79abb3` の関数に対して実行すると、署名が検出されたことを示す以下の出力が得られます。```
$ python3 dynmx.py detect -i 601941f00b194587c9e57c5fabaf1ef11596179bea007df9bdcdaa10f162cac9.json -s process_hollow.yml
|
__| _ _ _ _ _
/ | | | / |/ | / |/ |/ | /\/
\_/|_/ \_/|/ | |_/ | | |_/ /\_/
/|
\|
Ver. 0.5 (PoC), by 0x534a
[+] Parsing 1 function log(s)
[+] Loaded 1 dynmx signature(s)
[+] Starting detection process with 1 worker(s). This probably takes some time...
[+] Result
process_hollow c0832b1008aa0fc828654f9762e37bda019080cbdd92bd2453a05cfb3b79abb3.txt
出力形式を detail に設定することで、さらに詳細を確認できます。関数ログで検出された正確なAPI呼び出しシーケンスを見ることができます。さらに、プロセス 51f0.exe でシグネチャが検出されたことがわかります。```
$ python3 dynmx.py -f detail detect -i 601941f00b194587c9e57c5fabaf1ef11596179bea007df9bdcdaa10f162cac9.json -s process_hollow.yml
|
__| _ _ _ _ _ / | | | / |/ | / |/ |/ | // _/|/ _/|/ | |/ | | |_/ /_/ /| |
Ver. 0.5 (PoC), by 0x534a
[+] Parsing 1 function log(s) [+] Loaded 1 dynmx signature(s) [+] Starting detection process with 1 worker(s). This probably takes some time...
[+] Result Function log: c0832b1008aa0fc828654f9762e37bda019080cbdd92bd2453a05cfb3b79abb3.txt Signature: process_hollow Process: 51f0.exe (PID: 3768) Number of Findings: 1 Finding 0 proc_hollow : API Call CreateProcessA (Function log line 20560, index 938) proc_hollow : API Call VirtualAllocEx (Function log line 20566, index 944) proc_hollow : API Call WriteProcessMemory (Function log line 20573, index 951) proc_hollow : API Call SetThreadContext (Function log line 20574, index 952) proc_hollow : API Call ResumeThread (Function log line 20575, index 953)
### Resources
関数ログからアクセスされたOSリソースを抽出するには、単に関数ログに対して*dynmx*コマンド`resources`を実行するだけです。詳細な出力の例を、SHA-256ハッシュ値`601941f00b194587c9e57c5fabaf1ef11596179bea007df9bdcdaa10f162cac9`のサンプルについて以下に示します。これは、[Avast-CTU Public CAPEv2 Dataset](https://github.com/avast/avast-ctu-cape-dataset)に含まれるCAPEサンドボックスレポートです。```
$ python3 dynmx.py -f detail resources --input 601941f00b194587c9e57c5fabaf1ef11596179bea007df9bdcdaa10f162cac9.json
|
__| _ _ _ _ _
/ | | | / |/ | / |/ |/ | /\/
\_/|_/ \_/|/ | |_/ | | |_/ /\_/
/|
\|
Ver. 0.5 (PoC), by 0x534a
[+] Parsing 1 function log(s)
[+] Processing function log(s) with the command 'resources'...