已关闭
[Bug]: sparse_ segment_sum_fp32与space_to_batch_nd非法读写问题 #350
2012-pc-gu创建于  6月25日关闭于  6月26日
2012-pc-gu
2012-pc-gu成员
6月25日 创建

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 🎉!

likedislike
2012-pc-gu2012-pc-gu成员
6月25日 添加了label:bug
2012-pc-gu2012-pc-gu成员
6月25日 关联组件 由 [] 改变为 [B-ComponentTest]
2012-pc-gu2012-pc-gu成员
6月25日 问题后端类型 由 [] 改变为 [CPU]
2012-pc-gu2012-pc-gu成员
6月25日 关联分支 由 [] 改变为 [master]
2012-pc-gu2012-pc-gu成员
6月25日 关联了pull request:Bugfix:fix(sparse_segment_sum): add input validation to prevent OOB read/write via malformed segment_ids/indices
zhuguodongzhuguodong成员
6月26日 修改了issue 的描述
MindSpore-BotMindSpore-Bot成员
6月26日 关闭了 issue
MindSpore-BotMindSpore-Bot成员
6月26日 issue状态由 TODO 改变为 DONE