已关闭
[Requirement|需求建议]: 构建系统安全加固防止shell注入 #391
LIXIN133创建于 5月6日关闭于 5月26日
5月7日 将 yangbinhua 设为负责人
5月7日 将 zhou-qilong 设为负责人
liu-wei
5月18日 评论:
5月18日 评论:
liu-wei
5月23日 评论:
5月23日 评论:
关联 PR: https://gitcode.com/cann/ops-cv/pull/884
该 PR 修复了 build 脚本中的 shell 命令调用安全问题,包括变量加引号、移除不必要的 bash -c、以及修复 install.sh 中的 $0rn typo。


5月26日 关闭了 issue
5月26日 添加了label:resolved
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)/proc/cpuinfo、sed -i(macOS 不兼容)等Origin(信息来源)
北航学生,基于静态代码分析得到
Benefit / Necessity (价值/作用)
Design(设计方案)
分三个阶段逐步修复,每个阶段独立可验证。
阶段一:消除
bash -c命令注入风险将
execute_process/add_custom_target中通过bash -c拼接变量的调用,改为直接传参数列表。execute_process底层走execvp,不经过 shell 解释,变量中的空格和元字符不会被拆分或执行。涉及文件及修复方式:
cmake/symbol.cmakebash -c "${cmd}"bash -c,直接传COMMAND python3 arg1 arg2 arg3cmake/gen_ops_info.cmakebash -c "find ... -exec cp ..."COMMAND ${CMAKE_COMMAND} -E copy_directorycmake/gen_ops_info.cmakebash -c "cp -r ..."COMMAND ${CMAKE_COMMAND} -E copy_directorycmake/gen_ops_info.cmakebash -c "find ... -exec grep ..."file(GLOB)+file(STRINGS ... REGEX)cmake/ut.cmakebash -c ${gen_cmd}COMMAND bash script.sh arg1 arg2 arg3验证方式:在含空格的路径下执行完整构建流程,确认不再报错。
阶段二:Shell 脚本变量引用加固
修复
build.sh及安装脚本中的未引用变量,防止路径含空格或变量为空时出现意外行为。build.shcat $CHANGED_FILEScat "$CHANGED_FILES"build.shpython3 ... $CHANGED_FILESpython3 ... "$CHANGED_FILES"build.shrm -rf ${BUILD_PATH}/*[ -d "${BUILD_PATH}" ] && rm -rf "${BUILD_PATH}"/*build.sh${remove_opc_cmd}间接执行scripts/custom/install.shelif [ "$0rn" = r ]逻辑死代码:$0是脚本路径,"$0rn"永远不等于r,该分支永远不会进入"$orn"(read读入的变量)scripts/custom/install.shrm -rf "${targetdir}/$vendordir/$1/"*未引用$1$1加引号验证方式:路径含空格环境下跑
build.sh完整流程;空变量场景下确认rm -rf不会误删。阶段三:第三方下载启用完整性校验
为 CMake 中下载的第三方依赖启用 TLS 校验和哈希校验。
cmake/third_party/gtest.cmakeTLS_VERIFY OFFTLS_VERIFY ONcmake/third_party/eigen.cmakeTLS_VERIFY OFFTLS_VERIFY ONcmake/third_party/json.cmakefile(DOWNLOAD ... TLS_VERIFY OFF)TLS_VERIFY ON,增加EXPECTED_HASHcmake/third_party/makeself-fetch.cmake-E env参数验证方式:清空第三方缓存后重新构建,确认下载成功且 TLS 校验通过。