| 文件 | 最后提交记录 | 最后更新时间 |
|---|---|---|
style: 修复adcore pre-commit告警 Co-authored-by: fujun19<fujun19@hisilicon.com> # message auto-generated for no-merge-commit merge: !4034 merge fix/adump-pre-commit into master style: 修复adcore pre-commit告警 Created-by: fujun19 Commit-by: fujun19 Merged-by: cann-robot Description: # Pull Request ## 描述 修复 src/dfx/adump/adcore 目录下的 pre-commit 告警,并在 .pre-commit-config.yaml 中仅放开该目录的 clang-format 检查,避免后续 adcore 继续引入格式化问题。 主要变更: - 对 src/dfx/adump/adcore 下 C/C++ 文件执行 clang-format 格式化。 - 调整 .pre-commit-config.yaml 的 clang-format exclude:继续屏蔽 src/dfx/adump 其他目录,仅放开 src/dfx/adump/adcore。 ## 变更类型 请选择本次引入的变更类型: <!-- [x] 表示选中 --> - [ ] 🐛 Bug 修复 - [ ] ✨ 新功能 - [x] 💄 代码风格更新(格式化,局部变量) - [ ] ♻️ 重构(既不修复错误也不增加功能的代码变动) - [x] 📦 构建过程或辅助工具的变动 - [ ] 📝 文档内容更新 ## 关联的Issue 无 ## 如何测试 描述测试此变更的步骤和前提条件: 1. 执行 pre-commit run --files $(rg --files src/dfx/adump/adcore),结果:clang-format Passed,OAT Compliance Check Passed。 2. 推送分支到 GitCode,远端 Git Hooks Checking 结果:Passed。 ## 核对清单 <!-- [x] 表示选中 --> - [x] 我的代码遵循了项目的代码风格 - [x] 我已对代码进行了自测 - [x] 我已更新了相关的文档 - [x] 我在标题中使用了合适的类型标签(如:feat:, fix:) - [x] 我已经详细阅读了贡献指南(CONTRIBUTING.md),并遵守了其中的所有规定,包括但不限于commit message的格式、无效commit的合并等 ## 其他信息 本次无文档内容变更;核对清单中的文档项理解为无相关文档需要同步更新。 See merge request: cann/runtime!4034 | 2 个月前 | |
style: 修复adcore pre-commit告警 Co-authored-by: fujun19<fujun19@hisilicon.com> # message auto-generated for no-merge-commit merge: !4034 merge fix/adump-pre-commit into master style: 修复adcore pre-commit告警 Created-by: fujun19 Commit-by: fujun19 Merged-by: cann-robot Description: # Pull Request ## 描述 修复 src/dfx/adump/adcore 目录下的 pre-commit 告警,并在 .pre-commit-config.yaml 中仅放开该目录的 clang-format 检查,避免后续 adcore 继续引入格式化问题。 主要变更: - 对 src/dfx/adump/adcore 下 C/C++ 文件执行 clang-format 格式化。 - 调整 .pre-commit-config.yaml 的 clang-format exclude:继续屏蔽 src/dfx/adump 其他目录,仅放开 src/dfx/adump/adcore。 ## 变更类型 请选择本次引入的变更类型: <!-- [x] 表示选中 --> - [ ] 🐛 Bug 修复 - [ ] ✨ 新功能 - [x] 💄 代码风格更新(格式化,局部变量) - [ ] ♻️ 重构(既不修复错误也不增加功能的代码变动) - [x] 📦 构建过程或辅助工具的变动 - [ ] 📝 文档内容更新 ## 关联的Issue 无 ## 如何测试 描述测试此变更的步骤和前提条件: 1. 执行 pre-commit run --files $(rg --files src/dfx/adump/adcore),结果:clang-format Passed,OAT Compliance Check Passed。 2. 推送分支到 GitCode,远端 Git Hooks Checking 结果:Passed。 ## 核对清单 <!-- [x] 表示选中 --> - [x] 我的代码遵循了项目的代码风格 - [x] 我已对代码进行了自测 - [x] 我已更新了相关的文档 - [x] 我在标题中使用了合适的类型标签(如:feat:, fix:) - [x] 我已经详细阅读了贡献指南(CONTRIBUTING.md),并遵守了其中的所有规定,包括但不限于commit message的格式、无效commit的合并等 ## 其他信息 本次无文档内容变更;核对清单中的文档项理解为无相关文档需要同步更新。 See merge request: cann/runtime!4034 | 2 个月前 | |
style: 修复adcore pre-commit告警 Co-authored-by: fujun19<fujun19@hisilicon.com> # message auto-generated for no-merge-commit merge: !4034 merge fix/adump-pre-commit into master style: 修复adcore pre-commit告警 Created-by: fujun19 Commit-by: fujun19 Merged-by: cann-robot Description: # Pull Request ## 描述 修复 src/dfx/adump/adcore 目录下的 pre-commit 告警,并在 .pre-commit-config.yaml 中仅放开该目录的 clang-format 检查,避免后续 adcore 继续引入格式化问题。 主要变更: - 对 src/dfx/adump/adcore 下 C/C++ 文件执行 clang-format 格式化。 - 调整 .pre-commit-config.yaml 的 clang-format exclude:继续屏蔽 src/dfx/adump 其他目录,仅放开 src/dfx/adump/adcore。 ## 变更类型 请选择本次引入的变更类型: <!-- [x] 表示选中 --> - [ ] 🐛 Bug 修复 - [ ] ✨ 新功能 - [x] 💄 代码风格更新(格式化,局部变量) - [ ] ♻️ 重构(既不修复错误也不增加功能的代码变动) - [x] 📦 构建过程或辅助工具的变动 - [ ] 📝 文档内容更新 ## 关联的Issue 无 ## 如何测试 描述测试此变更的步骤和前提条件: 1. 执行 pre-commit run --files $(rg --files src/dfx/adump/adcore),结果:clang-format Passed,OAT Compliance Check Passed。 2. 推送分支到 GitCode,远端 Git Hooks Checking 结果:Passed。 ## 核对清单 <!-- [x] 表示选中 --> - [x] 我的代码遵循了项目的代码风格 - [x] 我已对代码进行了自测 - [x] 我已更新了相关的文档 - [x] 我在标题中使用了合适的类型标签(如:feat:, fix:) - [x] 我已经详细阅读了贡献指南(CONTRIBUTING.md),并遵守了其中的所有规定,包括但不限于commit message的格式、无效commit的合并等 ## 其他信息 本次无文档内容变更;核对清单中的文档项理解为无相关文档需要同步更新。 See merge request: cann/runtime!4034 | 2 个月前 | |
fix: 修复log代码白盒扫描Critical级缺陷(空指针/竞态/UAF/越界/语义反转) (#1067) Co-authored-by: GuoWenbo<guowenbo13@h-partners.com> # message auto-generated for no-merge-commit merge: !5422 merge fix-issue-1067 into master fix: 修复log代码白盒扫描Critical级缺陷(空指针/竞态/UAF/越界/语义反转) (#1067) Created-by: GuoWenbo Commit-by: GuoWenbo Merged-by: cann-robot Description: ## 描述 修复 issue #1067 白盒扫描报告中的 Critical 级缺陷。对报告中全部 10 项 Critical 缺陷逐一进行代码现场验证:**8 项确认并修复,2 项经代码依据判定为误报**。并按 round=1 检视意见(致命 2 / 严重 2)完成补强:3 条已修改、1 条答复非问题。 ### 已修复(8 项,含检视补强后的最终形态) | 编号 | 缺陷 | 修复要点(终态) | |---|---|---| | G16-A6 | lib_load.c dlsym 失败后解引用 NULL 函数指针致 slogd 启动崩溃 | dlsym 全部成功才调用 init;ToolMutexInit 提前到注册动作之前 | | G16B-BUG-4 | libhbm_detect.so 升级/退出路径 dlclose 时在途线程仍在执行 so 内代码(UAF) | ① adcore 新增单组件在途计数与 AdxWaitComponentDrained C API(计数在 LaunchComponentProcess 内 GetComponent 之前递增,覆盖查找-执行全窗口);② **HBM 监控线程改 joinable 并在 HbmDetectOperateDetect 所有路径(含 popen 失败)返回前 join**(检视1:detached 线程此前逃逸 drain 计数并与 handle 释放竞态);③ **drain 超时禁止 dlclose**(检视2):升级路径返回失败保留旧库、组件空闲后下次升级自动重试,销毁路径跳过卸载(退出泄漏无害);升级 drain 超时 15s 覆盖正常 hbmtester 时长(--run -t 8≈8s),销毁 5s 约束退出延迟;Destroy 顺序修正为先 ServerRelease 再 drain 再 dlclose | | G16-A1 | hbm_detect.c 仅校验 24 字节头即解引用 2080 字节结构;num 无上限致 info[128] 越界读并注入命令行 | len 校验补全 sizeof(LogDataMsg)+sizeof(AmlHbmDetectInfo);num > MAX_NUM_OF_ADDR 拒绝 | | G14B-01 | log_get_file.cpp logType 构造依赖 NUL 终止,协议不保证致堆越界读 | 以 strnlen(proto->data, proto->sliceLen) 限定(adcore 框架已校验 sliceLen 与实际收包长度一致) | | G19B-B1 | msg_queue.c isWait 语义与文档相反:slogd 反馈线程实际阻塞 msgsnd,队列满时调级线程永久挂死 | 语义对齐文档 (isWait==true)?0:IPC_NOWAIT;同步调整 4 处调用点保持现网行为,:597 即修复挂死点 | | G11B-01 | slogd_flush.c LogMalloc 失败不 return,NULL 贯穿回调链;eventlog 回调无判空在 NULL 上写 msg->magic 致 SIGSEGV | malloc 失败即 return;线程退出 flush 前判空;SlogdEventlogFlush 入口补判空(对齐 sys/app 回调) | | G11B-02 | log_session_manage.c HandleDeletedSessionNode 无锁裸写全局删除链:并发 Push 节点被抹掉(内存+HDC 句柄泄漏)或链入私有链后被 XFREE;并发 Get 拿到即将释放节点(UAF) | 新增 g_sessionProcessingNode 锁内发布/撤销;GetDeletedSessionNode 额外搜索该指针;SendDataToSessionNode 锁内快照 session 句柄后解锁再发送(节点指针不逃逸临界区) | | G12B-01 | file_monitor 三个监控(bbox/device_app/stackcore)丢弃延迟事件 handle,Stop 释放 argList 后 10-60s 延迟回调仍解引用已释放 arg(UAF) | **取消标记 + 回调自清理**(检视4 终态):arg 以 cancelled 标记取代 handle 保存——Stop 在 argListLock 内标记全部在途 arg、不删除任何事件(对悬垂 handle 调 EventDelete 存在地址复用误删新事件的 ABA,已放弃该方案);延迟回调入口检查标记后自摘自释;Exit 路径(事件线程已 join)统一释放 argList;顺带修复 DeviceAppFileSyncProc 早退不摘链存量泄漏。Start 路径全量重扫保证 Stop 取消的延迟同步无数据丢失 | ### 误报判定(2 项,附代码依据,未改代码) - **G14B-04**(log_process_util.cpp:97 ret != EN_ERR):本仓 mmWaitPid(src/mmpa/src/mmpa_linux.c:969)契约为"进程结束返回 EN_ERR(1)、错误返回 EN_ERROR(-1)、未结束返回 EN_OK(0)",并非透传 waitpid 的 pid;msprof(utils.cpp:646-657)同样以 EN_ERR 为进程结束成功,交叉印证。 - **BUG-002**(log_hardware_zip.c next_in/next_out):zip_stream 缓冲区由 hw_deflateInit2_ 分配回填(SDK 契约),UT 桩(tests/ut/slog/ut/iam/hardware_zip_stub.c:58-61)在 init 成功时设置两指针,hardware_zip_coverage_utest 5/5 通过佐证契约成立;软件版显式设置属 zlib 不同契约,不构成反证。 ### 测试侧附带修复(最小改动,解除存量验证阻断) - file_dump_func_utest.cc:MakeFileRequest 补设 sliceLen,使 MsgProto 构造符合生产契约(adcore 框架始终校验并传递 sliceLen) - log_daemon_stub.c:补 AdxWaitComponentDrained UT 桩 - log_level_stub.c:24:open(O_CREAT) 补第三参 mode(存量 fortify 编译错误) ### 检视 round=1 处理(提交 76576dc99) | 检视意见 | 处置 | |---|---| | 【致命】HBM detached 监控线程逃逸组件排空 | **已修改**:joinable + OperateDetect 全路径返回前 join + 修 popen 失败不置 WAIT_EXIT | | 【致命】排空超时后仍然 dlclose | **已修改**:超时禁止 dlclose(升级失败保留旧库自愈重试/销毁跳过卸载);升级超时 15s/销毁 5s | | 【严重】EventHandle 快照 ABA 复用误删新事件 | **已修改**(替代方案):放弃对悬垂 handle 的 EventDelete,改取消标记+回调自清理,构造性消除 ABA;框架接口零改动(剩余 EventDelete 均为 LOOP 事件属主自用,LOOP 节点不自删无 ABA 面) | | 【严重】session 快照未延长生命周期 | **确认为真实存量竞态,超出本 PR 范围,独立 issue 跟进**:该竞态不在 issue #1067 白盒扫描清单内(G11B-02 扫描项为节点内存 UAF,已由快照协议修复闭环);曾按 round-2 检视实现写者计数协议(e38b49eca),后按范围管理回退(671fca8a),已验证的修复设计与竞态 UT 归档于 issue #1255(回退提交 671fca8a5) | ## 变更类型 <!-- [x] 表示选中 --> - [x] Bug修复 - [ ] 新特性 - [ ] 性能优化 - [ ] 文档更新 - [ ] 其他,请描述: ## 关联的Issue https://gitcode.com/cann/runtime/issues/1067 ## 如何测试 - 测试结论: **PASS**(无 NPU 设备环境,以全量构建 + 相关 UT 子集 + 存量基线对照为证据;检视补强后在最终提交 76576dc99 上复验) | 验证项 | 结果 | |---|---| | 全量包构建 bash build.sh --pkg -j16(含全部生产代码改动) | build success,0 编译错误 | | ep_log_daemon_utest 相关套件(file_dump/config_cmd/hbm_detect×2/event_process/file_monitor/sys_monitor×2/cpu_detect,覆盖全部修改文件;含 hbm_detect 真实线程创建/join 路径与 file_monitor 停止/退出路径) | **115/115 PASSED**(检视补强后复验) | | log_slogd_utest 可运行子集(覆盖 msg_queue.c 及调用链) | **65/65 PASSED** | | iam_slog_utest / hardware_zip_coverage_utest | **5/5 + 5/5 PASSED**(后者为 BUG-002 契约验证) | | pre-commit 门禁(两轮,clang-format 自动修复已保留并复验) | **PASS** | **存量问题基线对照**(git stash 生产代码后纯净基线重编译运行,以下问题在基线上完全相同,与本 PR 改动无关):LIB_LOAD_EXCP_UTEST 4 例失败(依赖环境路径 /usr/lib64/device-compat-plugin/-1/*.so 缺失)、LogDaemonMainInvalidHanlde/LogDaemonMain(server_mgr 测试流)、ep_slogd_utest 首用例段错误(log_path_mgr 链)、log_slogd_utest ADX_LOG_HDC_TEST.Process 挂起。 ## 核对清单 <!-- [x] 表示选中 --> - [x] 我的代码遵循了项目的代码风格 - [x] 我已对代码进行了自测 - [ ] 我已更新了相关的文档 - [x] 我在标题中使用了合适的类型标签(如:feat:, fix:) - [x] 我已经详细阅读了贡献指南(CONTRIBUTING.md),并遵守了其中的所有规定,包括但不限于commit message的格式、无效commit的合并等 ## 其他信息 - G19B-B1 修复后行为变化矩阵:仅 slogd 反馈发送(slogd_dynamic_level.c:597)按预期从阻塞变为非阻塞(即 Critical 挂死修复点);其余 4 处调用点经参数调整后行为与修复前完全一致。 - 检视2 采纳后的行为变化:升级与长时间检测并发时升级返回失败(此前"成功"但伴随 UAF 崩溃风险),主机侧重试即可在检测结束后成功;销毁路径超时跳过 dlclose(退出时泄漏映射,无功能影响)。 - 每个修改文件保持了其原有行尾风格(部分文件在仓内本就以 CRLF 存储,与上游提交惯例一致)。 ## 风险和遗留问题 - G12B-01 取消标记方案的代价:Stop 后在途 arg 最长残留一个延迟周期(10-60s)由回调有界自清理(Start 全量重扫保证无数据丢失)。 - G16B-BUG-4 升级 drain 超时(15s)期间持有 g_libLoadMutex 与 ServerRegister 注册锁,并发注册/升级请求最多排队 15s(运行期无并发注册方,无死锁)。 - ep_slogd_utest 因存量首用例段错误无法在本环境执行,slogd_flush/slogd_eventlog/log_session_manage 修改以编译通过 + 代码走查 + 基线对照为证据。 - session 写-释放竞态(检视3)为存量问题,本次修复将其从节点内存 UAF 收窄为句柄值一层;完整闭合方案(已验证)在独立 issue #1255 跟进。 See merge request: cann/runtime!5422 | 2 天前 | |
fix: 修复log代码白盒扫描Critical级缺陷(空指针/竞态/UAF/越界/语义反转) (#1067) Co-authored-by: GuoWenbo<guowenbo13@h-partners.com> # message auto-generated for no-merge-commit merge: !5422 merge fix-issue-1067 into master fix: 修复log代码白盒扫描Critical级缺陷(空指针/竞态/UAF/越界/语义反转) (#1067) Created-by: GuoWenbo Commit-by: GuoWenbo Merged-by: cann-robot Description: ## 描述 修复 issue #1067 白盒扫描报告中的 Critical 级缺陷。对报告中全部 10 项 Critical 缺陷逐一进行代码现场验证:**8 项确认并修复,2 项经代码依据判定为误报**。并按 round=1 检视意见(致命 2 / 严重 2)完成补强:3 条已修改、1 条答复非问题。 ### 已修复(8 项,含检视补强后的最终形态) | 编号 | 缺陷 | 修复要点(终态) | |---|---|---| | G16-A6 | lib_load.c dlsym 失败后解引用 NULL 函数指针致 slogd 启动崩溃 | dlsym 全部成功才调用 init;ToolMutexInit 提前到注册动作之前 | | G16B-BUG-4 | libhbm_detect.so 升级/退出路径 dlclose 时在途线程仍在执行 so 内代码(UAF) | ① adcore 新增单组件在途计数与 AdxWaitComponentDrained C API(计数在 LaunchComponentProcess 内 GetComponent 之前递增,覆盖查找-执行全窗口);② **HBM 监控线程改 joinable 并在 HbmDetectOperateDetect 所有路径(含 popen 失败)返回前 join**(检视1:detached 线程此前逃逸 drain 计数并与 handle 释放竞态);③ **drain 超时禁止 dlclose**(检视2):升级路径返回失败保留旧库、组件空闲后下次升级自动重试,销毁路径跳过卸载(退出泄漏无害);升级 drain 超时 15s 覆盖正常 hbmtester 时长(--run -t 8≈8s),销毁 5s 约束退出延迟;Destroy 顺序修正为先 ServerRelease 再 drain 再 dlclose | | G16-A1 | hbm_detect.c 仅校验 24 字节头即解引用 2080 字节结构;num 无上限致 info[128] 越界读并注入命令行 | len 校验补全 sizeof(LogDataMsg)+sizeof(AmlHbmDetectInfo);num > MAX_NUM_OF_ADDR 拒绝 | | G14B-01 | log_get_file.cpp logType 构造依赖 NUL 终止,协议不保证致堆越界读 | 以 strnlen(proto->data, proto->sliceLen) 限定(adcore 框架已校验 sliceLen 与实际收包长度一致) | | G19B-B1 | msg_queue.c isWait 语义与文档相反:slogd 反馈线程实际阻塞 msgsnd,队列满时调级线程永久挂死 | 语义对齐文档 (isWait==true)?0:IPC_NOWAIT;同步调整 4 处调用点保持现网行为,:597 即修复挂死点 | | G11B-01 | slogd_flush.c LogMalloc 失败不 return,NULL 贯穿回调链;eventlog 回调无判空在 NULL 上写 msg->magic 致 SIGSEGV | malloc 失败即 return;线程退出 flush 前判空;SlogdEventlogFlush 入口补判空(对齐 sys/app 回调) | | G11B-02 | log_session_manage.c HandleDeletedSessionNode 无锁裸写全局删除链:并发 Push 节点被抹掉(内存+HDC 句柄泄漏)或链入私有链后被 XFREE;并发 Get 拿到即将释放节点(UAF) | 新增 g_sessionProcessingNode 锁内发布/撤销;GetDeletedSessionNode 额外搜索该指针;SendDataToSessionNode 锁内快照 session 句柄后解锁再发送(节点指针不逃逸临界区) | | G12B-01 | file_monitor 三个监控(bbox/device_app/stackcore)丢弃延迟事件 handle,Stop 释放 argList 后 10-60s 延迟回调仍解引用已释放 arg(UAF) | **取消标记 + 回调自清理**(检视4 终态):arg 以 cancelled 标记取代 handle 保存——Stop 在 argListLock 内标记全部在途 arg、不删除任何事件(对悬垂 handle 调 EventDelete 存在地址复用误删新事件的 ABA,已放弃该方案);延迟回调入口检查标记后自摘自释;Exit 路径(事件线程已 join)统一释放 argList;顺带修复 DeviceAppFileSyncProc 早退不摘链存量泄漏。Start 路径全量重扫保证 Stop 取消的延迟同步无数据丢失 | ### 误报判定(2 项,附代码依据,未改代码) - **G14B-04**(log_process_util.cpp:97 ret != EN_ERR):本仓 mmWaitPid(src/mmpa/src/mmpa_linux.c:969)契约为"进程结束返回 EN_ERR(1)、错误返回 EN_ERROR(-1)、未结束返回 EN_OK(0)",并非透传 waitpid 的 pid;msprof(utils.cpp:646-657)同样以 EN_ERR 为进程结束成功,交叉印证。 - **BUG-002**(log_hardware_zip.c next_in/next_out):zip_stream 缓冲区由 hw_deflateInit2_ 分配回填(SDK 契约),UT 桩(tests/ut/slog/ut/iam/hardware_zip_stub.c:58-61)在 init 成功时设置两指针,hardware_zip_coverage_utest 5/5 通过佐证契约成立;软件版显式设置属 zlib 不同契约,不构成反证。 ### 测试侧附带修复(最小改动,解除存量验证阻断) - file_dump_func_utest.cc:MakeFileRequest 补设 sliceLen,使 MsgProto 构造符合生产契约(adcore 框架始终校验并传递 sliceLen) - log_daemon_stub.c:补 AdxWaitComponentDrained UT 桩 - log_level_stub.c:24:open(O_CREAT) 补第三参 mode(存量 fortify 编译错误) ### 检视 round=1 处理(提交 76576dc99) | 检视意见 | 处置 | |---|---| | 【致命】HBM detached 监控线程逃逸组件排空 | **已修改**:joinable + OperateDetect 全路径返回前 join + 修 popen 失败不置 WAIT_EXIT | | 【致命】排空超时后仍然 dlclose | **已修改**:超时禁止 dlclose(升级失败保留旧库自愈重试/销毁跳过卸载);升级超时 15s/销毁 5s | | 【严重】EventHandle 快照 ABA 复用误删新事件 | **已修改**(替代方案):放弃对悬垂 handle 的 EventDelete,改取消标记+回调自清理,构造性消除 ABA;框架接口零改动(剩余 EventDelete 均为 LOOP 事件属主自用,LOOP 节点不自删无 ABA 面) | | 【严重】session 快照未延长生命周期 | **确认为真实存量竞态,超出本 PR 范围,独立 issue 跟进**:该竞态不在 issue #1067 白盒扫描清单内(G11B-02 扫描项为节点内存 UAF,已由快照协议修复闭环);曾按 round-2 检视实现写者计数协议(e38b49eca),后按范围管理回退(671fca8a),已验证的修复设计与竞态 UT 归档于 issue #1255(回退提交 671fca8a5) | ## 变更类型 <!-- [x] 表示选中 --> - [x] Bug修复 - [ ] 新特性 - [ ] 性能优化 - [ ] 文档更新 - [ ] 其他,请描述: ## 关联的Issue https://gitcode.com/cann/runtime/issues/1067 ## 如何测试 - 测试结论: **PASS**(无 NPU 设备环境,以全量构建 + 相关 UT 子集 + 存量基线对照为证据;检视补强后在最终提交 76576dc99 上复验) | 验证项 | 结果 | |---|---| | 全量包构建 bash build.sh --pkg -j16(含全部生产代码改动) | build success,0 编译错误 | | ep_log_daemon_utest 相关套件(file_dump/config_cmd/hbm_detect×2/event_process/file_monitor/sys_monitor×2/cpu_detect,覆盖全部修改文件;含 hbm_detect 真实线程创建/join 路径与 file_monitor 停止/退出路径) | **115/115 PASSED**(检视补强后复验) | | log_slogd_utest 可运行子集(覆盖 msg_queue.c 及调用链) | **65/65 PASSED** | | iam_slog_utest / hardware_zip_coverage_utest | **5/5 + 5/5 PASSED**(后者为 BUG-002 契约验证) | | pre-commit 门禁(两轮,clang-format 自动修复已保留并复验) | **PASS** | **存量问题基线对照**(git stash 生产代码后纯净基线重编译运行,以下问题在基线上完全相同,与本 PR 改动无关):LIB_LOAD_EXCP_UTEST 4 例失败(依赖环境路径 /usr/lib64/device-compat-plugin/-1/*.so 缺失)、LogDaemonMainInvalidHanlde/LogDaemonMain(server_mgr 测试流)、ep_slogd_utest 首用例段错误(log_path_mgr 链)、log_slogd_utest ADX_LOG_HDC_TEST.Process 挂起。 ## 核对清单 <!-- [x] 表示选中 --> - [x] 我的代码遵循了项目的代码风格 - [x] 我已对代码进行了自测 - [ ] 我已更新了相关的文档 - [x] 我在标题中使用了合适的类型标签(如:feat:, fix:) - [x] 我已经详细阅读了贡献指南(CONTRIBUTING.md),并遵守了其中的所有规定,包括但不限于commit message的格式、无效commit的合并等 ## 其他信息 - G19B-B1 修复后行为变化矩阵:仅 slogd 反馈发送(slogd_dynamic_level.c:597)按预期从阻塞变为非阻塞(即 Critical 挂死修复点);其余 4 处调用点经参数调整后行为与修复前完全一致。 - 检视2 采纳后的行为变化:升级与长时间检测并发时升级返回失败(此前"成功"但伴随 UAF 崩溃风险),主机侧重试即可在检测结束后成功;销毁路径超时跳过 dlclose(退出时泄漏映射,无功能影响)。 - 每个修改文件保持了其原有行尾风格(部分文件在仓内本就以 CRLF 存储,与上游提交惯例一致)。 ## 风险和遗留问题 - G12B-01 取消标记方案的代价:Stop 后在途 arg 最长残留一个延迟周期(10-60s)由回调有界自清理(Start 全量重扫保证无数据丢失)。 - G16B-BUG-4 升级 drain 超时(15s)期间持有 g_libLoadMutex 与 ServerRegister 注册锁,并发注册/升级请求最多排队 15s(运行期无并发注册方,无死锁)。 - ep_slogd_utest 因存量首用例段错误无法在本环境执行,slogd_flush/slogd_eventlog/log_session_manage 修改以编译通过 + 代码走查 + 基线对照为证据。 - session 写-释放竞态(检视3)为存量问题,本次修复将其从节点内存 UAF 收窄为句柄值一层;完整闭合方案(已验证)在独立 issue #1255 跟进。 See merge request: cann/runtime!5422 | 2 天前 | |
fix: 修复log代码白盒扫描Critical级缺陷(空指针/竞态/UAF/越界/语义反转) (#1067) Co-authored-by: GuoWenbo<guowenbo13@h-partners.com> # message auto-generated for no-merge-commit merge: !5422 merge fix-issue-1067 into master fix: 修复log代码白盒扫描Critical级缺陷(空指针/竞态/UAF/越界/语义反转) (#1067) Created-by: GuoWenbo Commit-by: GuoWenbo Merged-by: cann-robot Description: ## 描述 修复 issue #1067 白盒扫描报告中的 Critical 级缺陷。对报告中全部 10 项 Critical 缺陷逐一进行代码现场验证:**8 项确认并修复,2 项经代码依据判定为误报**。并按 round=1 检视意见(致命 2 / 严重 2)完成补强:3 条已修改、1 条答复非问题。 ### 已修复(8 项,含检视补强后的最终形态) | 编号 | 缺陷 | 修复要点(终态) | |---|---|---| | G16-A6 | lib_load.c dlsym 失败后解引用 NULL 函数指针致 slogd 启动崩溃 | dlsym 全部成功才调用 init;ToolMutexInit 提前到注册动作之前 | | G16B-BUG-4 | libhbm_detect.so 升级/退出路径 dlclose 时在途线程仍在执行 so 内代码(UAF) | ① adcore 新增单组件在途计数与 AdxWaitComponentDrained C API(计数在 LaunchComponentProcess 内 GetComponent 之前递增,覆盖查找-执行全窗口);② **HBM 监控线程改 joinable 并在 HbmDetectOperateDetect 所有路径(含 popen 失败)返回前 join**(检视1:detached 线程此前逃逸 drain 计数并与 handle 释放竞态);③ **drain 超时禁止 dlclose**(检视2):升级路径返回失败保留旧库、组件空闲后下次升级自动重试,销毁路径跳过卸载(退出泄漏无害);升级 drain 超时 15s 覆盖正常 hbmtester 时长(--run -t 8≈8s),销毁 5s 约束退出延迟;Destroy 顺序修正为先 ServerRelease 再 drain 再 dlclose | | G16-A1 | hbm_detect.c 仅校验 24 字节头即解引用 2080 字节结构;num 无上限致 info[128] 越界读并注入命令行 | len 校验补全 sizeof(LogDataMsg)+sizeof(AmlHbmDetectInfo);num > MAX_NUM_OF_ADDR 拒绝 | | G14B-01 | log_get_file.cpp logType 构造依赖 NUL 终止,协议不保证致堆越界读 | 以 strnlen(proto->data, proto->sliceLen) 限定(adcore 框架已校验 sliceLen 与实际收包长度一致) | | G19B-B1 | msg_queue.c isWait 语义与文档相反:slogd 反馈线程实际阻塞 msgsnd,队列满时调级线程永久挂死 | 语义对齐文档 (isWait==true)?0:IPC_NOWAIT;同步调整 4 处调用点保持现网行为,:597 即修复挂死点 | | G11B-01 | slogd_flush.c LogMalloc 失败不 return,NULL 贯穿回调链;eventlog 回调无判空在 NULL 上写 msg->magic 致 SIGSEGV | malloc 失败即 return;线程退出 flush 前判空;SlogdEventlogFlush 入口补判空(对齐 sys/app 回调) | | G11B-02 | log_session_manage.c HandleDeletedSessionNode 无锁裸写全局删除链:并发 Push 节点被抹掉(内存+HDC 句柄泄漏)或链入私有链后被 XFREE;并发 Get 拿到即将释放节点(UAF) | 新增 g_sessionProcessingNode 锁内发布/撤销;GetDeletedSessionNode 额外搜索该指针;SendDataToSessionNode 锁内快照 session 句柄后解锁再发送(节点指针不逃逸临界区) | | G12B-01 | file_monitor 三个监控(bbox/device_app/stackcore)丢弃延迟事件 handle,Stop 释放 argList 后 10-60s 延迟回调仍解引用已释放 arg(UAF) | **取消标记 + 回调自清理**(检视4 终态):arg 以 cancelled 标记取代 handle 保存——Stop 在 argListLock 内标记全部在途 arg、不删除任何事件(对悬垂 handle 调 EventDelete 存在地址复用误删新事件的 ABA,已放弃该方案);延迟回调入口检查标记后自摘自释;Exit 路径(事件线程已 join)统一释放 argList;顺带修复 DeviceAppFileSyncProc 早退不摘链存量泄漏。Start 路径全量重扫保证 Stop 取消的延迟同步无数据丢失 | ### 误报判定(2 项,附代码依据,未改代码) - **G14B-04**(log_process_util.cpp:97 ret != EN_ERR):本仓 mmWaitPid(src/mmpa/src/mmpa_linux.c:969)契约为"进程结束返回 EN_ERR(1)、错误返回 EN_ERROR(-1)、未结束返回 EN_OK(0)",并非透传 waitpid 的 pid;msprof(utils.cpp:646-657)同样以 EN_ERR 为进程结束成功,交叉印证。 - **BUG-002**(log_hardware_zip.c next_in/next_out):zip_stream 缓冲区由 hw_deflateInit2_ 分配回填(SDK 契约),UT 桩(tests/ut/slog/ut/iam/hardware_zip_stub.c:58-61)在 init 成功时设置两指针,hardware_zip_coverage_utest 5/5 通过佐证契约成立;软件版显式设置属 zlib 不同契约,不构成反证。 ### 测试侧附带修复(最小改动,解除存量验证阻断) - file_dump_func_utest.cc:MakeFileRequest 补设 sliceLen,使 MsgProto 构造符合生产契约(adcore 框架始终校验并传递 sliceLen) - log_daemon_stub.c:补 AdxWaitComponentDrained UT 桩 - log_level_stub.c:24:open(O_CREAT) 补第三参 mode(存量 fortify 编译错误) ### 检视 round=1 处理(提交 76576dc99) | 检视意见 | 处置 | |---|---| | 【致命】HBM detached 监控线程逃逸组件排空 | **已修改**:joinable + OperateDetect 全路径返回前 join + 修 popen 失败不置 WAIT_EXIT | | 【致命】排空超时后仍然 dlclose | **已修改**:超时禁止 dlclose(升级失败保留旧库自愈重试/销毁跳过卸载);升级超时 15s/销毁 5s | | 【严重】EventHandle 快照 ABA 复用误删新事件 | **已修改**(替代方案):放弃对悬垂 handle 的 EventDelete,改取消标记+回调自清理,构造性消除 ABA;框架接口零改动(剩余 EventDelete 均为 LOOP 事件属主自用,LOOP 节点不自删无 ABA 面) | | 【严重】session 快照未延长生命周期 | **确认为真实存量竞态,超出本 PR 范围,独立 issue 跟进**:该竞态不在 issue #1067 白盒扫描清单内(G11B-02 扫描项为节点内存 UAF,已由快照协议修复闭环);曾按 round-2 检视实现写者计数协议(e38b49eca),后按范围管理回退(671fca8a),已验证的修复设计与竞态 UT 归档于 issue #1255(回退提交 671fca8a5) | ## 变更类型 <!-- [x] 表示选中 --> - [x] Bug修复 - [ ] 新特性 - [ ] 性能优化 - [ ] 文档更新 - [ ] 其他,请描述: ## 关联的Issue https://gitcode.com/cann/runtime/issues/1067 ## 如何测试 - 测试结论: **PASS**(无 NPU 设备环境,以全量构建 + 相关 UT 子集 + 存量基线对照为证据;检视补强后在最终提交 76576dc99 上复验) | 验证项 | 结果 | |---|---| | 全量包构建 bash build.sh --pkg -j16(含全部生产代码改动) | build success,0 编译错误 | | ep_log_daemon_utest 相关套件(file_dump/config_cmd/hbm_detect×2/event_process/file_monitor/sys_monitor×2/cpu_detect,覆盖全部修改文件;含 hbm_detect 真实线程创建/join 路径与 file_monitor 停止/退出路径) | **115/115 PASSED**(检视补强后复验) | | log_slogd_utest 可运行子集(覆盖 msg_queue.c 及调用链) | **65/65 PASSED** | | iam_slog_utest / hardware_zip_coverage_utest | **5/5 + 5/5 PASSED**(后者为 BUG-002 契约验证) | | pre-commit 门禁(两轮,clang-format 自动修复已保留并复验) | **PASS** | **存量问题基线对照**(git stash 生产代码后纯净基线重编译运行,以下问题在基线上完全相同,与本 PR 改动无关):LIB_LOAD_EXCP_UTEST 4 例失败(依赖环境路径 /usr/lib64/device-compat-plugin/-1/*.so 缺失)、LogDaemonMainInvalidHanlde/LogDaemonMain(server_mgr 测试流)、ep_slogd_utest 首用例段错误(log_path_mgr 链)、log_slogd_utest ADX_LOG_HDC_TEST.Process 挂起。 ## 核对清单 <!-- [x] 表示选中 --> - [x] 我的代码遵循了项目的代码风格 - [x] 我已对代码进行了自测 - [ ] 我已更新了相关的文档 - [x] 我在标题中使用了合适的类型标签(如:feat:, fix:) - [x] 我已经详细阅读了贡献指南(CONTRIBUTING.md),并遵守了其中的所有规定,包括但不限于commit message的格式、无效commit的合并等 ## 其他信息 - G19B-B1 修复后行为变化矩阵:仅 slogd 反馈发送(slogd_dynamic_level.c:597)按预期从阻塞变为非阻塞(即 Critical 挂死修复点);其余 4 处调用点经参数调整后行为与修复前完全一致。 - 检视2 采纳后的行为变化:升级与长时间检测并发时升级返回失败(此前"成功"但伴随 UAF 崩溃风险),主机侧重试即可在检测结束后成功;销毁路径超时跳过 dlclose(退出时泄漏映射,无功能影响)。 - 每个修改文件保持了其原有行尾风格(部分文件在仓内本就以 CRLF 存储,与上游提交惯例一致)。 ## 风险和遗留问题 - G12B-01 取消标记方案的代价:Stop 后在途 arg 最长残留一个延迟周期(10-60s)由回调有界自清理(Start 全量重扫保证无数据丢失)。 - G16B-BUG-4 升级 drain 超时(15s)期间持有 g_libLoadMutex 与 ServerRegister 注册锁,并发注册/升级请求最多排队 15s(运行期无并发注册方,无死锁)。 - ep_slogd_utest 因存量首用例段错误无法在本环境执行,slogd_flush/slogd_eventlog/log_session_manage 修改以编译通过 + 代码走查 + 基线对照为证据。 - session 写-释放竞态(检视3)为存量问题,本次修复将其从节点内存 UAF 收窄为句柄值一层;完整闭合方案(已验证)在独立 issue #1255 跟进。 See merge request: cann/runtime!5422 | 2 天前 | |
fix: 修复log代码白盒扫描Critical级缺陷(空指针/竞态/UAF/越界/语义反转) (#1067) Co-authored-by: GuoWenbo<guowenbo13@h-partners.com> # message auto-generated for no-merge-commit merge: !5422 merge fix-issue-1067 into master fix: 修复log代码白盒扫描Critical级缺陷(空指针/竞态/UAF/越界/语义反转) (#1067) Created-by: GuoWenbo Commit-by: GuoWenbo Merged-by: cann-robot Description: ## 描述 修复 issue #1067 白盒扫描报告中的 Critical 级缺陷。对报告中全部 10 项 Critical 缺陷逐一进行代码现场验证:**8 项确认并修复,2 项经代码依据判定为误报**。并按 round=1 检视意见(致命 2 / 严重 2)完成补强:3 条已修改、1 条答复非问题。 ### 已修复(8 项,含检视补强后的最终形态) | 编号 | 缺陷 | 修复要点(终态) | |---|---|---| | G16-A6 | lib_load.c dlsym 失败后解引用 NULL 函数指针致 slogd 启动崩溃 | dlsym 全部成功才调用 init;ToolMutexInit 提前到注册动作之前 | | G16B-BUG-4 | libhbm_detect.so 升级/退出路径 dlclose 时在途线程仍在执行 so 内代码(UAF) | ① adcore 新增单组件在途计数与 AdxWaitComponentDrained C API(计数在 LaunchComponentProcess 内 GetComponent 之前递增,覆盖查找-执行全窗口);② **HBM 监控线程改 joinable 并在 HbmDetectOperateDetect 所有路径(含 popen 失败)返回前 join**(检视1:detached 线程此前逃逸 drain 计数并与 handle 释放竞态);③ **drain 超时禁止 dlclose**(检视2):升级路径返回失败保留旧库、组件空闲后下次升级自动重试,销毁路径跳过卸载(退出泄漏无害);升级 drain 超时 15s 覆盖正常 hbmtester 时长(--run -t 8≈8s),销毁 5s 约束退出延迟;Destroy 顺序修正为先 ServerRelease 再 drain 再 dlclose | | G16-A1 | hbm_detect.c 仅校验 24 字节头即解引用 2080 字节结构;num 无上限致 info[128] 越界读并注入命令行 | len 校验补全 sizeof(LogDataMsg)+sizeof(AmlHbmDetectInfo);num > MAX_NUM_OF_ADDR 拒绝 | | G14B-01 | log_get_file.cpp logType 构造依赖 NUL 终止,协议不保证致堆越界读 | 以 strnlen(proto->data, proto->sliceLen) 限定(adcore 框架已校验 sliceLen 与实际收包长度一致) | | G19B-B1 | msg_queue.c isWait 语义与文档相反:slogd 反馈线程实际阻塞 msgsnd,队列满时调级线程永久挂死 | 语义对齐文档 (isWait==true)?0:IPC_NOWAIT;同步调整 4 处调用点保持现网行为,:597 即修复挂死点 | | G11B-01 | slogd_flush.c LogMalloc 失败不 return,NULL 贯穿回调链;eventlog 回调无判空在 NULL 上写 msg->magic 致 SIGSEGV | malloc 失败即 return;线程退出 flush 前判空;SlogdEventlogFlush 入口补判空(对齐 sys/app 回调) | | G11B-02 | log_session_manage.c HandleDeletedSessionNode 无锁裸写全局删除链:并发 Push 节点被抹掉(内存+HDC 句柄泄漏)或链入私有链后被 XFREE;并发 Get 拿到即将释放节点(UAF) | 新增 g_sessionProcessingNode 锁内发布/撤销;GetDeletedSessionNode 额外搜索该指针;SendDataToSessionNode 锁内快照 session 句柄后解锁再发送(节点指针不逃逸临界区) | | G12B-01 | file_monitor 三个监控(bbox/device_app/stackcore)丢弃延迟事件 handle,Stop 释放 argList 后 10-60s 延迟回调仍解引用已释放 arg(UAF) | **取消标记 + 回调自清理**(检视4 终态):arg 以 cancelled 标记取代 handle 保存——Stop 在 argListLock 内标记全部在途 arg、不删除任何事件(对悬垂 handle 调 EventDelete 存在地址复用误删新事件的 ABA,已放弃该方案);延迟回调入口检查标记后自摘自释;Exit 路径(事件线程已 join)统一释放 argList;顺带修复 DeviceAppFileSyncProc 早退不摘链存量泄漏。Start 路径全量重扫保证 Stop 取消的延迟同步无数据丢失 | ### 误报判定(2 项,附代码依据,未改代码) - **G14B-04**(log_process_util.cpp:97 ret != EN_ERR):本仓 mmWaitPid(src/mmpa/src/mmpa_linux.c:969)契约为"进程结束返回 EN_ERR(1)、错误返回 EN_ERROR(-1)、未结束返回 EN_OK(0)",并非透传 waitpid 的 pid;msprof(utils.cpp:646-657)同样以 EN_ERR 为进程结束成功,交叉印证。 - **BUG-002**(log_hardware_zip.c next_in/next_out):zip_stream 缓冲区由 hw_deflateInit2_ 分配回填(SDK 契约),UT 桩(tests/ut/slog/ut/iam/hardware_zip_stub.c:58-61)在 init 成功时设置两指针,hardware_zip_coverage_utest 5/5 通过佐证契约成立;软件版显式设置属 zlib 不同契约,不构成反证。 ### 测试侧附带修复(最小改动,解除存量验证阻断) - file_dump_func_utest.cc:MakeFileRequest 补设 sliceLen,使 MsgProto 构造符合生产契约(adcore 框架始终校验并传递 sliceLen) - log_daemon_stub.c:补 AdxWaitComponentDrained UT 桩 - log_level_stub.c:24:open(O_CREAT) 补第三参 mode(存量 fortify 编译错误) ### 检视 round=1 处理(提交 76576dc99) | 检视意见 | 处置 | |---|---| | 【致命】HBM detached 监控线程逃逸组件排空 | **已修改**:joinable + OperateDetect 全路径返回前 join + 修 popen 失败不置 WAIT_EXIT | | 【致命】排空超时后仍然 dlclose | **已修改**:超时禁止 dlclose(升级失败保留旧库自愈重试/销毁跳过卸载);升级超时 15s/销毁 5s | | 【严重】EventHandle 快照 ABA 复用误删新事件 | **已修改**(替代方案):放弃对悬垂 handle 的 EventDelete,改取消标记+回调自清理,构造性消除 ABA;框架接口零改动(剩余 EventDelete 均为 LOOP 事件属主自用,LOOP 节点不自删无 ABA 面) | | 【严重】session 快照未延长生命周期 | **确认为真实存量竞态,超出本 PR 范围,独立 issue 跟进**:该竞态不在 issue #1067 白盒扫描清单内(G11B-02 扫描项为节点内存 UAF,已由快照协议修复闭环);曾按 round-2 检视实现写者计数协议(e38b49eca),后按范围管理回退(671fca8a),已验证的修复设计与竞态 UT 归档于 issue #1255(回退提交 671fca8a5) | ## 变更类型 <!-- [x] 表示选中 --> - [x] Bug修复 - [ ] 新特性 - [ ] 性能优化 - [ ] 文档更新 - [ ] 其他,请描述: ## 关联的Issue https://gitcode.com/cann/runtime/issues/1067 ## 如何测试 - 测试结论: **PASS**(无 NPU 设备环境,以全量构建 + 相关 UT 子集 + 存量基线对照为证据;检视补强后在最终提交 76576dc99 上复验) | 验证项 | 结果 | |---|---| | 全量包构建 bash build.sh --pkg -j16(含全部生产代码改动) | build success,0 编译错误 | | ep_log_daemon_utest 相关套件(file_dump/config_cmd/hbm_detect×2/event_process/file_monitor/sys_monitor×2/cpu_detect,覆盖全部修改文件;含 hbm_detect 真实线程创建/join 路径与 file_monitor 停止/退出路径) | **115/115 PASSED**(检视补强后复验) | | log_slogd_utest 可运行子集(覆盖 msg_queue.c 及调用链) | **65/65 PASSED** | | iam_slog_utest / hardware_zip_coverage_utest | **5/5 + 5/5 PASSED**(后者为 BUG-002 契约验证) | | pre-commit 门禁(两轮,clang-format 自动修复已保留并复验) | **PASS** | **存量问题基线对照**(git stash 生产代码后纯净基线重编译运行,以下问题在基线上完全相同,与本 PR 改动无关):LIB_LOAD_EXCP_UTEST 4 例失败(依赖环境路径 /usr/lib64/device-compat-plugin/-1/*.so 缺失)、LogDaemonMainInvalidHanlde/LogDaemonMain(server_mgr 测试流)、ep_slogd_utest 首用例段错误(log_path_mgr 链)、log_slogd_utest ADX_LOG_HDC_TEST.Process 挂起。 ## 核对清单 <!-- [x] 表示选中 --> - [x] 我的代码遵循了项目的代码风格 - [x] 我已对代码进行了自测 - [ ] 我已更新了相关的文档 - [x] 我在标题中使用了合适的类型标签(如:feat:, fix:) - [x] 我已经详细阅读了贡献指南(CONTRIBUTING.md),并遵守了其中的所有规定,包括但不限于commit message的格式、无效commit的合并等 ## 其他信息 - G19B-B1 修复后行为变化矩阵:仅 slogd 反馈发送(slogd_dynamic_level.c:597)按预期从阻塞变为非阻塞(即 Critical 挂死修复点);其余 4 处调用点经参数调整后行为与修复前完全一致。 - 检视2 采纳后的行为变化:升级与长时间检测并发时升级返回失败(此前"成功"但伴随 UAF 崩溃风险),主机侧重试即可在检测结束后成功;销毁路径超时跳过 dlclose(退出时泄漏映射,无功能影响)。 - 每个修改文件保持了其原有行尾风格(部分文件在仓内本就以 CRLF 存储,与上游提交惯例一致)。 ## 风险和遗留问题 - G12B-01 取消标记方案的代价:Stop 后在途 arg 最长残留一个延迟周期(10-60s)由回调有界自清理(Start 全量重扫保证无数据丢失)。 - G16B-BUG-4 升级 drain 超时(15s)期间持有 g_libLoadMutex 与 ServerRegister 注册锁,并发注册/升级请求最多排队 15s(运行期无并发注册方,无死锁)。 - ep_slogd_utest 因存量首用例段错误无法在本环境执行,slogd_flush/slogd_eventlog/log_session_manage 修改以编译通过 + 代码走查 + 基线对照为证据。 - session 写-释放竞态(检视3)为存量问题,本次修复将其从节点内存 UAF 收窄为句柄值一层;完整闭合方案(已验证)在独立 issue #1255 跟进。 See merge request: cann/runtime!5422 | 2 天前 | |
fix: 修复log代码白盒扫描Critical级缺陷(空指针/竞态/UAF/越界/语义反转) (#1067) Co-authored-by: GuoWenbo<guowenbo13@h-partners.com> # message auto-generated for no-merge-commit merge: !5422 merge fix-issue-1067 into master fix: 修复log代码白盒扫描Critical级缺陷(空指针/竞态/UAF/越界/语义反转) (#1067) Created-by: GuoWenbo Commit-by: GuoWenbo Merged-by: cann-robot Description: ## 描述 修复 issue #1067 白盒扫描报告中的 Critical 级缺陷。对报告中全部 10 项 Critical 缺陷逐一进行代码现场验证:**8 项确认并修复,2 项经代码依据判定为误报**。并按 round=1 检视意见(致命 2 / 严重 2)完成补强:3 条已修改、1 条答复非问题。 ### 已修复(8 项,含检视补强后的最终形态) | 编号 | 缺陷 | 修复要点(终态) | |---|---|---| | G16-A6 | lib_load.c dlsym 失败后解引用 NULL 函数指针致 slogd 启动崩溃 | dlsym 全部成功才调用 init;ToolMutexInit 提前到注册动作之前 | | G16B-BUG-4 | libhbm_detect.so 升级/退出路径 dlclose 时在途线程仍在执行 so 内代码(UAF) | ① adcore 新增单组件在途计数与 AdxWaitComponentDrained C API(计数在 LaunchComponentProcess 内 GetComponent 之前递增,覆盖查找-执行全窗口);② **HBM 监控线程改 joinable 并在 HbmDetectOperateDetect 所有路径(含 popen 失败)返回前 join**(检视1:detached 线程此前逃逸 drain 计数并与 handle 释放竞态);③ **drain 超时禁止 dlclose**(检视2):升级路径返回失败保留旧库、组件空闲后下次升级自动重试,销毁路径跳过卸载(退出泄漏无害);升级 drain 超时 15s 覆盖正常 hbmtester 时长(--run -t 8≈8s),销毁 5s 约束退出延迟;Destroy 顺序修正为先 ServerRelease 再 drain 再 dlclose | | G16-A1 | hbm_detect.c 仅校验 24 字节头即解引用 2080 字节结构;num 无上限致 info[128] 越界读并注入命令行 | len 校验补全 sizeof(LogDataMsg)+sizeof(AmlHbmDetectInfo);num > MAX_NUM_OF_ADDR 拒绝 | | G14B-01 | log_get_file.cpp logType 构造依赖 NUL 终止,协议不保证致堆越界读 | 以 strnlen(proto->data, proto->sliceLen) 限定(adcore 框架已校验 sliceLen 与实际收包长度一致) | | G19B-B1 | msg_queue.c isWait 语义与文档相反:slogd 反馈线程实际阻塞 msgsnd,队列满时调级线程永久挂死 | 语义对齐文档 (isWait==true)?0:IPC_NOWAIT;同步调整 4 处调用点保持现网行为,:597 即修复挂死点 | | G11B-01 | slogd_flush.c LogMalloc 失败不 return,NULL 贯穿回调链;eventlog 回调无判空在 NULL 上写 msg->magic 致 SIGSEGV | malloc 失败即 return;线程退出 flush 前判空;SlogdEventlogFlush 入口补判空(对齐 sys/app 回调) | | G11B-02 | log_session_manage.c HandleDeletedSessionNode 无锁裸写全局删除链:并发 Push 节点被抹掉(内存+HDC 句柄泄漏)或链入私有链后被 XFREE;并发 Get 拿到即将释放节点(UAF) | 新增 g_sessionProcessingNode 锁内发布/撤销;GetDeletedSessionNode 额外搜索该指针;SendDataToSessionNode 锁内快照 session 句柄后解锁再发送(节点指针不逃逸临界区) | | G12B-01 | file_monitor 三个监控(bbox/device_app/stackcore)丢弃延迟事件 handle,Stop 释放 argList 后 10-60s 延迟回调仍解引用已释放 arg(UAF) | **取消标记 + 回调自清理**(检视4 终态):arg 以 cancelled 标记取代 handle 保存——Stop 在 argListLock 内标记全部在途 arg、不删除任何事件(对悬垂 handle 调 EventDelete 存在地址复用误删新事件的 ABA,已放弃该方案);延迟回调入口检查标记后自摘自释;Exit 路径(事件线程已 join)统一释放 argList;顺带修复 DeviceAppFileSyncProc 早退不摘链存量泄漏。Start 路径全量重扫保证 Stop 取消的延迟同步无数据丢失 | ### 误报判定(2 项,附代码依据,未改代码) - **G14B-04**(log_process_util.cpp:97 ret != EN_ERR):本仓 mmWaitPid(src/mmpa/src/mmpa_linux.c:969)契约为"进程结束返回 EN_ERR(1)、错误返回 EN_ERROR(-1)、未结束返回 EN_OK(0)",并非透传 waitpid 的 pid;msprof(utils.cpp:646-657)同样以 EN_ERR 为进程结束成功,交叉印证。 - **BUG-002**(log_hardware_zip.c next_in/next_out):zip_stream 缓冲区由 hw_deflateInit2_ 分配回填(SDK 契约),UT 桩(tests/ut/slog/ut/iam/hardware_zip_stub.c:58-61)在 init 成功时设置两指针,hardware_zip_coverage_utest 5/5 通过佐证契约成立;软件版显式设置属 zlib 不同契约,不构成反证。 ### 测试侧附带修复(最小改动,解除存量验证阻断) - file_dump_func_utest.cc:MakeFileRequest 补设 sliceLen,使 MsgProto 构造符合生产契约(adcore 框架始终校验并传递 sliceLen) - log_daemon_stub.c:补 AdxWaitComponentDrained UT 桩 - log_level_stub.c:24:open(O_CREAT) 补第三参 mode(存量 fortify 编译错误) ### 检视 round=1 处理(提交 76576dc99) | 检视意见 | 处置 | |---|---| | 【致命】HBM detached 监控线程逃逸组件排空 | **已修改**:joinable + OperateDetect 全路径返回前 join + 修 popen 失败不置 WAIT_EXIT | | 【致命】排空超时后仍然 dlclose | **已修改**:超时禁止 dlclose(升级失败保留旧库自愈重试/销毁跳过卸载);升级超时 15s/销毁 5s | | 【严重】EventHandle 快照 ABA 复用误删新事件 | **已修改**(替代方案):放弃对悬垂 handle 的 EventDelete,改取消标记+回调自清理,构造性消除 ABA;框架接口零改动(剩余 EventDelete 均为 LOOP 事件属主自用,LOOP 节点不自删无 ABA 面) | | 【严重】session 快照未延长生命周期 | **确认为真实存量竞态,超出本 PR 范围,独立 issue 跟进**:该竞态不在 issue #1067 白盒扫描清单内(G11B-02 扫描项为节点内存 UAF,已由快照协议修复闭环);曾按 round-2 检视实现写者计数协议(e38b49eca),后按范围管理回退(671fca8a),已验证的修复设计与竞态 UT 归档于 issue #1255(回退提交 671fca8a5) | ## 变更类型 <!-- [x] 表示选中 --> - [x] Bug修复 - [ ] 新特性 - [ ] 性能优化 - [ ] 文档更新 - [ ] 其他,请描述: ## 关联的Issue https://gitcode.com/cann/runtime/issues/1067 ## 如何测试 - 测试结论: **PASS**(无 NPU 设备环境,以全量构建 + 相关 UT 子集 + 存量基线对照为证据;检视补强后在最终提交 76576dc99 上复验) | 验证项 | 结果 | |---|---| | 全量包构建 bash build.sh --pkg -j16(含全部生产代码改动) | build success,0 编译错误 | | ep_log_daemon_utest 相关套件(file_dump/config_cmd/hbm_detect×2/event_process/file_monitor/sys_monitor×2/cpu_detect,覆盖全部修改文件;含 hbm_detect 真实线程创建/join 路径与 file_monitor 停止/退出路径) | **115/115 PASSED**(检视补强后复验) | | log_slogd_utest 可运行子集(覆盖 msg_queue.c 及调用链) | **65/65 PASSED** | | iam_slog_utest / hardware_zip_coverage_utest | **5/5 + 5/5 PASSED**(后者为 BUG-002 契约验证) | | pre-commit 门禁(两轮,clang-format 自动修复已保留并复验) | **PASS** | **存量问题基线对照**(git stash 生产代码后纯净基线重编译运行,以下问题在基线上完全相同,与本 PR 改动无关):LIB_LOAD_EXCP_UTEST 4 例失败(依赖环境路径 /usr/lib64/device-compat-plugin/-1/*.so 缺失)、LogDaemonMainInvalidHanlde/LogDaemonMain(server_mgr 测试流)、ep_slogd_utest 首用例段错误(log_path_mgr 链)、log_slogd_utest ADX_LOG_HDC_TEST.Process 挂起。 ## 核对清单 <!-- [x] 表示选中 --> - [x] 我的代码遵循了项目的代码风格 - [x] 我已对代码进行了自测 - [ ] 我已更新了相关的文档 - [x] 我在标题中使用了合适的类型标签(如:feat:, fix:) - [x] 我已经详细阅读了贡献指南(CONTRIBUTING.md),并遵守了其中的所有规定,包括但不限于commit message的格式、无效commit的合并等 ## 其他信息 - G19B-B1 修复后行为变化矩阵:仅 slogd 反馈发送(slogd_dynamic_level.c:597)按预期从阻塞变为非阻塞(即 Critical 挂死修复点);其余 4 处调用点经参数调整后行为与修复前完全一致。 - 检视2 采纳后的行为变化:升级与长时间检测并发时升级返回失败(此前"成功"但伴随 UAF 崩溃风险),主机侧重试即可在检测结束后成功;销毁路径超时跳过 dlclose(退出时泄漏映射,无功能影响)。 - 每个修改文件保持了其原有行尾风格(部分文件在仓内本就以 CRLF 存储,与上游提交惯例一致)。 ## 风险和遗留问题 - G12B-01 取消标记方案的代价:Stop 后在途 arg 最长残留一个延迟周期(10-60s)由回调有界自清理(Start 全量重扫保证无数据丢失)。 - G16B-BUG-4 升级 drain 超时(15s)期间持有 g_libLoadMutex 与 ServerRegister 注册锁,并发注册/升级请求最多排队 15s(运行期无并发注册方,无死锁)。 - ep_slogd_utest 因存量首用例段错误无法在本环境执行,slogd_flush/slogd_eventlog/log_session_manage 修改以编译通过 + 代码走查 + 基线对照为证据。 - session 写-释放竞态(检视3)为存量问题,本次修复将其从节点内存 UAF 收窄为句柄值一层;完整闭合方案(已验证)在独立 issue #1255 跟进。 See merge request: cann/runtime!5422 | 2 天前 |
| 文件 | 最后提交记录 | 最后更新时间 |
|---|---|---|
| 2 个月前 | ||
| 2 个月前 | ||
| 2 个月前 | ||
| 2 天前 | ||
| 2 天前 | ||
| 2 天前 | ||
| 2 天前 | ||
| 2 天前 |