Thanks for sending an issue! Please fill in the following template to help quickly solve your problem.
scatter_nd
已确认漏洞
high
not-verified
not-applicable
index/scatter_nd/op_kernel/arch35/scatter_nd.h
index/scatter_nd/op_kernel/arch35/scatter_nd_deterministic.h
indices
SimtCompute
index/scatter_nd/op_kernel/scatter_nd_apt.cpp
index/scatter_nd/op_kernel/arch35/scatter_nd.h:58-65
idx
AtomicAdd
index/scatter_nd/op_kernel/arch35/scatter_nd_deterministic.h:317-334
outOfstLocal(i)
for (TYPE_T dim = 0; dim < rankSize; ++dim) { INDICES_T indiceVal = idxLocalAddr[currIndiceIdx + dim - indiceOffSet]; outOfBound |= static_cast<TYPE_T>(indiceVal) > outputShapeAddr[dim]; idx += indiceVal * strideListAddr[dim]; } if (!outOfBound) { uint64_t dst = static_cast<uint64_t>(idx * sliceSize + scatterAxisIdx); Simt::AtomicAdd(outputGmAddr + dst, xLocalAddr[index]); }
问题点:
>
indiceVal == dim_size
idx >= 0 && idx < varInAxis
for (int64_t i = 0; i < indicesLen; ++i) { int64_t varRefOffset = outOfstLocal(i) * tilingData_.afterAxis; ... CopyOutUpdates(varRefOffset, updatesTailUbFactor); }
varRefOffset
>=
rank > 1
afterAxis > 0
dst
npu_op_code_gen
op_build
aclnn
/usr/local/Ascend*
/opt/Ascend*
3
CAND-001
FAM-INDEX-BOUNDS-001
artifacts/pattern_expansion_matrix.md
no
无
Thanks for sending an issue! Please fill in the following template to help quickly solve your problem.
Describe the current behavior / 问题描述 (Mandatory / 必填)
OPSNN-IDX-001:
scatter_nd运行时 indices 边界检查错位导致错位写入与潜在越界写结论摘要
已确认漏洞highnot-verifiednot-applicableindex/scatter_nd/op_kernel/arch35/scatter_nd.hindex/scatter_nd/op_kernel/arch35/scatter_nd_deterministic.h影响范围与前置条件
scatter_ndindices张量SimtCompute或 deterministic 写回路径调用路径
index/scatter_nd/op_kernel/scatter_nd_apt.cpp选择具体模板。index/scatter_nd/op_kernel/arch35/scatter_nd.h:58-65直接累加idx并AtomicAdd。index/scatter_nd/op_kernel/arch35/scatter_nd_deterministic.h:317-334直接把outOfstLocal(i)转成写回偏移。关键代码分析
1. 非确定性路径
SimtComputefor (TYPE_T dim = 0; dim < rankSize; ++dim) { INDICES_T indiceVal = idxLocalAddr[currIndiceIdx + dim - indiceOffSet]; outOfBound |= static_cast<TYPE_T>(indiceVal) > outputShapeAddr[dim]; idx += indiceVal * strideListAddr[dim]; } if (!outOfBound) { uint64_t dst = static_cast<uint64_t>(idx * sliceSize + scatterAxisIdx); Simt::AtomicAdd(outputGmAddr + dst, xLocalAddr[index]); }问题点:
>,因此indiceVal == dim_size被误判为合法。idx >= 0 && idx < varInAxis一类总范围校验。2. deterministic 路径
for (int64_t i = 0; i < indicesLen; ++i) { int64_t varRefOffset = outOfstLocal(i) * tilingData_.afterAxis; ... CopyOutUpdates(varRefOffset, updatesTailUbFactor); }问题点:
outOfstLocal(i)直接参与varRefOffset计算。根因
>代替了>=。可利用性与影响评估
indices为运行时输入。最小 PoC 思路
rank > 1、afterAxis > 0的样例。indiceVal == dim_size的边界索引。dst脱离合法输出范围修复建议
>改为>=。idx >= 0 && idx < varInAxis或等价总行数检查。varRefOffset落盘前补同样的过滤。验证状态
not-verifiednpu_op_code_gen、op_build、aclnn等工具/usr/local/Ascend*、/opt/Ascend*3任务与追踪信息
CAND-001FAM-INDEX-BOUNDS-001artifacts/pattern_expansion_matrix.mdEnvironment / 环境信息 (Mandatory / 必填)
no
Steps to reproduce the issue / 重现步骤 (Mandatory / 必填)
no
Describe the expected behavior / 预期结果 (Mandatory / 必填)
修复建议
>改为>=。idx >= 0 && idx < varInAxis或等价总行数检查。varRefOffset落盘前补同样的过滤。Related log / screenshot / 日志 / 截图 (Mandatory / 必填)
无
Special notes for this issue/备注 (Optional / 选填)