CVE-2025-61765CVE-2025-61765是python-socketio(Socket.IO实时客户端和服务器的Python实现)中存在的一个远程代码执行(RCE)漏洞,影响5.14.0之前的版本。该漏洞源于python-socketio在多服务器部署中使用消息队列(如Redis)进行服务器间通信时,消息采用Python的`pickle`模块进行编码。当Socket.IO服务器接收到来自消息队列的此类消息时,会假定其为可信消息并立即进行反序列化操作。攻击者在已经获取消息队列访问权限的前提下,可以向python-socketio服务器发送精心构造的pickle负载,利用Python的`__reduce__`方法在反序列化过程中执行任意代码。该漏洞仅影响消息队列已被入侵的部署场景,攻击者可在Socket.IO服务器进程的上下文和权限下执行任意代码。单服务器系统(不使用消息队列)以及使用安全消息队列的多服务器系统不受此漏洞影响。该漏洞由Bluerock安全团队发现并报告,CVSS评分为6.4,攻击向量为邻接网络(AV:A),需要高权限(PR:H),无需用户交互(UI:N),对机密性和完整性影响为高,对可用性影响为低。
python-socketio在多服务器部署架构中,为了实现服务器实例之间的通信和事件分发,支持使用外部消息队列后端(如Redis、RabbitMQ等)。在这些部署模式下,服务器之间传递的消息使用Python内置的`pickle`模块进行序列化和反序列化。
漏洞的核心技术原理在于Python的`pickle`模块本身存在安全风险:`pickle.loads()`函数在反序列化过程中可以执行任意Python代码。攻击者可以通过构造特殊的pickle对象,利用Python对象的`__reduce__`方法指定在反序列化时调用的函数及其参数。当服务器调用`pickle.loads()`处理来自消息队列的消息时,恶意代码将被自动执行。
利用条件与流程:
1. 目标系统必须采用多服务器部署架构,并配置了消息队列后端(如Redis);
2. 攻击者必须首先获取消息队列的访问权限(例如通过Redis未授权访问、弱口令或其他方式入侵消息队列服务器);
3. 攻击者向消息队列中注入恶意的pickle序列化数据;
4. python-socketio服务器从消息队列中读取该消息并调用`pickle.loads()`进行反序列化;
5. 在反序列化过程中,`__reduce__`方法被触发,导致任意Python代码执行。
该漏洞的修复方案是在5.14.0版本中移除`pickle`模块的使用,改用更安全的JSON编码格式进行服务器间消息传递。