安全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-2 | APP之间的RPC调用严禁出现循环调用 | RPC循环调用在并发时容易导致相关APP出现死锁,而且循环调用也是APP间依赖关系混乱,在设计上应该避免 | |
| 敏感信息 | 6-1 | APP新增敏感信息使用,应当在加密存储 | 敏感信息包括但不限于:BMC用户密码、会话token、包含密码的远程文件传输URL、包含密码的虚拟媒体挂载地址、SMTP登录密码、SNMP团体名、SNMP加密密码、NTP组秘钥、证书私钥、证书加密密码、加密密钥(包括根密钥、主密钥和工作密钥)、Redfish事件订阅请求头、VNC密码、BIOS密码、LDAP绑定密码、KVM加密密钥、SSH Host key |
| 6-2 | 敏感信息明文严禁泄露 | 泄露行为包括:打印到日志、在接口响应体或错误消息中明文返回、在Web UI界面上(包括命令行和Web)明文显示、明文存储到文件系统(含内存文件系统) | |
| 外部输入校验 | 7-1 | 公共函数中严禁日志打印可能是外部输入的参数取值 | 公共函数打印外部输入参数,容易造成信息泄露风险,且代码排查时难以识别 |
| 7-2 | 对于外部输入进行直接校验,不要二次计算后的结果进行间接校验 | 对外部输入的运算结果进行校验容易出现整数翻转或整数溢出截断,造成安全风险 |
安全编码规则
密码算法和使用
禁止使用私有加密算法或弱加密算法
- 私有算法最典型的是Base64,可按base64搜索。
- 弱加解密算法,可按如下字符串搜索: MD5,DES, 3DES HMAC***96,HMAC***MD5 SSH服务中CBC DH512/DH1024/SKIPJACK/RC2/RSA(1024位及以下)/MD2/MD4 AES*CBC,AES*ECB SM1、SM7
- 算法或密钥长度要求: AES (若长度小于128 bits则为弱算法,应避免使用) RSA (若长度小于3072 bits则为弱算法,应避免使用) DH/DHE(若长度小于3072 bits则为弱算法,应避免使用) ECDH/ECDHE(若长度小于256 bits则为弱算法,应避免使用) 哈希算法(必须使用SHA256及以上)
禁止算法中的盐值固定
盐值Salt为密码学意义上的安全随机数,由系统随机生成,盐值salt至少16字节,并按用户区分。
身份管理
禁止口令硬编码
- 禁止存在无法修改的认证凭据(如:进程二进制中硬编码口令)
- 产品发布的软件包或固件(不含镜像包)中,禁止包含用于认证的密钥,包括公钥、私钥、对称密钥、MAC密钥等(如:调试使用的SSH服务公钥authorized_key),不包括加密类密钥;
日志审计
所有对系统产生影响的用户活动、操作指令必须记录日志,日志内容要能支撑事后的审计,记录包括用户ID、时间、事件类型、被访问资源的名称、访问发起端地址或标识、访问结果等。
- 用户活动包括:
- 登录和注销;
- 增加和删除用户,变更用户属性(账号名、口令等);
- 用户的锁定和解锁,禁用和恢复;
- 角色权限变更;
- 系统相关安全配置(如安全日志内容配置)的变更;
- 重要资源的变更,如某个重要文件的删除、修改等。
- 操作指令包括:
- 对系统配置参数的修改;
- 对系统进行启动、关闭、重启、暂停、恢复、倒换;
- 对业务的加载、卸载;
- 软件的升级操作,包括远程升级和本地升级;
- 对业务数据的创建、删除、修改;
- 所有非查询操作命令。
敏感信息保护
内存明文敏感信息
认证凭据(口令/私钥/命令行口令)使用完后,应立即清除内存中的认证凭据。
敏感信息明文存储
禁止认证凭据(口令/私钥/命令行口令/sessionid/token)不允许明文存储在系统中,应该加密保护。
禁止打印敏感信息
禁止在日志、页面、URL、调试信息、告警、提示信息中明文打印认证凭据(明文或密文口令/私钥/sessionid/token)。