CVE-2026-31969HTSlib是一个用于读写生物信息学文件格式的C语言库。CRAM是一种压缩格式,用于存储DNA序列比对数据,采用多种编码和压缩方法。该漏洞存在于HTSlib处理CRAM文件格式的BYTE_ARRAY_STOP编码方法时。具体来说,cram_byte_array_stop_decode_char()函数在检查输出缓冲区是否已满时存在一个out-by-one错误,导致攻击者可以控制的一个字节被写入堆分配的末尾之外。这种堆缓冲区溢出可能导致程序崩溃、堆数据或堆结构被意外覆写,攻击者可能利用此漏洞实现任意代码执行。此漏洞无需认证即可利用,但需要用户交互打开恶意CRAM文件。CVSS评分8.1,属于高危漏洞。
漏洞根源在于cram_byte_array_stop_decode_char()函数中的边界检查逻辑错误。当HTSlib读取采用BYTE_ARRAY_STOP编码的CRAM文件时,该函数负责解码字符数组。函数在检查输出缓冲区是否已满时使用了错误的条件判断(out-by-one错误),使得本应被拒绝的写入操作得以执行。具体表现为:函数在缓冲区还有最后一个字节空间时就认为缓冲区已满,但实际写入时仍尝试写入一个字节,导致该字节溢出到堆分配区域之外。攻击者可以通过构造特制的CRAM文件来触发此漏洞。文件只需包含使用BYTE_ARRAY_STOP编码的数据,且数据长度精心设计以利用这个边界条件错误。当目标用户打开此文件时,HTSlib会调用存在漏洞的解码函数,导致堆溢出。根据堆布局和内存分配情况,攻击者可能覆写关键数据结构、函数指针或堆元数据,最终实现代码执行。