
Détection basée sur des signatures de caractéristiques de logiciels malveillants basées sur des séquences d'appels d'API Windows. C'est comme YARA pour les traces d'API de sandbox !
dynmx (prononcé dynamics) est une approche de détection basée sur des signatures pour les caractéristiques comportementales des logiciels malveillants, fondée sur les séquences d'appels API Windows. De manière simplifiée, vous pouvez considérer dynmx comme une sorte de YARA pour les traces d'appels API (appelées journaux de fonctions) provenant de sandboxes de logiciels malveillants. Ainsi, la base de données pour l'approche de détection n'est pas constituée par les échantillons de logiciels malveillants eux-mêmes, analysés de manière statique, mais par des données générées lors d'une analyse dynamique de l'échantillon dans une sandbox. Actuellement, dynmx prend en charge les journaux de fonctions des sandboxes suivantes :
report.json)report.json)L'approche de détection est décrite en détail dans le mémoire de master Signature-Based Detection of Behavioural Malware Features with Windows API Calls. Ce projet est l'implémentation prototype de cette approche, développée dans le cadre du mémoire de master. Les signatures sont définies manuellement par des analystes de logiciels malveillants dans le DSL de signature dynmx et peuvent être détectées dans les journaux de fonctions à l'aide de cet outil. Les fonctionnalités et la syntaxe du DSL de signature dynmx se trouvent également dans le mémoire de master. De plus, vous trouverez des exemples de signatures dynmx dans le dépôt dynmx-signatures. En plus de détecter les caractéristiques des logiciels malveillants basées sur les appels API, dynmx peut extraire les ressources OS utilisées par le logiciel malveillant (un modèle d'activité d'accès). Ces ressources sont extraites en examinant les appels API et en reconstituant les opérations sur les ressources OS. Actuellement, les ressources OS des catégories système de fichiers, registre et réseau sont prises en compte dans le modèle.
Dans la section suivante, des exemples sont présentés pour la détection de caractéristiques de logiciels malveillants et pour l'extraction de ressources.
Pour cet exemple, nous choisissons l'échantillon de logiciel malveillant avec la somme de hachage SHA-256 c0832b1008aa0fc828654f9762e37bda019080cbdd92bd2453a05cfb3b79abb3. Selon MalwareBazaar, l'échantillon appartient à la famille de logiciels malveillants Amadey. Un rapport d'analyse VMRay public de cet échantillon est disponible, qui fournit également le journal de fonctions tracé par VMRay. Ce journal de fonctions sera notre base de données pour la détection.
Si nous souhaitons savoir si l'échantillon de logiciel malveillant utilise une technique d'injection appelée Process Hollowing, nous pouvons essayer de détecter la signature dynmx suivante dans le journal de fonctions.```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
Sur la base de la signature, nous pouvons trouver certaines fonctionnalités DSL qui rendent *dynmx* puissant :
* Définition de séquences d'appels API avec chemins alternatifs
* Correspondance des noms de fonctions d'appels API avec des expressions régulières
* Correspondance des valeurs d'argument et de retour avec plusieurs opérateurs
* Stockage de variables, par exemple pour suivre les handles dans la séquence d'appels API
* Définition d'une condition de détection avec des opérateurs booléens (`AND`, `OR`, `NOT`)
Si nous exécutons *dynmx* avec la signature montrée ci-dessus contre la fonction de l'échantillon `c0832b1008aa0fc828654f9762e37bda019080cbdd92bd2453a05cfb3b79abb3`, nous obtenons la sortie suivante indiquant que la signature a été détectée.```
$ 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
Nous pouvons entrer plus en détail en définissant le format de sortie sur detail. Maintenant, nous pouvons voir la séquence exacte d'appels API qui a été détectée dans le journal de la fonction. De plus, nous pouvons voir que la signature a été détectée dans le processus 51f0.exe.```
$ python3 dynmx.py -f detail detect -i 601941f00b194587c9e57c5fabaf1ef11596179bea007df9bdcdaa10f162cac9.json -s process_hollow.yml