Fickling静态分析绕过漏洞:危险模块阻止列表不完整(CVE-2026-22609)

本文详细分析了Fickling(Python Pickle安全分析器)中的一个高危漏洞CVE-2026-22609。该漏洞源于静态分析器的不安全模块检测列表不完整,导致攻击者可通过导入ctypes等危险模块绕过安全检查,实现任意代码执行。

漏洞详情

包管理器: pip 受影响包: fickling (pip) 受影响版本: <= 0.1.6 已修复版本: 0.1.7

描述

Fickling的评估

ctypes, importlib, runpy, codemultiprocessing 已被添加到不安全导入列表中(相关提交:trailofbits/fickling@9a2b3f8, trailofbits/fickling@eb299b4, trailofbits/fickling@29d5545, trailofbits/fickling@b793563)。

原始报告

摘要 Fickling静态分析器中的 unsafe_imports() 方法未能标记多个可用于任意代码执行的高风险Python模块。导入这些模块的恶意pickle将不会被检测为不安全,从而允许攻击者绕过Fickling的主要静态安全检查。

详细信息fickling/fickle.py 的第866-884行,unsafe_imports() 方法根据一个硬编码的元组检查导入的模块:

1
2
3
4
5
6
7
def unsafe_imports(self) -> Iterator[ast.Import | ast.ImportFrom]:
    for node in self.properties.imports:
        if node.module in (
            "__builtin__", "__builtins__", "builtins", "os", "posix", "nt",
            "subprocess", "sys", "builtins", "socket", "pty", "marshal", "types",
        ):
            yield node

此列表并不完整。以下危险模块未被检测

  • ctypes: 允许任意内存访问、调用C函数并完全绕过Python限制
  • importlib: 可在运行时动态导入任何模块
  • runpy: 可将Python模块作为脚本执行
  • code: 可编译并执行任意Python代码
  • multiprocessing: 可生成带有任意代码的进程

由于 ctypes 是Python标准库的一部分,它同时绕过了NonStandardImports分析。

概念验证

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
from fickling.fickle import Pickled
from fickling.analysis import check_safety, Severity

# 导入ctypes.pythonapi(允许任意代码执行)的Pickle
# PROTO 4, GLOBAL 'ctypes pythonapi', STOP
payload = b'\x80\x04cctypes\npythonapi\n.'

pickled = Pickled.load(payload)
results = check_safety(pickled)

print(f"Severity: {results.severity.name}")
print(f"Is safe: {results.severity == Severity.LIKELY_SAFE}")

# 输出:严重性为 LIKELY_SAFE 或 low - ctypes导入未被标记
# 使用ctypes的真正恶意pickle可以执行任意代码

影响 安全绕过(保密性、完整性、可用性) 攻击者可制作恶意pickle,实现:

  • 导入ctypes以获得任意内存访问权限
  • 使用ctypes.pythonapictypes.CDLL执行任意代码
  • 通过Fickling的安全分析,被判定为"可能安全"
  • 当受害者信任Fickling的判断并加载该pickle后,执行恶意代码

这破坏了Fickling作为pickle安全扫描器的核心目的。

参考

  • GHSA-q5qq-mvfm-j35x
  • trailofbits/fickling#195
  • 相关提交哈希:29d5545, 6b400e1, 9a2b3f8, b793563, eb299b4
  • 测试文件链接:https://github.com/trailofbits/fickling/blob/977b0769c13537cd96549c12bb537f05464cf09c/test/test_bypasses.py#L88

严重性

高危 (CVSS 8.9)

CVSS v4 基础指标

  • 攻击向量: 网络
  • 攻击复杂度: 低
  • 所需权限: 无
  • 用户交互: 无
  • 受影响系统的机密性、完整性、可用性影响: 高

弱点

  • CWE-184: 不完整的禁止输入列表 - 产品实施了一种保护机制,该机制依赖于一个不被策略允许或需要其他操作来中和的输入(或输入属性)列表,但该列表不完整。
  • CWE-502: 不受信任数据的反序列化 - 产品在未充分确保结果数据有效的情况下反序列化了不受信任的数据。
comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计