PyQuokka框架存在Pickle反序列化远程代码执行漏洞

PyQuokka框架远程代码执行漏洞分析

漏洞概述

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

受影响版本

  • 受影响版本:<= 0.3.1
  • 已修复版本:无

技术细节

漏洞位置

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

攻击场景

当FlightServer配置为监听0.0.0.0时(如第339行提供的服务器示例所示),网络上的攻击者可以通过set_configs动作发送恶意的pickle载荷来执行任意远程代码。

其他漏洞点

除了set_configs动作外,以下函数也包含漏洞点:

  • cache_garbage_collect
  • do_put
  • do_get

这些函数都使用pickle.loads来反序列化不受信任的远程数据。

漏洞复现

步骤1:启动易受攻击的服务器

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

步骤2:构造恶意载荷

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反序列化机制触发恶意代码执行。

影响范围

  • 完全系统沦陷
  • 数据泄露
  • 网络内横向移动
  • 拒绝服务攻击
  • 持久后门安装

缓解措施

替换不安全的反序列化

使用更安全的替代方案替换pickle.loads()

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

网络安全

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

安全警告

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

参考信息

安全评分

  • CVSS总体评分:9.8(严重)
  • EPSS评分:0.285%(第52百分位)

弱点分类

  • CWE-502:不可信数据的反序列化
    更多精彩内容 请关注我的个人公众号 公众号(办公AI智能小助手)
    对网络安全、黑客技术感兴趣的朋友可以关注我的安全公众号(网络安全技术点滴分享)

公众号二维码

公众号二维码

posted @ 2025-10-24 08:20  qife  阅读(3)  评论(0)    收藏  举报