已关闭
【缺陷报告】整数溢出(含上溢出/下溢出) - 文件gather.h - 函数DataCopySimdSimt - 行号484 #256
zhangjunkai9创建于  8月20日关闭于  29 天前
zhangjunkai9
8月20日 创建

缺陷信息

缺陷类型integerOverflow (整数溢出(含上溢出/下溢出))
函数DataCopySimdSimt
文件autofuse/v35/ascendc/api_regbase/gather.h
行号484
置信度86%

缺陷描述

函数 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)——第484行 length -= padding / sizeof(T1) 为 uint64_t 无符号减法,当 length < padding/sizeof(T1) 时下溢为接近 UINT64_MAX 的巨大值;第485行 if (length <= 0) 对无符号整数等价于 length==0,无法捕获下溢值,后续第493行以巨大 length 调用 GatherDataCopyPadExtend 导致越界。
防护无效(2):两处 if (length <= 0) 均仅捕获 length==0,无法防护无符号下溢。
函数可达(3):entry_callchain 显示 GatherExtend(888)→GatherExtendDataCopy(505)→DataCopySimdSimt(466),call_sites 有4个调用点。
触发条件无法证实满足(4):GatherExtendDataCopy 调用需 x1_gather_dim_stride >= THREAD_NUMBER(2048),第546行 length=back_gather_idx_last+1 可小至1,dst_p 经累加后可不对齐使 padding 分支可达,构造具体参数(offset=30, ub_actual_size=4067, x1_gather_dim_stride=2048, T1=uint8_t)可触发下溢,但无法确认实际运行时这些值是否出现,属假设性缺陷,调用方实参存在模糊(可能触发未证实),对应 confidence 0.86。

数据流证据

Source(问题源头)

autofuse/v35/ascendc/api_regbase/gather.h:466 行 uint64_t length 作为函数入参传入(来自调用方 GatherExtendDataCopy 的 stride/size 计算,值可小至 1)

Sink(问题爆发点)

autofuse/v35/ascendc/api_regbase/gather.h:484 行 length -= padding / sizeof(T1) 无符号减法下溢(当 length < padding/sizeof(T1) 时回绕为巨大值)

传播路径:

# 文件 行号 说明
1 autofuse/v35/ascendc/api_regbase/gather.h 466 uint64_t length 作为函数入参接收(source,值可小至 1)
2 autofuse/v35/ascendc/api_regbase/gather.h 468 if (length <= 0) return; 无符号比较仅捕获 length==0,小正整数通过
3 autofuse/v35/ascendc/api_regbase/gather.h 474 if ((dst_p * sizeof(T1)) % 32 != 0) 当 dst_p 不对齐时进入 padding 分支
4 autofuse/v35/ascendc/api_regbase/gather.h 476 padding = (32 - (current_addr % 32)) % 32; 计算 padding 字节数(0-31)
5 autofuse/v35/ascendc/api_regbase/gather.h 484 length -= padding / sizeof(T1); SINK: 无符号下溢,length 回绕为接近 UINT64_MAX 的值
6 autofuse/v35/ascendc/api_regbase/gather.h 485 if (length <= 0) 无符号比较无法捕获下溢值(巨大值 > 0),代码继续执行
7 autofuse/v35/ascendc/api_regbase/gather.h 493 GatherDataCopyPadExtend(dst[dst_p], src1[src_p], 1, length, 0, 0); 使用下溢后的巨大 length 值,导致越界访问

调用链

可达调用链1 起点:(entry functions) → 终点:DataCopySimdSimt 深度:2

# 文件 函数 函数起始行 调用点行
1 autofuse/v35/ascendc/api_regbase/gather.h GatherExtend 888 909
2 autofuse/v35/ascendc/api_regbase/gather.h GatherExtendDataCopy 505 527
3 autofuse/v35/ascendc/api_regbase/gather.h DataCopySimdSimt 466 —

可达调用链2 起点:(entry functions) → 终点:DataCopySimdSimt 深度:2

# 文件 函数 函数起始行 调用点行
1 autofuse/v35/ascendc/api_regbase/gather.h GatherExtend 888 909
2 autofuse/v35/ascendc/api_regbase/gather.h GatherExtendDataCopy 505 537
3 autofuse/v35/ascendc/api_regbase/gather.h DataCopySimdSimt 466 —

可达调用链3 起点:(entry functions) → 终点:DataCopySimdSimt 深度:2

# 文件 函数 函数起始行 调用点行
1 autofuse/v35/ascendc/api_regbase/gather.h GatherExtend 888 909
2 autofuse/v35/ascendc/api_regbase/gather.h GatherExtendDataCopy 505 546
3 autofuse/v35/ascendc/api_regbase/gather.h DataCopySimdSimt 466 —

可达调用链4 起点:(entry functions) → 终点:DataCopySimdSimt 深度:2

# 文件 函数 函数起始行 调用点行
1 autofuse/v35/ascendc/api_regbase/gather.h GatherExtend 888 909
2 autofuse/v35/ascendc/api_regbase/gather.h GatherExtendDataCopy 505 556
3 autofuse/v35/ascendc/api_regbase/gather.h DataCopySimdSimt 466 —

修复建议

// 在第 484 行减法前增加下溢保护
uint32_t padElements = padding / sizeof(T1);
if (length <= padElements) {
    // padding 消耗完所有剩余 length,仅处理 padding 部分后返回
    return;
}
length -= padElements;
likedislike
wangmingming成员
8月20日 评论:

你好,感谢建议, 后续分析处理

likedislike
Wwangmingming成员
8月20日 将 gcw_V3YyYBt1 设为负责人
m0_56712298m0_56712298
8月26日 关联了pull request:fix: 修复 Gather 未对齐拷贝长度回绕(#256)
m0_56712298m0_56712298
8月28日 关联了pull request:fix: 修复 Gather 回绕及 BrcInline/Cast/Concat 截断(#256 #258 #259 #260)
Wwangmingming成员
29 天前 issue状态由 进行中 改变为 已完成
Wwangmingming成员
29 天前 关闭了 issue