EMBER2024 Malware Detection Models
4์ข ๋ชจ๋ธ ์ํคํ ์ฒ(DNN, TabNet, Hybrid GBDT2NN, LightGBM)๋ฅผ EMBER2024 ๋ฐ์ดํฐ์ ์ 8๊ฐ ํ์ผ ํ์ subset ์ ์ฒด์ ๋ํด ํ์ตยทํ๊ฐํ๊ณ ๋ฐฐํฌ ๊ฐ๋ฅํ ํฌ๋งท์ผ๋ก ๋ณํํ ๋ชจ๋ธ ์ปฌ๋ ์ ์ ๋๋ค.
ํ์ต ํ๊ฒฝ: NVIDIA DGX Spark (GB10 Grace Blackwell, 128 GB ํตํฉ ๋ฉ๋ชจ๋ฆฌ, CUDA 13)
์ฝ๋: github.com/evan0416/ember-ml
๋ฐ์ดํฐ์ ๋ ผ๋ฌธ: Joyce et al., KDD 2025 (arXiv:2506.05074)
๋ชจ๋ธ ๊ตฌ์ฑ
| ๋๋ ํ ๋ฆฌ | ์ํคํ ์ฒ | ๋ฐฐํฌ ํฌ๋งท | ํ๋ผ๋ฏธํฐ |
|---|---|---|---|
dnn/ |
Feed-Forward DNN (PReLU + Dropout) | ONNX (INT8 Static / FP32) | 13.2 M (PE) / 0.73 M (non-PE) |
tabnet/ |
TabNet (Arik & Pfister, 2021) | ONNX FP32 | ~3 M |
hybrid/ |
GBDT2NN (DeepGBM, KDD 2019) | ONNX (nn_part) + LightGBM booster | ~1 M NN |
lightgbm/ |
LightGBM (์ฌ์ ํ์ต, joyce8/EMBER2024-benchmark-models) | Treelite .tl |
โ |
Subset ๋ชฉ๋ก
| Subset | ๋์ ํ์ผ ํ์ | ์ ๋ ฅ ์ฐจ์ |
|---|---|---|
PE |
PE ๋ฐ์ด๋๋ฆฌ ์ ์ฒด (Win32 + Win64 + .NET) | 2,568 |
Win32 |
Windows 32-bit PE | 2,568 |
Win64 |
Windows 64-bit PE | 2,568 |
.NET |
.NET ์ด์ ๋ธ๋ฆฌ | 2,568 |
APK |
Android APK | 696 |
ELF |
Linux ELF | 696 |
PDF |
PDF ๋ฌธ์ | 696 |
all |
์ ์ฒด ํ์ผ ํ์ ํผํฉ | 2,568 |
๋๋ ํ ๋ฆฌ ๊ตฌ์กฐ
ํ์ผ๋ช
๊ท์น: {๋ชจ๋ธ}_{subset}[_suffix].{ext}.NET subset์ ํ์ผ๋ช
์์ dotnet์ผ๋ก ๋ณํ๋ฉ๋๋ค.
dnn/
โโโ dnn_PE.onnx # INT8 Static (๋ฐฐํฌ์ฉ, PE/Win32/Win64/dotnet/all)
โโโ dnn_PE_fp32.onnx # FP32 ONNX (์ฐธ์กฐ์ฉ, INT8 ๊ณ์ด๋ง ์ถ๊ฐ ํฌํจ)
โโโ dnn_PE.pt # PyTorch ์ฒดํฌํฌ์ธํธ
โโโ dnn_PE_metrics.json # ํ๊ฐ ๊ฒฐ๊ณผ (AUC, TPR@1%FPR)
โโโ dnn_PE_benchmark.json # ํฌ๊ธฐยท๋ ์ดํด์
โโโ dnn_APK.onnx # FP32 (non-PE โ INT8 AUC ์์ค ๊ณผ๋ค)
โโโ dnn_APK.pt
โโโ ...
tabnet/
โโโ tabnet_PE.onnx # FP32 ONNX (134 MB โ sparsemax ์ธํด๋ฉ)
โโโ tabnet_PE.zip # pytorch-tabnet ๋ค์ดํฐ๋ธ (7 MB, ๊ฒฝ๋)
โโโ ...
hybrid/
โโโ hybrid_PE_nnpart.onnx # GBDT2NN nn_part ONNX (5.1 MB)
โโโ hybrid_PE_lgbm.model # LightGBM booster (3.6 MB)
โโโ hybrid_PE.pt # PyTorch ์ฒดํฌํฌ์ธํธ
โโโ ...
lightgbm/
โโโ lightgbm_PE.tl # Treelite ์ง๋ ฌํ (ํ๋ซํผ ๋
๋ฆฝ, ์ฌ์ปดํ์ผ ํ์)
โโโ ...
์ฑ๋ฅ ๊ฒฐ๊ณผ (EMBER2024 test set)
ํ๊ฐ ๊ธฐ์ค: ROC-AUC, TPR @ 1% FPR (๋ ผ๋ฌธ ยง4.1), challenge set detection rate @ FPR=1% ์๊ณ๊ฐ
Challenge set: 6,315 evasive malware (์์ฑ only, Win32 3,225 / .NET 829 / Win64 814 / PDF 805 / ELF 386 / APK 256)
DNN
| Subset | ROC-AUC | TPR@1%FPR | ๋ฐฐํฌ ํฌ๋งท | ํฌ๊ธฐ |
|---|---|---|---|---|
| PE | 0.9969 | 0.9539 | INT8 Static ONNX | 13.3 MB |
| Win32 | 0.9966 | 0.9468 | INT8 Static ONNX | 13.3 MB |
| Win64 | 0.9969 | 0.9656 | INT8 Static ONNX | 13.3 MB |
| .NET | 0.9939 | 0.8976 | INT8 Static ONNX | 13.3 MB |
| all | 0.9942 | 0.9103 | INT8 Static ONNX | 13.3 MB |
| APK | 0.9761 | 0.7682 | FP32 ONNX | 3.9 MB |
| ELF | 0.9840 | 0.8103 | FP32 ONNX | 3.9 MB |
| 0.9795 | 0.8902 | FP32 ONNX | 3.9 MB |
non-PE(APK/ELF/PDF)๋ ์ ๋ ฅ 696-dim, ํ๋ผ๋ฏธํฐ ์ ๋ถ์กฑ์ผ๋ก INT8 AUC ์์ค์ด ํฌ๋ฏ๋ก FP32 ์ ์ง.
TabNet
| Subset | ROC-AUC | TPR@1%FPR | ๋ฐฐํฌ ํฌ๋งท | ํฌ๊ธฐ |
|---|---|---|---|---|
| PE | 0.9951 | 0.9212 | FP32 ONNX | 134 MB |
| Win32 | 0.9949 | 0.9322 | FP32 ONNX | 134 MB |
| Win64 | 0.9946 | 0.9323 | FP32 ONNX | 134 MB |
| .NET | 0.9925 | 0.8702 | FP32 ONNX | 134 MB |
| all | 0.9922 | 0.8912 | FP32 ONNX | 134 MB |
| APK | 0.9741 | 0.7028 | FP32 ONNX | 13.5 MB |
| ELF | 0.9793 | 0.5460 | FP32 ONNX | 13.5 MB |
| 0.9810 | 0.8597 | FP32 ONNX | 13.5 MB |
PE ๊ณ์ด ONNX ํฌ๊ธฐ 134 MB: sparsemax attention loop์ด ONNX ๊ทธ๋ํ๋ก ์ธํด๋ฉ๋๋ ๊ตฌ์กฐ์ ํน์ฑ. ํฌ๊ธฐ ์ฐ์ ์ด๋ฉด
tabnet_model.zip(7 MB) ์ง์ ์ฌ์ฉ ๊ถ์ฅ.
Hybrid (GBDT2NN)
| Subset | ROC-AUC | TPR@1%FPR | ๋ฐฐํฌ ํฌ๋งท | ํฌ๊ธฐ |
|---|---|---|---|---|
| PE | 0.9982 | 0.9752 | nn_part ONNX + LightGBM booster | 5.1 + 3.6 MB |
| Win32 | 0.9981 | 0.9747 | nn_part ONNX + LightGBM booster | 5.1 + 3.6 MB |
| Win64 | 0.9983 | 0.9812 | nn_part ONNX + LightGBM booster | 5.1 + 3.6 MB |
| .NET | 0.9961 | 0.9466 | nn_part ONNX + LightGBM booster | 5.1 + 3.5 MB |
| all | 0.9970 | 0.9528 | nn_part ONNX + LightGBM booster | 5.1 + 3.6 MB |
| APK | 0.9821 | 0.8003 | nn_part ONNX + LightGBM booster | 5.1 + 3.5 MB |
| ELF | 0.9899 | 0.8827 | nn_part ONNX + LightGBM booster | 5.1 + 3.6 MB |
| 0.9879 | 0.9283 | nn_part ONNX + LightGBM booster | 5.1 + 3.6 MB |
LightGBM (Treelite ์ปดํ์ผ)
| Subset | ROC-AUC | TPR@1%FPR | ํฌ๊ธฐ (.tl) | ํฌ๊ธฐ (์๋ณธ .model) |
|---|---|---|---|---|
| PE | 0.9983 | 0.9707 | 5.3 MB | 3.6 MB |
| Win32 | 0.9984 | 0.9736 | 5.3 MB | 3.6 MB |
| Win64 | 0.9989 | 0.9831 | 5.3 MB | 3.6 MB |
| .NET | 0.9980 | 0.9566 | 5.3 MB | 3.5 MB |
| all | 0.9968 | 0.9440 | 5.3 MB | 3.6 MB |
| APK | 0.9861 | 0.8157 | 5.3 MB | 3.5 MB |
| ELF | 0.9929 | 0.9140 | 5.3 MB | 3.6 MB |
| 0.9913 | 0.9275 | 5.3 MB | 3.6 MB |
์๋ณธ LightGBM ๋ชจ๋ธ: joyce8/EMBER2024-benchmark-models.
.tl์ Treelite 3.9.1๋ก ์ง๋ ฌํ๋ ํ๋ซํผ ๋ ๋ฆฝ ํ์ผ โ ๊ฐ ํ๋ซํผ์์ ์ฌ์ปดํ์ผ ํ์.
Challenge Set Detection Rate
Challenge set: 6,315 evasive malware (์ ๋ถ ์์ฑ). test set FPR=1% ์๊ณ๊ฐ ์ ์ฉ.
| Subset | DNN | TabNet | Hybrid | LightGBM |
|---|---|---|---|---|
.NET |
58.6% | 70.0% | 80.6% | 79.6% |
APK |
27.3% | 29.3% | 34.4% | 33.6% |
ELF |
11.7% | 4.4% | 23.8% | 30.3% |
PDF |
41.5% | 40.1% | 56.9% | 57.1% |
PE |
38.5% | 36.9% | 58.2% | 58.8% |
Win32 |
36.6% | 45.3% | 58.4% | 69.9% |
Win64 |
46.3% | 44.1% | 59.5% | 59.7% |
all |
35.3% | 42.3% | 54.1% | 48.4% |
์ถ๋ก ์ฑ๋ฅ (Apple M1, darwin-arm64)
warm_batch1๋ ์ดํด์: ๋ฐฐ์น ํฌ๊ธฐ=1, ์บ์ ์์ ํ ์ธก์ . ๋ฐฐํฌ ํ๊ฒฝ(x86_64 Linux)๊ณผ ๋ค๋ฅผ ์ ์์.
๋ ์ดํด์ (ms, warm batch=1)
| Subset | DNN | TabNet | Hybrid | LightGBM |
|---|---|---|---|---|
.NET |
0.248 | 5.465 | 0.151 | 0.050 |
APK |
0.035 | 0.846 | 0.145 | 0.031 |
ELF |
0.039 | 0.505 | 0.160 | 0.036 |
PDF |
0.036 | 2.230 | 0.172 | 0.048 |
PE |
0.290 | 4.402 | 0.138 | 0.028 |
Win32 |
0.288 | 4.693 | 0.141 | 0.044 |
Win64 |
0.220 | 5.621 | 0.422 | 0.039 |
all |
0.254 | 4.788 | 0.147 | 0.068 |
TabNet ๋ ์ดํด์ ๋์: sparsemax attention์ด ONNX ๊ทธ๋ํ๋ก ์ธํด๋ฉ๋๋ ๊ตฌ์กฐ์ ํน์ฑ.
Hybrid = nn_part ONNX ์ถ๋ก ๋ง ์ธก์ (LightGBM leaf extraction ์ ์ธ).
LightGBM ๋ ์ดํด์ = ์ปดํ์ผ.dylib๊ธฐ์ค; ์ ๋ก๋ ํ์ผ์.tl(์ฌ์ปดํ์ผ ํ์).
๋ชจ๋ธ ํ์ผ ํฌ๊ธฐ (๋ฐฐํฌ ํฌ๋งท)
| Subset | DNN | TabNet .onnx |
TabNet .zip |
Hybrid (nn+lgbm) | LightGBM .tl |
|---|---|---|---|---|---|
| PE ๊ณ์ด | 13.3 MB (INT8) | 140.2 MB | 7.4 MB | 5.3 + 3.8 MB | 5.3 MB |
| non-PE | 3.9 MB (FP32) | 13.5 MB | 3.2 MB | 5.3 + 3.7 MB | 5.3 MB |
์ฌ์ฉ ๋ฐฉ๋ฒ
์์กด์ฑ ์ค์น
pip install onnxruntime>=1.20 numpy
# LightGBM / Hybrid ์ถ๋ก ์
pip install "treelite==3.9.1" "treelite_runtime==3.9.1" lightgbm>=4.6
# TabNet ์ฒดํฌํฌ์ธํธ ์ง์ ์ฌ์ฉ ์
pip install pytorch-tabnet>=4.1
DNN ์ถ๋ก (ONNX Runtime)
import numpy as np
import onnxruntime as ort
from huggingface_hub import hf_hub_download
# PE subset โ INT8 Static
model_path = hf_hub_download(
repo_id="cycloevan/ember-model",
filename="dnn/dnn_PE.onnx",
)
sess = ort.InferenceSession(model_path, providers=["CPUExecutionProvider"])
# X: np.ndarray shape (N, 2568), dtype float32
X = np.random.randn(1, 2568).astype(np.float32)
logit = sess.run(["logit"], {"features": X})[0] # shape (N, 1)
prob = 1 / (1 + np.exp(-logit.ravel())) # sigmoid โ [0, 1]
print(f"malware probability: {prob[0]:.4f}")
# APK subset โ FP32
model_path = hf_hub_download(
repo_id="cycloevan/ember-model",
filename="dnn/dnn_APK.onnx",
)
sess = ort.InferenceSession(model_path, providers=["CPUExecutionProvider"])
X = np.random.randn(1, 696).astype(np.float32) # non-PE: dim=696
prob = 1 / (1 + np.exp(-sess.run(["logit"], {"features": X})[0].ravel()))
TabNet ์ถ๋ก (ONNX Runtime)
import numpy as np
import onnxruntime as ort
from huggingface_hub import hf_hub_download
model_path = hf_hub_download(
repo_id="cycloevan/ember-model",
filename="tabnet/tabnet_PE.onnx",
)
sess = ort.InferenceSession(model_path, providers=["CPUExecutionProvider"])
X = np.random.randn(1, 2568).astype(np.float32)
# ์ถ๋ ฅ: logit (sigmoid ์ )
logit = sess.run(["logit"], {"features": X})[0]
prob = 1 / (1 + np.exp(-logit.ravel()))
Hybrid ์ถ๋ก (ONNX + LightGBM)
import numpy as np
import lightgbm as lgb
import onnxruntime as ort
from huggingface_hub import hf_hub_download
# 1. LightGBM booster๋ก leaf indices ์ถ์ถ
booster = lgb.Booster(model_file=hf_hub_download(
repo_id="cycloevan/ember-model",
filename="hybrid/hybrid_PE_lgbm.model",
))
X_raw = np.random.randn(1, 2568).astype(np.float64)
leaf_indices = booster.predict(X_raw, pred_leaf=True).astype(np.int64) # (N, n_trees)
# 2. GBDT2NN ONNX๋ก ์ต์ข
๋ถ๋ฅ
nn_sess = ort.InferenceSession(hf_hub_download(
repo_id="cycloevan/ember-model",
filename="hybrid/hybrid_PE_nnpart.onnx",
), providers=["CPUExecutionProvider"])
logit = nn_sess.run(["logit"], {"leaf_indices": leaf_indices})[0]
prob = 1 / (1 + np.exp(-logit.ravel()))
print(f"malware probability: {prob[0]:.4f}")
LightGBM ์ถ๋ก (Treelite ์ปดํ์ผ โ ๋น ๋ฅธ ์ถ๋ก )
# 1. Treelite .tl โ ํ๋ซํผ๋ณ ๊ณต์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ปดํ์ผ (์ต์ด 1ํ)
import treelite, treelite_runtime, sys, numpy as np
from huggingface_hub import hf_hub_download
tl_path = hf_hub_download(
repo_id="cycloevan/ember-model",
filename="lightgbm/lightgbm_PE.tl",
)
tl_model = treelite.Model.deserialize(tl_path)
lib_ext = ".dylib" if sys.platform == "darwin" else ".so"
lib_path = tl_path.replace(".tl", lib_ext)
tl_model.export_lib(
toolchain="clang" if sys.platform == "darwin" else "gcc",
libpath=lib_path,
verbose=False,
)
# 2. ์ถ๋ก
predictor = treelite_runtime.Predictor(lib_path, verbose=False)
X = np.random.randn(1, 2568).astype(np.float32)
prob = predictor.predict(treelite_runtime.DMatrix(X))
print(f"malware probability: {prob[0]:.4f}")
์ฃผ์:
treelite==3.9.1+treelite_runtime==3.9.1ํ์. 4.x๋export_lib()๋ฏธ์ง์.
ํ์ต ๋ฐ ํ๊ฐ ํ๊ฒฝ
| ํญ๋ชฉ | ๋ด์ฉ |
|---|---|
| ๋ฐ์ดํฐ์ | EMBER2024 โ train 52์ฃผ(2.6 M), test 12์ฃผ(606 K), challenge 6,315 |
| Feature ์ฐจ์ | PE 2,568 (v3) / non-PE 696 (์ ํจ prefix) |
| Split ์ ์ฑ | ์๊ฐ์ ์์ ๊ณ ์ (temporal split), ์์ ์ ํ ์์ |
| ํ์ต ํ๊ฒฝ | DGX Spark (GB10 Grace Blackwell, 128 GB, CUDA 13) |
| ํ๋ ์์ํฌ | PyTorch 2.11.0, pytorch-tabnet 4.1, LightGBM 4.6 |
| ์ฌํ ์๋ | 42 |
| DNN ์ํคํ ์ฒ | Linear(2568โ2568โ1024โ512โ1) + PReLU + Dropout(0.5) |
| Hybrid | LightGBM leaf extraction โ Linear(n_treesโ512โ256โ1) + PReLU |
| ํ๊ฐ ์งํ | ROC-AUC, PR-AUC, TPR @ 1% FPR (๋ ผ๋ฌธ ยง4.1) |
์๋ ค์ง ํ๊ณ
- TabNet ONNX ํฌ๊ธฐ: sparsemax attention loop ์ธํด๋ฉ์ผ๋ก PE ๊ณ์ด ONNX๊ฐ 134 MB๋ก ํฝ์ฐฝ. ์๋ณธ
tabnet_model.zip(7 MB)์ด ๊ฒฝ๋. - Treelite
.dylib: Mac ARM64 ์ ์ฉ ์ฌ์ ์ปดํ์ผ ํ์ผ. ๋ค๋ฅธ ํ๋ซํผ์.tl์์ ์ฌ์ปดํ์ผ ํ์. - DNN non-PE INT8: 696-dim ๋ชจ๋ธ์ ์์ํ AUC ์์ค์ด ํฌ๋ฏ๋ก FP32 ์ ์ง.
- Hybrid ์ถ๋ก : ๋จ์ผ ONNX ํ์ผ์ด ์๋ โ LightGBM leaf extraction + nn_part ONNX 2๋จ๊ณ.
- challenge detection rate: test set์์ FPR=1% ์๊ณ๊ฐ์ผ๋ก ์ธก์ . subset๋ณ ๋ถํฌ ์ฐจ์ด๋ก ๊ฐ์ด ์์ดํ ์ ์์.
์ธ์ฉ
@inproceedings{joyce2025ember2024,
title = {EMBER2024: An Open Dataset for Training Behavioral Malware Detection Models},
author = {Joyce, Ruby and Rudd, Ethan M. and others},
booktitle = {Proceedings of the 31st ACM SIGKDD Conference on Knowledge Discovery and Data Mining},
year = {2025},
url = {https://arxiv.org/abs/2506.05074}
}
๋ผ์ด์ ์ค
์ฝ๋ ๋ฐ ๋ชจ๋ธ ๊ฐ์ค์น: Apache 2.0
LightGBM ์๋ณธ ๋ชจ๋ธ(hybrid/hybrid_*_lgbm.model): joyce8/EMBER2024-benchmark-models ๋ผ์ด์ ์ค ์ค์