CANN ops-nn 算子库安全声明解读:权限最小化、文件管控与构建运行安全实践
【免费下载链接】ops-nn本项目是CANN提供的神经网络类计算算子库,实现网络在NPU上加速计算。项目地址: https://gitcode.com/cann/ops-nn
CANN ops-nn 是 CANN 提供的神经网络类计算算子库,用于在 NPU 上加速各类网络计算。本文基于仓库根目录的 SECURITY.md 安全声明,系统梳理该算子库在运行用户选择、文件权限控制、源码构建、算子运行及依赖下载等环节的安全要求,并结合 install_deps.sh、cmake/package.cmake 等仓库文件给出源码级佐证。读完本文,你将掌握在开发、编译、运行 CANN ops-nn 算子时应当遵循的安全基线,包括 umask 设置、目录与文件权限上限、异常场景的定位方法,以及对外部编译依赖的审计方式。
一、运行用户建议:坚持权限最小化原则
SECURITY.md 开篇即给出第一条安全基线:不建议使用 root 等管理员类型账户执行任何命令,应遵循权限最小化原则。
这条建议适用于 CANN ops-nn 使用过程中的所有环节:
- 环境准备:安装编译依赖、配置 CMake 构建环境时,避免以 root 身份执行安装脚本;
- 源码编译:编译算子时生成的中间文件、产物文件若由管理员账户创建,其默认权限往往过高,容易成为提权与信息泄露的入口;
- 算子调用:编写和执行算子调用脚本时,同样建议使用普通业务账户。
权限最小化的核心思想是"够用即可"——进程只拥有完成自身任务所需的最小权限,从而缩小攻击面。例如仓库根目录下的 install_deps.sh(约 632 行的依赖安装脚本)会执行apt、gcc工具链配置等敏感操作,这类脚本尤其应当在受控的普通账户或专用的构建环境中运行,而非直接使用 root。
二、文件权限控制:umask 与分场景权限上限
2.1 设置 umask 值为 0027 及以上
SECURITY.md 建议用户在主机(包括宿主机)及容器中,将运行系统的 umask 值设置为0027 及以上,从而保证:
- 新增文件夹的默认最高权限为750(rwxr-x---);
- 新增文件的默认最高权限为640(rw-r-----)。
umask 表示创建文件时"扣减"的权限位。umask 0027意味着新建目录不会带出 group 写权限、other 全部权限,新建文件不会带出 group 写权限和 other 全部权限,确保新增内容默认对同组只读、对其他用户不可见。该设置在宿主机与容器内均需生效,避免容器与宿主机之间因权限差异导致敏感文件意外可读。
2.2 敏感内容的权限管控
以下敏感内容都需要做好权限控制:
- 个人隐私数据;
- 商业资产;
- 源文件;
- 算子开发过程中保存的各类文件(如
op_host、op_kernel、tests目录下的源码与测试文件); - 本项目安装目录;
- 输入公共数据文件。
以上各类文件的权限上限可参考下文附录 A 的"文件(夹)各场景权限管控推荐最大值"表。
2.3 kernel_meta_* 算子编译缓存
算子运行时可能会缓存算子编译文件,存放在运行目录下的kernel_meta_*文件夹内,用于加快后续算子的调用速度。该目录中保存的是算子 kernel 的编译产物,可能包含反编译后可读取的实现细节,因此用户应根据需要,对生成后的相关文件自行做好权限控制,防止被未授权用户读取。
三、构建安全声明:源码编译后的中间文件管控
CANN ops-nn 采用源码编译安装方式,用户在编译过程中会生成大量中间文件。SECURITY.md 明确要求:编译完成后,对中间文件做好权限控制,以保证文件安全。
从仓库的构建体系可以印证这一要求背后的必要性:
- cmake/package.cmake 中通过
add_cann_third_party(makeself-fetch)拉取打包工具 makeself; - cmake/func.cmake 与 cmake/modules/Findaicpu.cmake 引用 eigen 等第三方库;
- 构建过程会经由 scripts/opgen、cmake/gen_ops_info.cmake 等环节生成算子二进制、
ops-info配置文件等产物。
这些中间文件分布在构建目录、kernel_meta_*缓存目录以及第三方依赖解压目录中,建议在编译完成后:
- 检查构建目录(如
build、out等)中产物的属主与权限; - 对包含算子实现信息的中间产物按 640/750 上限收紧权限;
- 定期清理不再需要的临时编译文件。
四、运行安全声明:资源匹配、异常定位与版本匹配
4.1 算子调用脚本与运行资源匹配
建议用户结合运行环境资源状况编写算子调用脚本。若脚本与资源状况不匹配,可能引发错误并导致进程意外退出,典型场景包括:
- 生成输入数据或标杆(benchmark)计算结果时,申请空间超出内存容量限制;
- 脚本在本地保存数据超过磁盘空间大小。
因此在编写用例时,应预估输入张量、中间结果及输出结果的内存占用,并结合 NPU 可用显存与宿主机可用内存合理设置数据规模。
4.2 算子运行异常时的定位方法
算子在运行异常时会退出进程并打印报错信息,建议根据报错提示定位具体错误原因,常用手段包括:
- 设定算子同步执行,将异步错误转为同步可捕获的错误,便于获取完整调用栈;
- 查看日志文件,结合报错码与日志时间线确认失败环节;
- 结合算子自身实现(如 activation/relu/op_kernel、op_host 中的 tiling 与 kernel 代码)排查输入 shape、数据类型与约束条件是否满足。
4.3 PyTorch 调用场景的版本匹配
算子通过 PyTorch 方式调用时,可能会因为版本不匹配导致运行错误。具体可参考 PyTorch 的安全声明(见 gitee.com/ascend/pytorch 中"安全声明"章节)。实践中应确保:
- CANN 工具链版本与 PyTorch 适配版本一致;
- 算子库(ops-nn)构建时使用的昇腾软件栈与运行时 NPU 驱动版本匹配;
- 升级任一组件后重新执行算子用例验证兼容性。
五、公网地址声明:编译依赖来源审计
SECURITY.md 声明了本项目代码中涉及的公网地址,主要用于编译依赖的获取。下表完整列出(URL 以纯文本呈现,便于审计核对):
| 类型 | 开源代码地址 | 文件名 | 公网IP地址/公网URL地址/域名/邮箱地址/压缩文件地址 | 用途说明 |
|---|---|---|---|---|
| 依赖 | 不涉及 | cmake/third_party/makeself-fetch.cmake | https://gitcode.com/cann-src-third-party/makeself/releases/download/release-2.5.0-patch1.0/makeself-release-2.5.0-patch1.tar.gz | 从gitcode下载makeself源码,作用编译依赖 |
| 依赖 | 不涉及 | cmake/third_party/nlohmann_json.cmake | https://gitcode.com/cann-src-third-party/json/releases/download/v3.11.3/include.zip | 从gitcode下载json源码,作用编译依赖 |
| 依赖 | 不涉及 | cmake/third_party/gtest.cmake | https://gitcode.com/cann-src-third-party/googletest/releases/download/v1.14.0/googletest-1.14.0.tar.gz | 从gitcode下载googletest源码,作用编译依赖 |
| 依赖 | 不涉及 | cmake/third_party/eigen.cmake | https://gitcode.com/cann-src-third-party/eigen/releases/download/5.0.0-h0.trunk/eigen-5.0.0.tar.gz | 从gitcode下载eigen源码,作用编译依赖 |
| 依赖 | 不涉及 | ops-nn/install_deps.sh | https://apt.kitware.com/keys/kitware-archive-latest.asc | 从apt.kitware.com下载Kitware签名密钥,作用编译依赖 |
| 依赖 | 不涉及 | ops-nn/install_deps.sh | https://apt.kitware.com/ubuntu/ | 从apt.kitware.com下载Kitware签名密钥,作用编译依赖 |
| 依赖 | 不涉及 | cmake | https://apt.kitware.com/keys/kitware-archive-latest.asc | 从kitware下载cmake软件,作用编译依赖 |
| 依赖 | 不涉及 | cmake | https://apt.kitware.com/ubuntu/ | 从kitware下载cmake软件,作用编译依赖 |
对上述依赖的源码级印证:
- makeself 依赖:构建打包流程在 cmake/package.cmake 中通过
add_cann_third_party(makeself-fetch)触发下载; - nlohmann_json 依赖:JSON 解析贯穿算子配置与 ops-info 生成流程,cmake/gen_ops_info.cmake 中大量使用
*_binary.json、ops-info.json等配置文件的解析与生成,cmake/func.cmake 中add_dependencies(${OPHOST_NAME}_tiling_obj json)明确声明了对 json 库的编译依赖; - gtest 依赖:仓库 tests/ut 目录包含大量 C++ 单测用例,gtest 作为单元测试框架被引入;
- eigen 依赖:cmake/func.cmake 与 cmake/modules/Findaicpu.cmake 中可见
${CANN_3RD_LIB_PATH}/eigen的引用; - Kitware 依赖:仓库根目录 install_deps.sh 承担 CMake 等编译依赖的安装,其中涉及 apt 源配置与 Kitware 签名密钥导入。
安全提示:在受控网络环境中编译时,可结合该表对构建期网络访问做白名单管控,并对下载产物做校验与归档,防止供应链投毒风险。
六、漏洞机制说明
若在 CANN ops-nn 使用过程中发现安全漏洞,可遵循 CANN 社区统一的漏洞管理机制进行上报与处置(漏洞管理说明见 gitcode.com/cann/community 仓库 security 目录下的 security.md)。建议关注安全公告与补丁发布节奏,及时将算子库升级到修复版本。
七、附录:文件(夹)各场景权限管控推荐最大值
下表为 SECURITY.md 附录给出的完整权限参考表,适用于算子开发、安装、运行过程中各类文件与目录的权限设置:
| 类型 | Linux权限参考最大值 |
|---|---|
| 用户主目录 | 750(rwxr-x---) |
| 程序文件(含脚本文件、库文件等) | 550(r-xr-x---) |
| 程序文件目录 | 550(r-xr-x---) |
| 配置文件 | 640(rw-r-----) |
| 配置文件目录 | 750(rwxr-x---) |
| 日志文件(记录完毕或者已经归档) | 440(r--r-----) |
| 日志文件(正在记录) | 640(rw-r-----) |
| 日志文件目录 | 750(rwxr-x---) |
| Debug文件 | 640(rw-r-----) |
| Debug文件目录 | 750(rwxr-x---) |
| 临时文件目录 | 750(rwxr-x---) |
| 维护升级文件目录 | 770(rwxrwx---) |
| 业务数据文件 | 640(rw-r-----) |
| 业务数据文件目录 | 750(rwxr-x---) |
| 密钥组件、私钥、证书、密文文件目录 | 700(rwx------) |
| 密钥组件、私钥、证书、加密密文 | 600(rw-------) |
| 加解密接口、加解密脚本 | 500(r-x------) |
使用要点:
- 权限数值为"最大值"而非强制值,实际设置可根据业务场景进一步收紧;
- 涉及密钥、证书、密文的内容一律使用 600/700 级别的私有权限,仅属主可读写;
- 日志归档后可降级为 440(只读),既保留审计需要又避免被篡改;
- 程序文件采用 550 只读可执行权限,防止运行期被意外改写。
总结
CANN ops-nn 的安全基线可以概括为三条主线:最小权限运行(不推荐 root 执行命令)、精细化文件管控(umask 0027 起步、按场景设置权限上限、管控kernel_meta_*编译缓存)、全链路安全声明(构建中间文件、运行资源与异常定位、PyTorch 版本匹配、公网依赖审计)。在部署与开发过程中,将 SECURITY.md 中的权限表和依赖清单纳入日常安全检查项,即可显著降低因权限过大、依赖失控或资源不匹配带来的安全与稳定性风险。
【免费下载链接】ops-nn本项目是CANN提供的神经网络类计算算子库,实现网络在NPU上加速计算。项目地址: https://gitcode.com/cann/ops-nn
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考