Trail of Bits fickling: Bypass of check_safety() via likely_safe_imports trust
Summary
Fickling through version 0.1.12 treats any callable imported from a non-blocked standard library module as safe. Crafted pickle files that call such functions, for example dataclasses._create_fn, mailcap.findmatch or readline file writes, receive a LIKELY_SAFE verdict without findings. Because fickling.load() deserializes the file after this check, an attacker can run code or write files with the privileges of the process that loads the file.
Affected
- Trail of Bits fickling 0.1.12 and earlier (0 to <= 0.1.12)
- Unaffected: versions not listed as affected in the CVE record
Fixed in
Unknown.
- The vendor has added the three demonstrated modules to the UNSAFE_IMPORTS denylist on the master branch (commit d011709), pending release.
- No released version with a verified fix was found. Do not assume that version 0.1.11 or another release fixes this CVE.
Workaround
- No vendor-approved workaround is documented.
- Do not rely on fickling's verdict as proof that a pickle file is safe.
Exploitation
- No evidence of in-the-wild exploitation found.
- No public proof of concept known.
- Requires that a user or process loads the attacker's pickle file (UI:R).
Our recommendation
- Load pickle files only from trusted sources, or use a non-executable format such as safetensors where possible.
- If pickle loading is unavoidable, run it in an isolated, unprivileged environment.
- Check requirements files and CI/CD pipelines for fickling and keep it out of security-critical checks until a verified fixed release exists.
- Re-scan pickle files accepted since the scanner was deployed once a fixed release is available.
- Do not use fickling as the only control for untrusted models.
Public exploits
PoC-in-GitHub, Metasploit and Exploit-DB list nothing for this CVE.
Research sources
- Bombadil Systems security advisories bombadil.systems
- Trail of Bits fickling repository github.com
- fickling commit d011709 github.com
- fickling 0.1.12 on PyPI pypi.org
- Trail of Bits GitHub security advisory GHSA-mhc9-48gj-9gp3 github.com
- Strix CVE-2026-16760 www.strix.ai
- OffSeq Radar CVE-2026-16760 radar.offseq.com
Researched and written up in English and German by an AI (Claude by Anthropic) based on NVD, CISA, EPSS and the sources listed. The vendor information is authoritative. Researched on 31 Oct 2026, 08:38.
Original description (NVD)
In Trail of Bits fickling through 0.1.12, the _process_import() method in fickle.py adds an imported name to the likely_safe_imports set whenever the source module is present in sys.stdlib_module_names and the name is absent from the UNSAFE_IMPORTS denylist, without inspecting what the name resolves to or how it behaves. The OvertlyBadEvals analysis pass in analysis.py then unconditionally skips any call whose function name appears in likely_safe_imports, including calls that would otherwise be flagged as overtly dangerous. As a result, any callable reachable through a non-blocked standard library module inherits module-level trust regardless of its own behavior, and check_safety() returns LIKELY_SAFE with zero findings for pickle payloads that reach code execution or file write through such callables. Demonstrated primitives: dataclasses._create_fn, which passes an attacker-controlled function body to exec() and yields arbitrary code execution on Python 3.7 through 3.12 (the internal _create_fn function was removed in Python 3.13); mailcap.findmatch, which internally calls os.system() on a test command taken from an attacker-controlled caps dictionary, yielding arbitrary code execution on Python versions through 3.12 (the mailcap module was removed in Python 3.13); and readline.add_history() followed by readline.write_history_file(), which writes attacker-controlled content to an arbitrary filesystem path (POSIX platforms, where the readline module is available). fickling.load() chains check_safety() into pickle.loads() as an explicit security gate, so a LIKELY_SAFE verdict causes the payload to be deserialized and executed with the privileges of the victim process. The root cause is the inference of callable safety from module origin; it is independent of, and separately fixable from, the dotted __qualname__ resolution weakness tracked as CVE-2026-118938, which this advisory does not address. As of 2026-10-30 the three demonstrated modules were added to UNSAFE_IMPORTS on the vendor master branch (commit d011709) pending release; released versions through 0.1.12 remain affected, and the module-origin trust root cause persists, as demonstrated by the related CVE-2026-118938 remaining exploitable on that same build.
Sources
The tracker combines official, freely usable data sources – updated continuously:
- NVD (NIST) – CVEs, rating (CVSS), affected products
- CISA KEV – vulnerabilities confirmed by CISA as actively exploited
- CISA Vulnrichment – CISA assessment (SSVC) in the official CVE record
- FIRST EPSS – probability of exploitation
- Microsoft MSRC – Patch Tuesday: vulnerabilities, severity, updates
- PoC-in-GitHub – public proof-of-concept repositories
- Metasploit (Rapid7) – modules of the Metasploit Framework
- Exploit-DB (OffSec) – archive of public exploits (links only)
- Patch days: official vendor pages (linked per vendor) (Vendor patch days)
This product uses data from the NVD API but is not endorsed or certified by the NVD. EPSS data © FIRST.org.
Affected? We can help.
We check whether your systems are affected, install updates and close the gap – continuously with the System Health Checker if you wish.
