Safeguard
Vulnerability Analysis•

CVE-2026-14535: fickling MLAllowlist Silently Disabled

fickling up to 0.1.11 can skip its MLAllowlist check when another analysis pass runs first, so pickle imports go unflagged (CVSS 8.8). Upgrade to 0.1.12.

Safeguard Security Team
4 min read

CVE-2026-14535 is a protection mechanism failure in Trail of Bits fickling, a tool that checks Python pickle files for unsafe content. In versions up to and including 0.1.11, the MLAllowlist pass can be silently skipped, so imports that should be flagged are not. The record scores it 8.8. Upgrade to 0.1.12.

What's affected

  • Package: fickling on PyPI, from Trail of Bits.
  • Affected: versions up to and including 0.1.11.
  • Fixed: 0.1.12 and later.
  • Condition, per the advisory: you run the MLAllowlist analysis pass after another pass in the same analysis context. In that case it fails to flag imports that are not on the allowlist.
  • Severity: 8.8 in the record, which lists CWE-693 (protection mechanism failure). GitHub rates the advisory moderate. It is not on the CISA Known Exploited Vulnerabilities list.

The advisory explains that one pass, UnsafeImportsML, marks every import it looks at as already reported, even ones it does not flag. MLAllowlist then sees that mark and skips its own check. The fix makes MLAllowlist work again, and opt in as originally intended.

How to check if you're exposed

Check the installed version in each environment that scans pickles:

pip show fickling
pip list --format=freeze | grep -i fickling

Anything at 0.1.11 or lower is affected. Check requirements files, lockfiles and CI images too, since scanning often runs in a pipeline step rather than on a laptop.

Then look at how your code calls fickling. Search for the analysis entry points and see whether you rely on the allowlist:

grep -rn "MLAllowlist\|check_safety" --include=*.py .

If you never use MLAllowlist, the described bypass does not affect you, though you should still upgrade. If you do, find out where its result gates a decision, such as deciding whether a model file may be loaded.

What to do now

  1. Upgrade fickling to 0.1.12 or later wherever it is installed, and pin the version in your lockfile.
  2. If you use the allowlist, follow the advisory's guidance: pass MLAllowlist in the analyzer parameter explicitly when calling check_safety, as the fixed version expects.
  3. Re-scan any pickle or model files that were approved while you ran 0.1.11 or earlier and relied on the allowlist.
  4. Prefer formats that cannot run code on load, such as safetensors, for model weights where your tooling allows it.
  5. Do not treat a safe verdict from any pickle scanner as permission to load files from untrusted sources.

Why it matters

This is a bug in a safety tool, which makes it worth a slow read. A scanner that says a file is safe becomes part of your decision to load it. The record maps the flaw to CWE-693, protection mechanism failure: the check exists, it runs, and it does not do its job.

The advisory describes a shared state problem. Several analysis passes use one context object, and one pass recorded imports as already reported even when it did not flag them. A later pass treated that record as proof the import had been handled and skipped it. Nothing crashed, nothing logged an error, and the result looked like a clean scan. The advisory says the effect is that imports outside the allowlist go unflagged.

The maintainers describe the cause in the advisory without drama, and the repair is small, but the practical lesson is large. Pickle is a format that can run code when loaded. Scanning is a helpful layer for files you have to accept, and it cannot be the only one. Combine it with a source you trust, signatures or hashes for model files, a format that does not execute code, and isolation for anything you must load from outside.

For your own code, shared mutable state between independent checks is a pattern worth looking for in review. A static analysis scan can flag some of it, and tests that run checks in different orders catch more.

Try it yourself

The root cause is shared state in analysis code, the kind of pattern a code scan can flag. This demo shows a static analysis scan.

Click through it at your own pace, or open it full screen.

Quick check

Is the allowlist enabled by default after the fix?

The advisory says the fix makes MLAllowlist functional again and opt in as originally intended, so you pass it explicitly to the analyzer.

Does this mean pickle scanning is useless?

No. It is one layer. The advisory is about a specific check being skipped, and the fix restores it.

Sources

Last reviewed: 19 October 2026.

Never miss an update

Weekly insights on software supply chain security, delivered to your inbox.

Self-healing security runs on Safeguard.

Your first fix PR is minutes away.

No sales call required, even your agent can complete the purchase over MCP.