已关闭
【缺陷报告】整数溢出 - 文件fft2_d_dd.cpp - 函数aclfftFft2DDd - 行号87 #31
zhangjunkai9创建于  23 天前关闭于  20 天前
zhangjunkai9
23 天前 创建

缺陷信息

缺陷类型integerOverflow (整数溢出)
函数aclfftFft2DDd
文件src/fft2_d/arch32/dd/fft2_d_dd.cpp
行号87

缺陷描述

函数 aclfftFft2DDd 第87行计算 workspaceSize = batches * fftX * fftY * sizeof(float) * 2,其中 batches、fftX、fftY 均为 uint32_t。表达式按左结合求值:batches*fftX(uint32_t)、*fftY(uint32_t)两步在 32 位无符号算术中完成,128*128=16384,当 batches>262144 时 batches*fftX*fftY 超出 uint32_t 范围(2^32)发生回绕,之后才提升为 size_t,导致 workspaceSize 取错误的小值。第100行 aclrtMalloc 用错误 workspaceSize 为 dev_workspace 分配过小空间,内核执行时越界访问。同理第79行 inputSize 计算存在相同的 uint32_t 中间溢出且结果截断为 uint32_t(更严重)。上游调用链中 aclfftPlan2d(lib/fft_plan_api.cpp:76)仅校验 batch>0(无上界),aclfftExecC2C_2D 仅校验 fftX/fftY 属于 {32,64,128}(无 batch 上界),全程无保护。

详细解释

经独立复核源代码确认:fft2_d_dd.cpp:87 行 uint64_t workspaceSize = batches * fftX * fftY * sizeof(float) * 2,其中 batches、fftX、fftY 均为 uint32_t(函数签名见第63-64行)。表达式按左结合求值:batches*fftX(uint32_t)→ *fftY(uint32_t)在前两步完成 32 位无符号乘法,之后 *sizeof(float) 才提升为 size_t。fftX/fftY 被 aclfftExecC2C_2D 中的 IsDdSize 约束为 {32,64,128}(fft2_d_exec_api.cpp:14,27),最大乘积 128*128=16384=2^14,当 batches>2^32/2^14=262144 时 batches*fftX*fftY 溢出 uint32_t 发生回绕,workspaceSize 取错误小值。同理第79行 inputSize(uint32_t)存在相同溢出且额外截断。第100行 aclrtMalloc 用错误 workspaceSize 分配 dev_workspace 过小空间。调用链可达性已验证:公共 API aclfftExecC2C(lib/fft_exec_api.cpp:44-45)按 rank==2 分发到 aclfftExecC2C_2D(fft2_d_exec_api.cpp:17),后者第34行调用 aclfftFft2DDd。上游 aclfftPlan2d(fft_plan_api.cpp:71-76)仅校验 batch>0、nx>0、ny>0(下界),impl->batch 为 int32_t(fft_handle_impl.h:28),全程无上界约束,用户可传入 batch=300000 触发溢出。缺陷真实存在。

数据流证据

Source(污点源)

lib/fft_plan_api.cpp:76 行 ACLFFT_CHECK_PARAM(batch > 0, ACLFFT_INVALID_SIZE) aclfftPlan2d 仅校验 batch>0(下界),无上界检查,用户可传入任意大正整数作为 batch

Sink(污点汇聚点)

src/fft2_d/arch32/dd/fft2_d_dd.cpp:87 行 uint64_t workspaceSize = batches * fftX * fftY * sizeof(float) * 2 batches*fftX*fftY 先在 uint32_t 中间运算溢出(batches>262144、fftX=fftY=128 时),之后才提升为 size_t,workspaceSize 取错误回绕值

传播路径:

# 文件 行号 说明
1 lib/fft_plan_init_api.cpp 135 impl->batch = batch batch 存入 handle 结构体(int32_t 类型),无上界约束
2 src/fft2_d/arch32/fft2_d_exec_api.cpp 37 impl->batch 作为实参传入 aclfftFft2DDd(int32_t 隐式转换为 uint32_t batches 参数),aclfftExecC2C_2D 仅校验 fftX/fftY∈{32,64,128},未校验 batch 上界
3 src/fft2_d/arch32/dd/fft2_d_dd.cpp 64 uint32_t batches 作为函数形参接收,函数内无任何范围校验
4 src/fft2_d/arch32/dd/fft2_d_dd.cpp 79 uint32_t inputSize = batches * fftX * fftY * sizeof(float) * 2 同样的 uint32_t 中间溢出,且结果截断存入 uint32_t(双重溢出)
5 src/fft2_d/arch32/dd/fft2_d_dd.cpp 87 uint64_t workspaceSize = batches * fftX * fftY * sizeof(float) * 2 batches*fftX*fftY 在 uint32_t 中溢出后才提升为 size_t(危险操作 sink)
6 src/fft2_d/arch32/dd/fft2_d_dd.cpp 100 CHECK_ACL(aclrtMalloc(&dev_workspace, workspaceSize, ...)) 使用溢出后的错误 workspaceSize 分配过小 workspace,内核访问越界

调用链

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

# 文件 函数 函数起始行 调用点行
1 src/fft2_d/arch32/fft2_d_exec_api.cpp aclfftExecC2C_2D 17 34
2 src/fft2_d/arch32/dd/fft2_d_dd.cpp aclfftFft2DDd 63

修复建议

size_t inputSize = static_cast<size_t>(batches) * fftX * fftY * sizeof(float) * 2;
size_t outputSize = inputSize;
// ...
uint64_t workspaceSize = static_cast<uint64_t>(batches) * fftX * fftY * sizeof(float) * 2;
likedislike
east_yang成员
22 天前 评论:

已收到问题,我们将尽快修复。

likedislike
CANN-robotCANN-robot成员
20 天前 关闭了 issue
CANN-robotCANN-robot成员
20 天前 添加了label:resolved