Fickling
CVE-2025-67747
HIGH
Severity by source
CVSS:4.0/AV:L/AC:L/AT:N/PR:N/UI:P/VC:H/VI:H/VA:H/SC:N/SI:N/SA:N/E:P/CR:X/IR:X/AR:X/MAV:X/MAC:X/MAT:X/MPR:X/MUI:X/MVC:X/MVI:X/MVA:X/MSC:X/MSI:X/MSA:X/S:X/AU:X/R:X/V:X/RE:X/U:X
File-based local vector (AV:L) needing the victim to scan then unpickle the crafted file (UI:R); no attacker privileges needed (PR:N); arbitrary code execution yields full C/I/A.
Primary rating from Vendor (github).
CVSS VectorVendor: github
Lifecycle Timeline
2DescriptionCVE.org
Fickling is a Python pickling decompiler and static analyzer. Versions prior to 0.1.6 are missing marshal and types from the block list of unsafe module imports. Fickling started blocking both modules to address this issue. This allows an attacker to craft a malicious pickle file that can bypass fickling since it misses detections for types.FunctionType and marshal.loads. A user who deserializes such a file, believing it to be safe, would inadvertently execute arbitrary code on their system. This impacts any user or system that uses Fickling to vet pickle files for security issues. The issue was fixed in version 0.1.6.
AnalysisAI
Deserialization of an attacker-supplied pickle file that has been vetted by Fickling versions prior to 0.1.6 can execute arbitrary code because the analyzer's unsafe-import block list omitted the 'marshal' and 'types' modules, allowing payloads built on marshal.loads and types.FunctionType to pass the scan as 'LIKELY_SAFE'. The flaw affects any user or pipeline that trusts Fickling as a safety gate for untrusted pickles and then unpickles the file; because Fickling is the inspection tool rather than the execution sink, code only runs when the file is subsequently loaded, and the CVSS 4.0 vector (AV:L/AC:L/PR:N/UI:P) and the independent assessment (AV:L/AC:L/PR:N/UI:R) both confirm that unauthenticated attackers need the victim to run the scan and then choose to deserialize the file. Publicly available exploit code exists - the upstream GHSA advisory itself includes a disassembled malicious pickle and a regression test - but there is no confirmed active exploitation (no CISA KEV listing), and the vendor-released patch fixes the issue in Fickling 0.1.6.
Technical ContextAI
Fickling, maintained by Trail of Bits, is a Python pickle decompiler and static analyzer that inspects pickle bytecode (opcodes such as STACK_GLOBAL, REDUCE, and BUILD) to flag dangerous constructs before a file is ever deserialized. Its safety checks work largely by maintaining a block list of unsafe module/attribute names that can be reached through STACK_GLOBAL; when a payload references any of those names, Fickling raises the reported severity above LIKELY_SAFE. Before 0.1.6 that list was missing 'marshal' and 'types', so two powerful primitives went undetected: marshal.loads, which turns attacker-supplied bytes into a live Python code object, and types.FunctionType, which wraps that code object into a callable function. The advisory PoC chains these with pickle REDUCE opcodes - marshal.loads(code_bytes) followed by types.FunctionType(code, globals), then a final REDUCE with an empty argument tuple - to build and invoke a function that runs os.system('id'). This is a classic CWE-184 incomplete-block-list defect: the detection logic is sound in principle but its deny-list is not exhaustive, so the analyzer emits a false-negative 'LIKELY_SAFE' verdict. Fickling itself is not the execution sink; the arbitrary code runs only in the victim's process at the later unpickling step, when the crafted file is actually loaded. The fix in commit 4e34561301bda1450268d1d7b0b2b151de33b913 adds 'marshal' and 'types' to the unsafe-import set in fickling/fickle.py.
RemediationAI
Vendor-released patch: upgrade to Fickling 0.1.6 (for example 'pip install --upgrade "fickling>=0.1.6"' or pin fickling==0.1.6), which adds 'marshal' and 'types' to the unsafe-import block list; the fix landed in PR https://github.com/trailofbits/fickling/pull/186 via commit https://github.com/trailofbits/fickling/commit/4e34561301bda1450268d1d7b0b2b151de33b913 and is described in advisory GHSA-565g-hwwr-4pp3. Because this is a detection bypass rather than a flaw in the deserialization sink, patching Fickling alone does not make unpickling untrusted data safe - treat any 'LIKELY_SAFE' verdict as a heuristic and never deserialize an untrusted pickle solely because Fickling cleared it. Where unpickling is unavoidable, load through a restricted Unpickler with an explicit find_class allow-list that excludes marshal, types, os, subprocess, and similar modules, accepting that legitimate pickles using those names will fail; alternatively, perform the unpickle inside a disposable sandbox or container with no network access, a read-only filesystem, and least-privilege credentials, which contains the damage but adds operational overhead and does not prevent the initial code execution. Adding your own pre-scan for STACK_GLOBAL references to marshal.loads and types.FunctionType can close the gap on unpatched versions, but maintaining a local deny-list carries the same risk of incomplete coverage that caused this CVE.
Wazuh SIEM platform versions 4.4.0 through 4.9.0 contain an unsafe deserialization vulnerability in the DistributedAPI t
BentoML version 1.4.2 and earlier contains an unauthenticated remote code execution vulnerability through insecure deser
pgAdmin 4 contains critical remote code execution vulnerabilities in the Query Tool download and Cloud Deployment endpoi
The renderLocalView function in render/views.py in graphite-web in Graphite 0.9.5 through 0.9.10 uses the pickle Python
BentoML is a Python library for building online serving systems optimized for AI apps and model inference. Rated critica
OpenSSL before 0.9.8za, 1.0.0 before 1.0.0m, and 1.0.1 before 1.0.1h does not properly restrict processing of ChangeCiph
pyLoad download manager version prior to 0.5.0b3.dev77 exposes the Flask SECRET_KEY through an unauthenticated endpoint.
Langflow (a visual LLM pipeline builder) contains a critical unauthenticated code execution vulnerability (CVE-2026-3301
In Mercurial before 4.1.3, "hg serve --stdio" allows remote authenticated users to launch the Python debugger, and conse
Unauthenticated remote code execution affects Kestra OSS (the open-source event-driven orchestration platform) prior to
Unauthenticated remote code execution in Marimo ≤0.20.4 allows attackers to execute arbitrary system commands via the `/
pyLoad is the free and open-source Download Manager written in pure Python. Rated medium severity (CVSS 5.3), this vulne
Same weakness CWE-184 – Incomplete List of Disallowed Inputs
View allShare
External POC / Exploit Code
Leaving vuln.today