CVE-2026-16760
Received Received - Intake

Insecure Module-Origin Trust in Fickling

Vulnerability report for CVE-2026-16760, including description, CVSS score, EPSS score, affected products, exploitability, helpful resources, and attack-flow context.

Publication date: 2026-10-30

Last updated on: 2026-10-30

Assigner: BombadilSystems

Description

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.

CVSS Scores

EPSS Scores

Probability:
Percentile:

Meta Information

Published
2026-10-30
Last Modified
2026-10-30
Generated
2026-10-31
AI Q&A
2026-10-31
EPSS Evaluated
N/A
NVD
EUVD

Affected Vendors & Products

Showing 1 associated CPE
Vendor Product Version / Range
trailofbits fickling 0

Helpful Resources

Exploitability

CWE
CWE Icon
KEV
KEV Icon
CWE ID Description
CWE-502 The product deserializes untrusted data without sufficiently ensuring that the resulting data will be valid.
CWE-693 The product does not use or incorrectly uses a protection mechanism that provides sufficient defense against directed attacks against the product.

Attack-Flow Graph

AI Quick Actions

Instant insights powered by AI
Executive Summary

This vulnerability exists in Trail of Bits fickling through version 0.1.12. It involves the _process_import() method in fickle.py adding imported names to a set called likely_safe_imports if the source module is in sys.stdlib_module_names and the name is not in the UNSAFE_IMPORTS list. The OvertlyBadEvals analysis then skips checking calls to functions in likely_safe_imports, even if they are dangerous. This allows unsafe callables from standard library modules to be trusted, bypassing safety checks and enabling code execution or file writes through pickle payloads.

Impact Analysis

This vulnerability can allow an attacker to execute arbitrary code or write files on your system with the privileges of the victim process. It specifically affects applications using fickling versions up to 0.1.12 for pickle deserialization. Attackers can craft malicious pickle payloads that bypass safety checks and achieve code execution or file system access.

Mitigation Strategies

Update fickling to the latest version where the affected modules are added to UNSAFE_IMPORTS. Avoid using fickling.load() on untrusted pickle data. Review and restrict imports from standard library modules to prevent unsafe callables from being used.

Chat Assistant

Ask questions about this CVE
Hi! I’m here to help you understand CVE-2026-16760. Ask me anything about the vulnerability, its impact, or mitigation strategies.
0/70

EPSS Chart