安全Checklist
更新时间: 2026/02/09
在Gitcode上查看源码

安全Checklist

大类序号规则简述规则说明
资源申请与释放1-1全局资源的申请与释放需要加锁保护全局资源申请与释放操作不加锁保护时,并发调用可能出现内存覆盖、野指针访问或者double free等问题,从而导致进程coredump
指针2-1函数定义时,对于只读入参或只读返回值指针,需要加const限制增加const限制可以避免调用者误修改指针指向内容或者误释放指针
2-2非local函数指针参数必须判空,特别是指针参数传入strlen()、json_object_new_string()等函数时非local函数进行指针判空可避免调用者传入空指针时出现空指针解引用,例如空指针传入strlen等函数会导致进程coredump
安全函数3-1使用sscanf_s、fscanf_s等函数时,格式化描述符必须与接收参数类型相匹配格式化描述符与接收参数类型不匹配时会出现内存越界写,导致出现非预期现象。由于这两个函数定义跟标准库函数不一样,因此无法使用GCC编译选项实现自动检查
文件操作4-1创建文件或目录之后,需显式修改文件或目录的权限遵循最小权限原则,及时修改文件权限,避免因权限过大存在安全风险
4-2对于路径外部可控的文件进行任何操作前必须校验路径是否合法在文件的创建、删除、读写、复制、移动、修改权限或属主等操作之前,必须先进行路径标准化并校验路径是否在预期的目录下,否则容易造成提权、任意文件读写、任意文件删除、信息泄露等安全风险
4-3读写一个文件之前,如果明确所操作对象不应该是软链接时,需先校验操作对象是否为软链接防止操作对象被替换成软链接时,造成任意文件的读写
4-4解压缩包操作需要进行完备的校验,防止zip炸弹解压前需判断压缩包路径是否为软链接、压缩包文件大小、压缩包内被压缩的文件总数、解压后的文件总大小、压缩包内压缩文件名是否包含../等造成目录跨越的字符;解压后需判断已解压的文件中是否包含软链接
4-5使用外部导入的文件之前,需判断文件属主是否与执行导入操作的用户一致安全要求,可以避免低权限用户使用高权限用户上传的文件
4-6高权限用户严禁执行低权限用户可修改的shell脚本可以防止低权限用户脚本被篡改或控制时,发生提权
RPC通信5-1低权限进程通过代理方法来使高权限进程执行某种操作时,必须对操作对象和操作方法进行白名单限制例如低权限进程调用代理方法,让高权限进程删除文件时,应该限定允许删除的文件路径白名单,否则低权限进程存在缺陷时,可以通过调用这个RPC方法实现任意文件删除,造成严重的安全问题。
5-2APP之间的RPC调用严禁出现循环调用RPC循环调用在并发时容易导致相关APP出现死锁,而且循环调用也是APP间依赖关系混乱,在设计上应该避免
敏感信息6-1APP新增敏感信息使用,应当在加密存储敏感信息包括但不限于:BMC用户密码、会话token、包含密码的远程文件传输URL、包含密码的虚拟媒体挂载地址、SMTP登录密码、SNMP团体名、SNMP加密密码、NTP组秘钥、证书私钥、证书加密密码、加密密钥(包括根密钥、主密钥和工作密钥)、Redfish事件订阅请求头、VNC密码、BIOS密码、LDAP绑定密码、KVM加密密钥、SSH Host key
6-2敏感信息明文严禁泄露泄露行为包括:打印到日志、在接口响应体或错误消息中明文返回、在Web UI界面上(包括命令行和Web)明文显示、明文存储到文件系统(含内存文件系统)
外部输入校验7-1公共函数中严禁日志打印可能是外部输入的参数取值公共函数打印外部输入参数,容易造成信息泄露风险,且代码排查时难以识别
7-2对于外部输入进行直接校验,不要二次计算后的结果进行间接校验对外部输入的运算结果进行校验容易出现整数翻转或整数溢出截断,造成安全风险

安全编码规则

密码算法和使用

禁止使用私有加密算法或弱加密算法

  1. 私有算法最典型的是Base64,可按base64搜索。
  2. 弱加解密算法,可按如下字符串搜索: MD5,DES, 3DES HMAC***96,HMAC***MD5 SSH服务中CBC DH512/DH1024/SKIPJACK/RC2/RSA(1024位及以下)/MD2/MD4 AES*CBC,AES*ECB SM1、SM7
  3. 算法或密钥长度要求: AES (若长度小于128 bits则为弱算法,应避免使用) RSA (若长度小于3072 bits则为弱算法,应避免使用) DH/DHE(若长度小于3072 bits则为弱算法,应避免使用) ECDH/ECDHE(若长度小于256 bits则为弱算法,应避免使用) 哈希算法(必须使用SHA256及以上)

禁止算法中的盐值固定

盐值Salt为密码学意义上的安全随机数,由系统随机生成,盐值salt至少16字节,并按用户区分。

身份管理

禁止口令硬编码

  1. 禁止存在无法修改的认证凭据(如:进程二进制中硬编码口令)
  2. 产品发布的软件包或固件(不含镜像包)中,禁止包含用于认证的密钥,包括公钥、私钥、对称密钥、MAC密钥等(如:调试使用的SSH服务公钥authorized_key),不包括加密类密钥;

日志审计

所有对系统产生影响的用户活动、操作指令必须记录日志,日志内容要能支撑事后的审计,记录包括用户ID、时间、事件类型、被访问资源的名称、访问发起端地址或标识、访问结果等。

  • 用户活动包括:
    1. 登录和注销;
    2. 增加和删除用户,变更用户属性(账号名、口令等);
    3. 用户的锁定和解锁,禁用和恢复;
    4. 角色权限变更;
    5. 系统相关安全配置(如安全日志内容配置)的变更;
    6. 重要资源的变更,如某个重要文件的删除、修改等。
  • 操作指令包括:
    1. 对系统配置参数的修改;
    2. 对系统进行启动、关闭、重启、暂停、恢复、倒换;
    3. 对业务的加载、卸载;
    4. 软件的升级操作,包括远程升级和本地升级;
    5. 对业务数据的创建、删除、修改;
    6. 所有非查询操作命令。

敏感信息保护

内存明文敏感信息

认证凭据(口令/私钥/命令行口令)使用完后,应立即清除内存中的认证凭据。

敏感信息明文存储

禁止认证凭据(口令/私钥/命令行口令/sessionid/token)不允许明文存储在系统中,应该加密保护。

禁止打印敏感信息

禁止在日志、页面、URL、调试信息、告警、提示信息中明文打印认证凭据(明文或密文口令/私钥/sessionid/token)。