Fickling MLAllowlist analysis pass rendered inoperative by shared mutable state in AnalysisContext.shorten_code()
Key facts
- Attack vector
- Network
- Privileges required
- None
- User interaction
- None
- Attack complexity
- Low
- Impact type
- Security bypass
- Confidentiality · integrity · availability
- High · High · High
- Fix status
- Partial Red Hat: 1 without a fix
Attack profile from CVSS 3.1 · NVD. Fix status from CNA and Red Hat. Impact type from CWE-693.
Summary
In Trail of Bits fickling versions up to and including 0.1.11, the UnsafeImportsML analysis pass unconditionally calls AnalysisContext.shorten_code(node) on every import node it inspects, regardless of whether the import is flagged as unsafe. This call registers the shortened code representation in the shared AnalysisContext.reported_shortened_code set. When the MLAllowlist analysis pass subsequently runs, it calls the same shorten_code() method, receives already_reported=True for every import, and executes a continue statement that skips its allowlist check entirely. This renders MLAllowlist dead code for all imports — it never evaluates whether an import is in the ML allowlist or not. The MLAllowlist pass was designed to catch imports of modules outside the known-safe ML ecosystem (torch, numpy, transformers, etc.) that slip past the UnsafeImports denylist. With MLAllowlist inoperative, any standard library module not in the UNSAFE_IMPORTS denylist can be invoked via pickle deserialization while fickling's check_safety() returns LIKELY_SAFE. The fickling.load() API chains check_safety() into pickle.loads() as an explicit security gate, meaning a LIKELY_SAFE verdict causes the payload to be deserialized and executed. The root cause is shared mutable state between independently-correct analysis passes — UnsafeImportsML works as designed in isolation, MLAllowlist works as designed in isolation, but the shared reported_shortened_code set causes UnsafeImportsML to poison MLAllowlist's deduplication logic.
Why it matters now
SSVC decision points
CISA ADP · SSVC 2.0.3
- Exploitation
- Poc
- Automatable
- No
- Technical impact
- Total
The decision (Track, Attend, Act) also depends on your mission and well-being impact; see CISA's SSVC guide.
Affected products
| Vendor | Product | Affected versions | Fixed in | Status | Source |
|---|---|---|---|---|---|
| trailofbits | fickling | up to 0.1.11 | 0.1.12 | Patch available | CNA |
- fickling Vendortrailofbits Affected up to 0.1.11 Fixed in 0.1.12 Patch available CNA
CPE configurations NVD · 1
| CPE | Versions | Role | Vendor |
|---|---|---|---|
| cpe:2.3:a:trailofbits:fickling:*:*:*:*:*:python:*:* | up to 0.1.11 | Vulnerable | trailofbits |
- cpe:2.3:a:trailofbits:fickling:*:*:*:*:*:python:*:* Versions up to 0.1.11 Vulnerable ·trailofbits
Remediation
- Fix · CNA fickling (trailofbits) Fixed in 0.1.12
Vendor assessments
Red Hat
Red Hat rating: Important. Red Hat's page for this CVE →
| Product | Status | Plan or fix |
|---|---|---|
| Exploit Intelligence | Affected | No fix yet |
Timeline
- 2026-10-02 Threatist record created from CVE-2026-14535
- 2026-10-03 Alias added: GHSA-mgx3-9w7v-8674
References
More trailofbits Fickling vulnerabilities
- TI-2026-18173 Fickling vulnerable to detection bypass due to "builtins" blindness CVSS 4.0HIGH 8.9
- TI-2026-18170 Fickling has Static Analysis Bypass via Incomplete Dangerous Module Blocklist CVSS 4.0HIGH 8.9
- TI-2026-18169 Fickling vulnerable to use of ctypes and pydoc gadget chain to bypass detection CVSS 4.0HIGH 8.9
- TI-2026-18168 Fickling Blocklist Bypass: cProfile.run() CVSS 4.0HIGH 8.9
- TI-2026-18167 Fickling has a bypass via runpy.run_path() and runpy.run_module() CVSS 4.0HIGH 8.9
- TI-2026-12264 Fickling check_safety() bypass via unlisted standard library modules (_posixsubprocess, site, atexit) CVSS 3.1HIGH 8.8
Sources
- CVE-2026-14535 · CVE Program
- CVE-2026-14535 · NVD
- FIRST EPSS
- GHSA-mgx3-9w7v-8674 · GitHub Advisory Database · CC BY 4.0
- CVE-2026-14535 · Red Hat security data · CC BY 4.0
This product uses the NVD API but is not endorsed or certified by the NVD. Sources and licences