已关闭
【缺陷报告】整数溢出(含上溢出/下溢出) - 文件gather.h - 函数DataCopySimdSimt - 行号484 #256
zhangjunkai9创建于 8月20日关闭于 29 天前
wangmingming
8月20日 评论:
8月20日 评论:
你好,感谢建议, 后续分析处理


8月20日 将 gcw_V3YyYBt1 设为负责人
8月26日 关联了pull request:fix: 修复 Gather 未对齐拷贝长度回绕(#256)
8月28日 关联了pull request:fix: 修复 Gather 回绕及 BrcInline/Cast/Concat 截断(#256 #258 #259 #260)
29 天前 issue状态由 进行中 改变为 已完成
29 天前 关闭了 issue
缺陷信息
缺陷描述
函数 DataCopySimdSimt 的参数 length 为 uint64_t 无符号整数。当 dst_p 未 32 字节对齐时进入 padding 分支,第 484 行执行 length -= padding / sizeof(T1)。若 length 小于 padding / sizeof(T1)(例如 length=1 且 padding=31 对 uint8_t 类型),无符号减法下溢为接近 UINT64_MAX 的巨大值。随后第 485 行 if (length <= 0) 检查因无符号比较(等价于 length == 0)无法捕获下溢值,代码继续使用巨大的 length 值调用 Duplicate 或 GatherDataCopyPadExtend,导致缓冲区越界写入。调用方 GatherExtendDataCopy 在第 537 行和第 546 行传入的 length 可能为 x1_gather_dim_stride(可小至 1)或 back_gather_idx_last + 1(可小至 1),且 dst_p 经循环累加后可能不对齐,使下溢路径可达。
事实核查
数据流证据
传播路径:
调用链
可达调用链1 起点:
(entry functions)→ 终点:DataCopySimdSimt深度:2可达调用链2 起点:
(entry functions)→ 终点:DataCopySimdSimt深度:2可达调用链3 起点:
(entry functions)→ 终点:DataCopySimdSimt深度:2可达调用链4 起点:
(entry functions)→ 终点:DataCopySimdSimt深度:2修复建议
// 在第 484 行减法前增加下溢保护 uint32_t padElements = padding / sizeof(T1); if (length <= padElements) { // padding 消耗完所有剩余 length,仅处理 padding 部分后返回 return; } length -= padElements;