VYPR
High severityOSV Advisory· Published Jan 10, 2026· Updated Jan 13, 2026

Fickling has a bypass via runpy.run_path() and runpy.run_module()

CVE-2026-22606

Description

Fickling is a Python pickling decompiler and static analyzer. Fickling versions up to and including 0.1.6 do not treat Python’s runpy module as unsafe. Because of this, a malicious pickle that uses runpy.run_path() or runpy.run_module() is classified as SUSPICIOUS instead of OVERTLY_MALICIOUS. If a user relies on Fickling’s output to decide whether a pickle is safe to deserialize, this misclassification can lead them to execute attacker-controlled code on their system. This affects any workflow or product that uses Fickling as a security gate for pickle deserialization. This issue has been patched in version 0.1.7.

Affected packages

Versions sourced from the GitHub Security Advisory.

PackageAffected versionsPatched versions
ficklingPyPI
< 0.1.70.1.7

Affected products

1

Patches

1
9a2b3f89bd05

Add runpy to unsafe modules

https://github.com/trailofbits/ficklingThomas ChauchefoinJan 7, 2026via ghsa
2 files changed · +29 0
  • fickling/fickle.py+1 0 modified
    @@ -878,6 +878,7 @@ def unsafe_imports(self) -> Iterator[ast.Import | ast.ImportFrom]:
                     "pty",
                     "marshal",
                     "types",
    +                "runpy",
                 ):
                     yield node
                 elif "eval" in (n.name for n in node.names):
    
  • test/test_bypasses.py+28 0 modified
    @@ -83,3 +83,31 @@ def test_missing_marshal_and_types(self):
             )
     
             self.assertGreater(check_safety(opcodes).severity, Severity.LIKELY_SAFE)
    +
    +    # https://github.com/trailofbits/fickling/security/advisories/GHSA-wfq2-52f7-7qvj
    +    def test_missing_runpy(self):
    +        pickled = Pickled(
    +            [
    +                op.Proto.create(5),
    +                op.Frame(46),
    +                op.ShortBinUnicode("runpy"),
    +                op.Memoize(),
    +                op.ShortBinUnicode("run_path"),
    +                op.Memoize(),
    +                op.StackGlobal(),
    +                op.Memoize(),
    +                op.ShortBinUnicode("/tmp/malicious.py"),
    +                op.Memoize(),
    +                op.TupleOne(),
    +                op.Memoize(),
    +                op.Reduce(),
    +                op.Memoize(),
    +                op.Stop(),
    +            ]
    +        )
    +        res = check_safety(pickled)
    +        self.assertGreater(res.severity, Severity.LIKELY_SAFE)
    +        self.assertEqual(
    +            res.detailed_results()["AnalysisResult"].get("UnsafeImports"),
    +            "from runpy import run_path",
    +        )
    

Vulnerability mechanics

Generated by null/stub on May 9, 2026. Inputs: CWE entries + fix-commit diffs from this CVE's patches. Citations validated against bundle.

References

11

News mentions

0

No linked articles in our index yet.