Scorecard
定义:基于 OpenSSF Scorecard 的开源项目安全评估指标,用于评估项目的安全性和最佳实践遵循情况。
评估模型中的指标
Scorecard 是一个自动化安全工具,用于评估开源项目的安全风险。本评估模型参考 Scorecard Checks 文档 进行实现,通过多个维度的检查来评估项目的安全状况。
二进制制品
- 定义:检查项目中是否包含生成的二进制文件
- 得分范围:0-10
- 权重:10%
- 风险等级:高
- 评分规则:仓库中没有未验证的二进制文件10分,每个未验证的二进制文件扣除1分,最低0分
包含生成的二进制文件会增加用户风险。许多编程语言系统可以从源代码生成可执行文件(如 C/C++ 生成的机器码、Java .class
文件、Python .pyc
文件等)。如果源代码仓库中包含可执行文件,用户通常会直接使用这些可执行文件,导致许多危险行为。
分支保护
- 定义:检查默认分支和发布分支是否受到保护
- 得分范围:0-10
- 权重:10%
- 风险等级:高
- 评分规则:默认分支和发布分支都是分支保护10分,其中一个不是分支保护5分,都不是分支保护0分
分支保护允许维护者定义规则来强制执行某些工作流程,例如在合并到主分支前要求审查或通过某些状态检查,或防止重写公共历史。
CI测试
- 定义:检查项目是否在合并 PR 前运行测试
- 得分范围:0-10
- 权重:8%
- 风险等级:低
- 评分规则:(通过CI测试的合并PR数量 / 总合并PR数量)* 10
- 注意:暂不支持
运行测试有助于开发人员及早发现错误,这可以减少进入项目的漏洞数量。
CII最佳实践
- 定义:检查项目是否获得 OpenSSF 最佳实践徽章
- 得分范围:0-10
- 权重:8%
- 风险等级:低
- 评分规则:Gold 10分,Silver 7分,Passing 5分,InProgress 2分,无徽章 0分
OpenSSF 最佳实践徽章表明项目是否使用了一套以安全为重点的开源软件开发最佳实践。
代码审查
- 定义:检查项目是否要求人工代码审查(检查最近30个合入的PR)
- 得分范围:0-10
- 权重:10%
- 风险等级:高
- 评分规则:人工审查数量 / PR数量 * 10,没有PR 0分
审查可以检测各种意外问题,包括可以在合并前立即修复的漏洞,这提高了代码质量。审查还可能检测或阻止试图插入恶意代码的攻击者。
贡献者
- 定义:检查项目是否有来自多个组织的贡献者
- 得分范围:0-10
- 权重:5%
- 风险等级:低
- 评分规则:0个组织 0分,1个组织 3.33分,2个组织 6.67分,3个及以上组织 10分
该检查尝试确定项目最近是否有来自多个组织(如公司)的贡献者。
危险工作流
- 定义:检查workflow工作流是否有危险代码模式
- 得分范围:0-10
- 权重:10%
- 风险等级:严重
- 评分规则:没有发现workflow工作流 不评分,workflow工作流未发现危险模式 10分,发现任何危险模型 0分
该检查确定项目的workflow工作流是否包含危险代码模式。这些模式包括不受信任的代码检出、记录上下文和密钥,或在脚本中使用潜在不受信任的输入。
依赖更新工具
- 定义:检查项目是否使用依赖更新工具
- 得分范围:0-10
- 权重:8%
- 风险等级:高
- 评分规则:检测到任何依赖更新工具或在Git历史中发现依赖更新机器人的提交记录 10分,否则 0分
- 注意:暂不支持
过时的依赖使项目容易受到已知缺陷的攻击。这些工具通过扫描过时或不安全的要求来自动化更新依赖的过程。
模糊测试
- 定义:检查项目是否使用模糊测试
- 得分范围:0-10
- 权重:5%
- 风险等级:中(代码中可能存在漏洞)
- 评分规则:检测到任何一种模糊测试工具 10分,否则 0分
模糊测试是向程序输入意外或随机数据以暴露错误的实践。定期模糊测试对于检测可能被他人利用的漏洞很重要。
许可证
- 定义:检查项目是否发布了许可证
- 得分范围:0-10
- 权重:5%
- 风险等级:低
- 评分规则:没有许可证 0分,有非认可许可证(非FSFOrOSI) 9分,有认可许可证(是FSFOrOSI) 10分,查看是否认可许可证(FSFOrOSI)
许可证可以给用户提供关于源代码如何使用的信息。缺乏许可证将阻碍任何类型的安全审查或审计,并为潜在用户创造法律风险。
维护状态
- 定义:检查项目是否积极维护
- 得分范围:0-10
- 权重:8%
- 风险等级:高
- 评分规则:(过去90天Commit数 + 过去90天Issue创建数)/ 13 * 10
一个不活跃的项目可能没有打补丁,其依赖关系也没有打补丁,或者没有被积极测试和使用。
打包发布
- 定义:检查项目是否发布为包
- 得分范围:0-10
- 权重:5%
- 风险等级:中
- 评分规则:未检测到自动化打包工作流 不评分,检测到打包工作流 10分
包为用户提供了一种通过包管理器下载、安装、更新和卸载软件的简单方法。特别是,它们使用户能够轻松接收安全补丁作为更新。
依赖版本固定
- 定义:检查项目是否固定依赖版本
- 得分范围:0-10
- 权重:8%
- 风险等级:中
- 评分规则:总分 = Σ(已固定数量 × 权重) / Σ(总数量 × 权重)
平台官方Actions权重2(Action名称以 actions/ 或 gitcode/ 开头的被认为是GitCode官方Actions)
三方Actions权重8(不是以 actions/ 或 gitcode/ 开头的GitCode Actions都被认为是第三方Actions)
其他依赖类型权重10(Dockerfile 中的容器镜像,下载后执行的依赖,Go 命令依赖,Chocolatey 包管理器依赖,NPM 包依赖,Python pip 包依赖,NuGet 包依赖等)
"固定依赖"是明确设置为特定哈希而不是允许可变版本或版本范围的依赖。固定依赖减少了安全风险。
静态安全测试
- 定义:检查项目是否使用静态应用安全测试
- 得分范围:0-10
- 权重:5%
- 风险等级:中
- 评分规则:检测到其他SAST工具(Sonar、Snyk、Pysa、Qodana等)或CodeQL配置 10分,否则 0分
SAST 是在应用程序运行前对源代码进行的测试。使用 SAST 工具可以防止已知类别的错误被无意中引入代码库。
软件物料清单
- 定义:检查项目是否维护软件物料清单
- 得分范围:0-10
- 权重:5%
- 风险等级:中
- 评分规则:发布版本包中找到SBOM文件 10分, 未检测到SBOM文件 0分
SBOM 可以给用户提供关于项目依赖的信息,使他们能够识别软件供应链中的漏洞。
安全策略
- 定义:检查项目是否发布安全策略
- 得分范围:0-10
- 权重:5%
- 风险等级:中
- 评分规则:不存在SECURITY.md文件 0分,SECURITY.md有URL链接或邮箱地址 增加6分,SECURITY.md包含实际的文本内容 增加3分,包含漏洞披露信息 增加1分
安全策略(通常是 SECURITY.md
文件)可以给用户提供关于什么构成漏洞以及如何安全报告漏洞的信息。
发布版本签名
- 定义:检查项目是否对发布制品进行加密签名
- 得分范围:0-10
- 权重:8%
- 风险等级:高
- 评分规则:没有release 不评分,(最近5个release中有签名release数量 / 最近5个release) * 10
签名发布证明制品的来源。该检查查找项目最近五个发布资产中的签名文件。
令牌权限
- 定义:检查自动化工作流令牌是否遵循最小权限原则
- 得分范围:0-10
- 权重:8%
- 风险等级:高
- 评分规则:没有workflow工作流 不评分,所有工作流都遵循最小权限原则 10分,检测到严重的权限过度授予问题 比如write-all 0分
该检查确定项目的自动化工作流令牌是否遵循最小权限原则。这很重要,因为攻击者可能使用具有写入权限的受损令牌将恶意代码推送到项目中。
漏洞状态
- 定义:检查项目是否有未修复的漏洞
- 得分范围:0-10
- 权重:8%
- 风险等级:高
- 评分规则:10 - 发现的漏洞数量
该检查确定项目在其自己的代码库或其依赖中是否有开放、未修复的漏洞。开放的漏洞容易被攻击者利用,应该尽快修复。
网络钩子
- 定义:检查 WebHook 是否配置了令牌认证
- 得分范围:0-10
- 权重:5%
- 风险等级:严重
- 评分规则:没有WebHook 10分,(配置了secret的WebHook数量 / 总WebHook数量) × 10
该检查确定仓库中定义的 WebHook 是否配置了令牌来验证请求的来源。
评估模型算法
权重分配
权重基于每个检查的风险等级和重要性进行分配:
- 严重风险:10% 权重
- 高风险:8-10% 权重
- 中等风险:5-8% 权重
- 低风险:5% 权重
指标分数
指标最高10分,最低0分
评分机制
每个检查项根据其实现程度给出 0-10 分的评分,最终加权计算总分。总分反映了项目的整体安全状况。
对应公式 项目分数 = Σ(指标评分 × 指标权重) / Σ(指标权重)。
参考文献
贡献者
后端
- Yehui Wang
- Shengbao Li
评估模型
- Yehui Wang
- Guoqiang Qi
- Shengbao Li