已关闭
[Bug]: sparse_ segment_sum_fp32与space_to_batch_nd非法读写问题 #350
2012-pc-gu创建于 6月25日关闭于 6月26日
6月25日 添加了label:bug
6月25日 关联组件 由 [] 改变为 [B-ComponentTest]
6月25日 问题后端类型 由 [] 改变为 [CPU]
6月25日 关联分支 由 [] 改变为 [master]
6月25日 关联了pull request:Bugfix:fix(sparse_segment_sum): add input validation to prevent OOB read/write via malformed segment_ids/indices
6月25日 关联了pull request:Bugfix:fix(sparse_segment_sum): add input validation to prevent OOB read/write via malformed segment_ids/indices
6月26日 修改了issue 的描述
6月26日 关闭了 issue
6月26日 issue状态由 TODO 改变为 DONE
Checklist
🐞 问题详细描述
Fuzz异常模型(如shape远大于实际dim)sparse_ segment_sum_fp32与space_to_batch_nd存在非法读写问题
修复 SparseSegmentSum 算子中 segment_ids / indices 输入缺乏合法性校验导致的越界读写漏洞。当前实现仅校验segment_ids[0] == 0,未校验后续元素的单调性、非负性、与 indices 的等长约束,以及 indices 自身的 [0, input_dim0) 范围。同时错误路径 MS_LOG(ERROR) 后误用 return RET_OK,导致非法输入被静默放行。
触发场景:
非单调 segment_ids(中间值 > 末尾值):segment_ids = [0, 5, 3] —— oldindex 跳到 5,输出缓冲仅 4 行 →
越界写
负值 segment_ids:segment_ids = [0, -1, 0] —— oldindex = -1,经 size_t 隐式转换产生巨大偏移 →
任意地址写
负值 indices:indices = [0, -1] —— 同样的 int32_t → size_t 转换 → 越界读
indices 越界上界:indices = [999] 但 input_dim0 = 4 → 越界读
segment_ids 与 indices 长度不等 / 空输入 → 后续循环 OOB 访问
修复方案:在 Run() 入口、指针获取之后、buffer 操作之前,集中前置校验块
长度校验:segment_ids_num > 0 && indices_num > 0 && 二者相等
起始校验:segment_ids[0] == 0(保留原有逻辑,错误返回码修正为 RET_ERROR)
单调校验:segment_ids[i] >= segment_ids[i-1](间接拦截负值,因起始为 0)
详细的环境信息描述
CPU
其他辅助信息
版本信息
master
Thanks for contributing 🎉!