案例研究_CVE-2018-1000517
案例简介
CVE-2018-1000517 是 BusyBox wget 中的缓冲区溢出漏洞,导致堆缓冲区溢出。该漏洞影响 commit 8e2174e9bd836e53c8b9c6e00d1bc6e2a718686e 之前的版本,可通过网络连接利用,可能引发任意代码执行或系统崩溃。严重性尚未由 NVD 评估,已在后续提交中修复。
GET_BITS(BZ_X_SELECTOR_1, nGroups, 3);
if (nGroups < 2 || nGroups > 6) RETURN(BZ_DATA_ERROR);GET_BITS(BZ_X_SELECTOR_2, nSelectors, 15);
if (nSelectors < 1) RETURN(BZ_DATA_ERROR); // 漏洞代码
if (nSelectors < 1 || nSelectors > BZ_MAX_SELECTORS) RETURN(BZ_DATA_ERROR); // 补丁代码for (i = 0; i < nSelectors; i++) {...s->selectorMtf[i] = j; // out-of-bounds write
代码片段来自 bzip2 的 decompress.c 文件中的 BZ2_decompress 函数,揭示了一个越界写入漏洞,分类为 CVE-2019-12900。该过程首先从输入流中读取 3 位来确定 nGroups(分组数),确保其在 2 到 6 之间;否则,返回 BZ_DATA_ERROR。接下来,它读取 15 位作为 nSelectors(选择器数),在漏洞代码中仅检查是否小于 1,而补丁版本添加了超过 BZ_MAX_SELECTORS 的检查。然后,一个循环从 0 到 nSelectors-1 迭代,向 s->selectorMtf[i] 赋值。
漏洞信息包括:项目名称(包括版本信息),文件名称,函数名称,漏洞描述。
该漏洞的成因在于 nSelectors 可从 15 位达到最多 32767,但 BZ_MAX_SELECTORS 定义为 18002,与 selectorMtf 数组的大小匹配(UChar selectorMtf[BZ_MAX_SELECTORS])。原始代码缺少上界检查,如果恶意构造的输入使 nSelectors 超过 18002,循环将写入数组边界之外,导致堆缓冲区溢出。这可能导致程序崩溃、内存损坏、潜在的任意代码执行或信息泄露,取决于编译设置和系统保护。该问题可通过特制的 .bz2 文件远程利用,影响 bzip2 1.0.6 及更早版本。
准备工作
这部分内容首先通过大语言模型分析bzip2 1.0.6的补丁文件,进而生成CVE-2018-1000517的漏洞成因。之后从GitLab下载bzip2多个版本的源码,并将这些源码编译为对应的二进制文件。
