漏洞概述 标题: Heap buffer overflow in SWinqdims via unbounded strcat on caller-allocated buffer #14356 漏洞类型: 堆缓冲区溢出 (Heap Buffer Overflow) 漏洞成因: 在 元数据中,维度名称(DimensionName)通常被双引号包裹。代码 在将维度名称追加到调用者提供的缓冲区时,使用了 函数。 调用者( )在分配缓冲区时,根据 的数量减去 2 来计算大小(假设每个名称都有双引号)。 然而,当维度名称本身不包含双引号时, 返回的长度比预期长 2 个字节。这导致 写入的字节数超过了分配的缓冲区大小,从而产生堆溢出。 受影响文件: (函数 ) (调用者) 影响范围 直接后果: 堆缓冲区溢出,可能导致服务拒绝 (Denial of Service)。 潜在后果: 受控的堆写操作 (Controlled heap OOB write),可能被利用进行代码执行。 受影响应用: 任何使用 GDAL HDF4 / HDF-EOS 多维 API 打开交换格式文件的程序。 修复方案 1. 修正长度计算: 在 的 函数中,不应无条件地减去 2。应检查字符串是否以双引号开头和结尾,仅在确实存在双引号时才减去 2。 2. 使用更安全的字符串操作: 建议将 替换为 或 ,以防止即使大小计算出现偏差也能避免溢出。 POC 代码 构建命令: ASAN 输出摘要: ```text ==17856==ERROR: AddressSanitizer: heap-buffer-overflow on address 0x6420876249e at pc 0x7e279e6025f0 bp 0x7ffe279e6025f0 sp 0x7ffe279e6025e0 WRITE of size 9 at 0x6420876249e thread T0 #0 0x7e279e6025ec in strcat (/usr/lib/x86_64-linux-gnu/libasan.so.5+0x55ec) #1 0x7e279e6025e4 in strcat (/usr/lib/x86_64-linux-gnu/libasan.so.5+0x5e4) #2 0x7e279e6025e4 in strcat (/usr/lib/x86_64-linux-gnu/libasan.so.5+0x5e4) #3 0x7e279e6025e4 in strcat (/usr/lib/x86_64-linux-gnu/libasan.so.5+0x5e4) #4 0x7e279e6025e4 in strcat (/usr/lib/x86_64-linux-gnu/libasan.so.5+0x5e4) #5 0x7e279e6025e4 in strcat (/usr/lib/x86_64-linux-gnu/libasan.so.5+0x5e4) #6 0x7e279e6025e4 in strcat (/usr/lib/x86_64-linux-gnu/libasan.so.5+0x5e4) #7 0x7e279e6025e4 in strcat (/usr/lib/x86_64-linux-gnu/libasan.so.5+0x5e4) #8 0x7e279e6025e4 in strcat (/usr/lib/x86_64-linux-gnu/libasan.so.5+0x5e4) #9 0x7e279e6025e4 in strcat (/usr/lib/x86_64-linux-gnu/libasan.so.5+0x5e4) #10 0x7e279e6025e4 in strcat (/usr/lib/x86_64-linux-gnu/libasan.so.5+0x5e4) #11 0x7e279e6025e4 in strcat (/usr/lib/x86_64-linux-gnu/libasan.so.5+0x5e4) #12 0x7e279e6025e4 in strcat (/usr/lib/x86_64-linux-gnu/libasan.so.5+0x5e4) #13 0x7e279e6025e4 in strcat (/usr/lib/x86_64-linux-gnu/libasan.so.5+0x5e4) #14 0x7e279e6025e4 in strcat (/usr/lib/x86_64-linux-gnu/libasan.so.5+0x5e4) #15 0x7e279e6025e4 in strcat (/usr/lib/x86_64-linux-gnu/libasan.so.5+0x5e4) #16 0x7e279e6025e4 in strcat (/usr/lib/x86_64-linux-gnu/libasan.so.5+0x5e4) #17 0x7e279e6025e4 in strcat (/usr/lib/x86_64-linux-gnu/libasan.so.5+0x5e4) #18 0x7e279e6025e4 in strcat (/usr/lib/x86_64-linux-gnu/libasan.so.5+0x5e4) #19 0x7e279e6025e4 in strcat (/usr/lib/x86_64-linux-gnu/libasan.so.5+0x5e4) #20 0x7e279e6025e4 in strcat (/usr/lib/x86_64-linux-gnu/libasan.so.5+0x5e4) #21 0x7e279e6025e4 in strcat (/usr/lib/x86_64-linux-gnu/libasan.so.5+0x5e4) #22 0x7e279e6025e4 in strcat (/usr/lib/x86_64-linux-gnu/libasan.so.5+0x5e4) #23 0x7e279e6025e4 in strcat (/usr/lib/x86_64-linux-gnu/libasan.so.5+0x5e4) #24 0x7e279e6025e4 in strcat (/usr/lib/x86_64-linux-gnu/libasan.so.5+0x5e4) #25 0x7e279e6025e4 in strcat (/usr/lib/x86_64-linux-gnu/libasan.so.5+0x5e4) #26 0x7e279e6025e4 in strcat (/usr/lib/x86_64-linux-gnu/libasan.so.5+0x5e4) #27 0x7e279e6025e4 in strcat (/usr/lib/x86_64-linux-gnu/libasan.so.5+0x5e4) #28 0x7e279e6025e4 in strcat (/usr/lib/x86_64-linux-gnu/libasan.so.5+0x5e4) #29 0x7e279e6025e4 in strcat (/usr/lib/x86_64-linux-gnu/libasan.so.5+0x5e4) #30 0x7e279e6025e4 in strcat (/usr/lib/x86_64-linux-gnu/libasan.so.5+0x5e4) #31 0x7e279e6025e4 in strcat (/usr/lib/x86_64-linux-gnu/libasan.so.5+0x5e4) #32 0x7e279e6025e4 in strcat (/usr/lib/x86_64-linux-gnu/libasan.so.5+0x5e4) #33 0x7e279e6025e4 in strcat (/usr/lib/x86_64-linux-gnu/libasan.so.5+0x5e4) #34 0x7e279e6025e4 in strcat (/usr/lib/x86_64-linux-gnu/libasan.so.5+0x5e4) #35 0x7e279e6025e4 in strcat (/usr/lib/x86_64-linux-gnu/libasan.so.5+0x5e4) #36 0x7e279e6025e4 in strcat (/usr/lib/x86_64-linux-gnu/libasan.so.5+0x5e4) #37 0x7e279e6025e4 in strcat (/usr/lib/x86_64-linux-gnu/libasan.so.5+0x5e4) #38 0x7e279e6025e4 in strcat (/usr/lib/x86_64-linux-gnu/libasan.so.5+0x5e4) #39 0x7e279e6025e4 in strcat (/usr/lib/x86_64-linux-gnu/libasan.so.5+0x5e4) #40 0x7e279e6025e4 in strcat (/usr/lib/x86_64-linux-gnu/libasan.so.5+0x5e4) #41 0x7e279e6025e4 in strcat (/usr/lib/x86_64-linux-gnu/libasan.so.5+0x5e4) #42 0x7e279e6025e4 in strcat (/usr/lib/x86_64-linux-gnu/libasan.so.5+0x5e4) #43 0x7e279e6025e4 in strcat (/usr/lib/x86_64-linux-gnu/libasan.so.5+0x5e4) #44 0x7e279e6025e4 in strcat (/usr/lib/x86_64-linux-gnu/libasan.so.5+0x5e4) #45 0x7e279e6025e4 in strcat (/usr/lib/x86_64-linux-gnu/libasan.so.5+0x5e4) #46 0x7e279e6025e4 in strcat (/usr/lib/x86_64-linux-gnu/libasan.so.5+0x5e4) #47 0x7e279e6025e4 in strcat (/usr/lib/x86_64-linux-gnu/libasan.so.5+0x5e4) #48 0x7e279e6025e4 in strcat (/usr/lib/x86_64-linux-gnu/libasan.so.5+0x5e4) #49 0x7e279e6025e4 in strcat (/usr/lib/x86_64-linux-gnu/libasan.so.5+0x5e4) #50 0x7e279e6025e4 in strcat (/usr/lib/x86_64-linux-gnu/libasan.so.5+0x5e4) #51 0x7e279e6025e4 in strcat (/usr/lib/x86_64-linux-gnu/libasan.so.5+0x5e4) #52 0x7e279e6025e4 in strcat (/usr/lib/x86_64-linux-gnu/libasan.so.5+0x5e4) #53 0x7e279e6025e4 in strcat (/usr/lib/x86_64-linux-gnu/libasan.so.5+0x5e4) #54 0x7e279e6025e4 in strcat (/usr/lib/x86_64-linux-gnu/libasan.so.5+0x5e4) #55