Dari Memory Dump Menjadi Graph: Pipeline Deteksi Malware dengan GNN

Sebuah memory dump adalah snapshot RAM pada suatu waktu. Di dalamnya terdapat process, command line, DLL, socket, handle, dan region memori. GNN tidak membaca berkas dump mentah. Kita harus mengubah artefak tersebut menjadi graph: objek menjadi node, sedangkan relasi menjadi edge. Tujuan akhirnya bukan menggantikan analis, melainkan memberi skor prioritas pada process atau snapshot yang perlu diperiksa lebih dulu.
1. Akuisisi dan integritas#
Ambil RAM dengan tool yang sesuai lingkungan, misalnya WinPmem atau FTK Imager. Catat waktu, hostname, operator, tool dan versinya. Hitung hash segera setelah akuisisi dan kerjakan analisis pada salinan. Contoh:
sha256sum host-07-2026-08-11.raw
python3 vol.py -f host-07-2026-08-11.raw windows.info
Jika ukuran atau hash salinan berubah tanpa penjelasan, hentikan pipeline. Model yang akurat tidak berguna bila input tidak dapat dipertanggungjawabkan.
2. Ekstraksi artefak dengan Volatility#
Mulai dari beberapa pandangan yang saling melengkapi. pslist melihat process aktif melalui linked list; psscan memindai struktur process sehingga dapat menemukan process yang sudah berakhir atau disembunyikan; dlllist menampilkan modul; netscan melihat koneksi; dan malfind menyorot region yang patut diperiksa.
python3 vol.py -f memory.raw windows.pslist > pslist.txt
python3 vol.py -f memory.raw windows.psscan > psscan.txt
python3 vol.py -f memory.raw windows.dlllist > dlllist.txt
python3 vol.py -f memory.raw windows.netscan > netscan.txt
python3 vol.py -f memory.raw windows.malfind --dump
Dokumentasi resmi Volatility 3 Windows Tutorial juga menegaskan bahwa framework menganalisis tetapi tidak mengakuisisi RAM.
3. Membentuk node dan edge#
Skema minimum yang mudah dipahami:
| Tipe | Contoh | Feature |
|---|---|---|
| Process | powershell.exe:4120 | parent, thread count, signed path, entropy region |
| DLL | kernel32.dll | path, signer, load count |
| Socket | 203.0.113.24:443 | private/public, port class, state |
| Memory region | 0x1f400000 | protection, size, entropy, PE header |
Edge dapat berupa SPAWNED, LOADED, CONNECTED_TO, dan OWNS_REGION. Arah edge penting: winword.exe spawned powershell.exe berbeda dengan kebalikannya.
Contoh nyata yang disederhanakan#
Dokumen membuka WINWORD.EXE, kemudian muncul powershell.exe -enc ..., process itu memiliki region PAGE_EXECUTE_READWRITE dan berkomunikasi ke IP eksternal. Empat fakta ini lemah jika dibaca terpisah, tetapi subgraph gabungannya kuat:
WINWORD.EXE --SPAWNED--> powershell.exe
powershell.exe --OWNS_REGION--> RWX_region_0x1f400000
powershell.exe --CONNECTED_TO--> 203.0.113.24:443
Alamat 203.0.113.0/24 adalah blok dokumentasi; contoh ini konkret tetapi tidak menuduh infrastruktur sungguhan.
4. Feature engineering tanpa label leakage#
Encode kategori, normalisasi angka, dan pisahkan feature yang hanya diketahui setelah investigasi. Jangan memasukkan nama keluarga malware atau keputusan analis ke input. Split data berdasarkan host atau waktu, bukan sekadar node acak, agar process dari satu insiden tidak bocor ke train dan test.
5. Inferensi dan interpretasi#
data = Data(x=node_features, edge_index=edge_index, edge_attr=edge_types)
logits = model(data.x, data.edge_index)
probability = logits.softmax(dim=-1)[:, 1]
suspicious = probability >= 0.80
Output terbaik bukan hanya “malware 91%”, melainkan process, tetangga paling relevan, feature pemicu, model version, dan hash input. Threshold harus dipilih berdasarkan biaya false negative dan false positive.
Checklist keberhasilan#
- Hash dump dan salinan cocok.
- Node ID stabil dan edge punya arah serta tipe.
- Split mencegah leakage antar-host.
- Baseline sederhana dibandingkan dengan GNN.
- Prediksi dapat ditelusuri kembali ke artefak.
- Analis tetap mengambil keputusan akhir.
Latihan: buat graph kecil dari lima process, tiga DLL, dan dua socket. Tandai subgraph paling mencurigakan dan jelaskan alasan Anda sebelum melihat skor model.
Bagaimana memvalidasi graph sebelum training#
Lakukan pemeriksaan data contract. Setiap process harus memiliki PID, capture ID, dan timestamp yang valid. Edge SPAWNED harus menghubungkan dua process dalam capture yang sama. DLL tanpa process owner dan socket tanpa endpoint harus masuk antrean error, bukan diam-diam menjadi node kosong. Visualisasikan sampel benign dan suspicious secara manual; kesalahan parser jauh lebih sering daripada “model gagal belajar”.
assert graph.num_nodes > 0
assert graph.edge_index.max() < graph.num_nodes
assert not torch.isnan(graph.x).any()
assert set(graph.edge_type.tolist()) <= {0, 1, 2, 3}
Pertanyaan pemahaman#
- Mengapa nama process saja tidak cukup menjadi feature?
- Apa risiko bila node dari capture yang sama tersebar pada train dan test?
- Artefak apa yang akan Anda tampilkan agar analis dapat memverifikasi skor?
Jawaban ideal menyebut konteks relasional, label leakage, dan traceability. Jika model tidak bisa menghubungkan prediksi ke dump, PID, edge, serta model version, pipeline belum siap dipakai untuk keputusan operasional.
💬 Comments (0)
No comments yet. Be the first to share your thoughts!