已关闭
[Requirement|需求建议]: 构建系统安全加固防止shell注入 #391
LIXIN133创建于  5月6日关闭于  5月26日
LIXIN133
5月6日 创建

Thanks for sending an requirement! Please fill in the following template to help quickly solve your problem.

Backgroud(背景信息)

背景信息

当前构建系统(CMake 脚本 + Shell 脚本)中存在多处 bash -c 拼接变量、未引用变量、第三方下载关闭 TLS 校验等问题。这些问题在实际使用中表现为:

  • 构建路径含空格时必然失败(如 /home/user/my project/ops-cv
  • 存在 Shell 注入风险:CMake 变量中的元字符被 shell 解释
  • 第三方依赖下载无完整性校验:TLS 验证被显式关闭,存在中间人攻击风险
  • 跨平台兼容性差:硬编码 /proc/cpuinfosed -i(macOS 不兼容)等

Origin(信息来源)

北航学生,基于静态代码分析得到

Benefit / Necessity (价值/作用)

  1. 修复真实 bug:含空格的构建路径是常见场景(尤其 Windows WSL、macOS),当前必然构建失败
  2. 消除安全隐患:消除构建阶段的命令注入面和供应链攻击面
  3. 提升跨平台支持:为未来的 macOS/Windows 构建兼容打基础
  4. 提升 CI 可靠性:减少因脚本问题导致的 CI 不稳定

Design(设计方案)

分三个阶段逐步修复,每个阶段独立可验证。

阶段一:消除 bash -c 命令注入风险

execute_process / add_custom_target 中通过 bash -c 拼接变量的调用,改为直接传参数列表。execute_process 底层走 execvp,不经过 shell 解释,变量中的空格和元字符不会被拆分或执行。

涉及文件及修复方式:

文件 行号 当前写法 修复方式
cmake/symbol.cmake 346-350 bash -c "${cmd}" 去掉 bash -c,直接传 COMMAND python3 arg1 arg2 arg3
cmake/gen_ops_info.cmake 33 bash -c "find ... -exec cp ..." 拆为 COMMAND ${CMAKE_COMMAND} -E copy_directory
cmake/gen_ops_info.cmake 49, 51 bash -c "cp -r ..." 改为 COMMAND ${CMAKE_COMMAND} -E copy_directory
cmake/gen_ops_info.cmake 542 bash -c "find ... -exec grep ..." 改为 file(GLOB) + file(STRINGS ... REGEX)
cmake/ut.cmake 424 bash -c ${gen_cmd} 改为 COMMAND bash script.sh arg1 arg2 arg3

验证方式:在含空格的路径下执行完整构建流程,确认不再报错。

阶段二:Shell 脚本变量引用加固

修复 build.sh 及安装脚本中的未引用变量,防止路径含空格或变量为空时出现意外行为。

文件 行号 问题 修复
build.sh 976 cat $CHANGED_FILES cat "$CHANGED_FILES"
build.sh 979, 995 python3 ... $CHANGED_FILES python3 ... "$CHANGED_FILES"
build.sh 1169, 1176 rm -rf ${BUILD_PATH}/* 加空值守卫:[ -d "${BUILD_PATH}" ] && rm -rf "${BUILD_PATH}"/*
build.sh 1288 ${remove_opc_cmd} 间接执行 改为直接命令调用
scripts/custom/install.sh 129 elif [ "$0rn" = r ] 逻辑死代码:$0 是脚本路径,"$0rn" 永远不等于 r,该分支永远不会进入 改为 "$orn"read 读入的变量)
scripts/custom/install.sh 130 rm -rf "${targetdir}/$vendordir/$1/"* 未引用 $1 $1 加引号

验证方式:路径含空格环境下跑 build.sh 完整流程;空变量场景下确认 rm -rf 不会误删。

阶段三:第三方下载启用完整性校验

为 CMake 中下载的第三方依赖启用 TLS 校验和哈希校验。

文件 行号 问题 修复
cmake/third_party/gtest.cmake 94 TLS_VERIFY OFF 改为 TLS_VERIFY ON
cmake/third_party/eigen.cmake 44 TLS_VERIFY OFF 改为 TLS_VERIFY ON
cmake/third_party/json.cmake 60 file(DOWNLOAD ... TLS_VERIFY OFF) 改为 TLS_VERIFY ON,增加 EXPECTED_HASH
cmake/third_party/makeself-fetch.cmake 48-55 残留无效 -E env 参数 清理并启用 TLS

验证方式:清空第三方缓存后重新构建,确认下载成功且 TLS 校验通过。


likedislike
liu-weiliu-wei成员
5月7日 将 yangbinhua 设为负责人
liu-weiliu-wei成员
5月7日 将 zhou-qilong 设为负责人
liu-wei
liu-wei成员
5月18日 评论:
likedislike
liu-wei
liu-wei成员
5月23日 评论:

关联 PR: https://gitcode.com/cann/ops-cv/pull/884

该 PR 修复了 build 脚本中的 shell 命令调用安全问题,包括变量加引号、移除不必要的 bash -c、以及修复 install.sh 中的 $0rn typo。

likedislike
CANN-robotCANN-robot成员
5月26日 关闭了 issue
CANN-robotCANN-robot成员
5月26日 添加了label:resolved