.joblib model files.joblib.load() transparently supports compressed persistence files such as zlib, gzip, bz2, lzma, and xz. A malicious payload embedded in a compressed .joblib file still reaches Python deserialization and can execute arbitrary code during model load.protectai/modelscan scanner, however, scans .joblib files as raw pickle bytes and does not decompress supported joblib compression layers first. This means:.joblib file is detectedartifacts/zlib.joblibartifacts/plain.joblibJOBLIB_PWNED) to demonstrate code execution without doing anything destructive.artifacts/plain.joblibartifacts/zlib.joblibartifacts/plain.joblib.modelscan.jsonartifacts/zlib.joblib.modelscan.jsonartifacts/reproduce_output.txtartifacts/sha256sums.txtjoblib: 1.5.2modelscan: protectai/modelscan @ 61fcec9c2a37c24c1fb12d84ede30fe248a364bdjoblib.load()1import joblib
2joblib.load("zlib.joblib")JOBLIB_PWNED1PYTHONPATH=/path/to/modelscan python - <<'PY'
2from modelscan.modelscan import ModelScan
3import json
4print(json.dumps(ModelScan().scan("plain.joblib"), indent=2))
5PYplain.joblib is flagged with a CRITICAL issue for posix.system1PYTHONPATH=/path/to/modelscan python - <<'PY'
2from modelscan.modelscan import ModelScan
3import json
4print(json.dumps(ModelScan().scan("zlib.joblib"), indent=2))
5PYzlib.joblib reports 0 issuesartifacts/reproduce_output.txt:joblib.load("plain.joblib") executes the payloadjoblib.load("zlib.joblib") executes the payloadmodelscan flags plain.joblib as maliciousmodelscan misses zlib.joblibjoblibzlib.joblib is the main PoC artifact for submissionplain.joblib is included to show that the bypass comes from compression handling, not from a different payload