Lack of data validation In picklescan

Description

PickleScan has multiple stdlib modules with direct RCE not in blocklist

Summary

picklescan v1.0.3 (latest) does not block at least 7 Python standard library modules that provide direct arbitrary command execution or code evaluation. A malicious pickle file importing these modules is reported as having 0 issues (CLEAN scan). This enables remote code execution that bypasses picklescan entirely.

Severity

Critical (CVSS 9.8) — Direct RCE with zero scanner detection. Affects all deployments relying on picklescan, including HuggingFace Hub.

Affected Versions

    picklescan <= 1.0.3 (all versions including latest)

Details

Unblocked RCE Modules

Module
Function
RCE Mechanism
picklescan Result

All 8 functions are in Python's standard library and importable on all platforms.

Scanner Output

$ picklescan -p uuid_rce.pkl
No issues found.

$ picklescan -p aix_rce.pkl
No issues found.

$ picklescan -p imaplib_rce.pkl
No issues found....

Meanwhile:

$ python3 -c "import pickle; pickle.loads(open('uuid_rce.pkl','rb').read())"
uid=501(user) gid=20(staff) groups=20(staff),501(access),12(everyone)

Blocklist Analysis

picklescan v1.0.3's _unsafe_globals dict (scanner.py line 120-219) contains ~60 entries. None of the following modules appear:

    uuid — not blocked

    _osx_support — not blocked

    _aix_support — not blocked

    _pyrepl — not blocked

    _pyrepl.pager — not blocked (parent wildcard doesn't apply since _pyrepl isn't blocked)

    imaplib — not blocked

    test — not blocked

    test.support — not blocked

    test.support.script_helper — not blocked

Proof of Concept

import struct, io, pickle

def sbu(s):
    b = s.encode()
    return b"\x8c" + struct.pack("<B", len(b)) + b

# uuid._get_command_stdout — arbitrary command execution
payload = (...

Tested Against

    picklescan v1.0.3 (commit b999763, Feb 15 2026) — latest release

    picklescan v0.0.21 — same result (modules never blocked in any version)

Impact

Any system using picklescan for pickle safety validation is vulnerable. This includes:

    HuggingFace Hub — uses picklescan server-side to scan uploaded model files

    ML pipelines — any CI/CD or loading pipeline using picklescan

    Model registries — any registry relying on picklescan for safety checks

An attacker can upload a malicious model file to HuggingFace Hub that passes all picklescan checks and executes arbitrary code when loaded by a user.

Suggested Fix

Add to _unsafe_globals in picklescan:

"uuid": "*",
"_osx_support": "*",
"_aix_support": "*",
"_pyrepl": "*",
"imaplib": {"IMAP4_stream"},
"test": "*",

Architectural recommendation: The blocklist approach is fundamentally flawed — new RCE-capable stdlib functions can be discovered faster than they are blocked. Consider:

    Switching to an allowlist (default-deny) for permitted globals

    Treating ALL unknown globals as dangerous by default (currently marked "Suspicious" but not counted as issues)

Resources

    picklescan source: scanner.py lines 120-219 (_unsafe_globals)

    Python source: Lib/uuid.py, Lib/_osx_support.py, Lib/_aix_support.py, Lib/_pyrepl/pager.py, Lib/imaplib.py

Mitigation

Update Impact

Minimal update. May introduce new vulnerabilities or breaking changes.

Ecosystem
Package
Affected version
Patched versions