CVE-2025-64076cbor2是一款流行的Python CBOR(Concise Binary Object Representation)编解码库。2025年11月,安全研究人员发现cbor2 5.7.0及之前版本在C扩展解码器(source/decoder.c)的decode_definite_long_string()函数中存在两个严重安全漏洞。第一个漏洞为整数下溢导致的越界读取(CWE-191、CWE-125),由于chunk处理循环中变量引用错误和状态重置缺失,导致buffer_length在UTF-8字符处理后未正确重置为零,后续计算的chunk_length会产生负值,被传递给read()方法时可能触发无限读取操作和资源耗尽。第二个漏洞为内存泄漏(CWE-401),主处理循环未释放每次迭代中分配的Python对象引用(Py_DECREF),对于超过65536字节的CBOR字符串,会造成与payload大小成比例的累积内存泄漏。攻击者可通过发送精心构造的CBOR数据(包含在65536字节边界处有多字节UTF-8字符的定长文本字符串)来远程利用这些漏洞,无需认证即可导致目标进程崩溃或内存耗尽,从而实现拒绝服务攻击。所有使用cbor2 C扩展处理不可信CBOR数据的应用都受影响,包括Web API、物联网数据采集器和消息队列处理器等。
漏洞位于cbor2的C扩展解码器模块source/decoder.c中的decode_definite_long_string()函数。该函数负责解码CBOR定长长字符串,但在处理包含多字节UTF-8字符的数据时存在两个关键缺陷:
1. 整数下溢漏洞:在chunk处理循环中,当遇到跨越65536字节边界的UTF-8多字节字符时,buffer_length变量在字符消费后未被正确重置为0。这导致后续计算chunk_length = 65536 - buffer_length时产生负值。由于该值以有符号整数形式传递给read()方法,负值会被解释为极大的无符号值,从而触发无限读取操作和资源耗尽。攻击者只需构造一个定长文本字符串,使其多字节UTF-8字符恰好位于65536字节边界处,即可触发此漏洞。
2. 内存泄漏漏洞:主处理循环中,每次迭代分配的chunk对象引用未被正确释放(缺少Py_DECREF调用)。对于超过65536字节的CBOR字符串处理,每次迭代都会泄漏一个Python对象引用,造成累积性内存泄漏。攻击者可通过反复提交大尺寸CBOR payload来耗尽服务器内存。
两个漏洞均可通过网络远程利用,无需任何认证或用户交互,成功利用将导致进程崩溃(抛出CBORDecodeEOF异常)或内存耗尽。修复版本为5.7.1,修复提交为851473490281f82d82560b2368284ef33cf6e8f9。