SAP 安全研究机构、雷恩第一大学和上法兰西理工大学合著的论文《SoK: Taxonomy of Attacks on Open-Source Software Supply Chains》全面梳理了开源软件供应链攻击的方式,制作了涵盖 107 个独特向量的攻击树。并 17 位领域专家和 134 位软件开发人员一同总结了 33 个缓解措施
。
论文绘制的开源软件供应链攻击分类树
它是一个攻击树的形式,包含了五个主要的攻击目标:代码贡献、版本控制系统、构建系统、分发平台和下游用户
,每个攻击目标下面有多个攻击向量,即具体的攻击方法,每个攻击向量也有一个或多个与之相关的缓解措施。
- 代码贡献:攻击者试图通过提交恶意代码或修改已有代码来影响开源项目的功能或安全性。这种攻击可能涉及以下工具或方法:
- 利用恶意账户或盗取合法账户来提交代码变更。
- 利用代码审查机制的缺陷或不足来绕过检查。
- 利用依赖关系混淆或欺骗来引入恶意依赖。
- 利用代码库中的隐蔽通道或后门来控制或损害目标系统。
- 版本控制系统:攻击者试图通过篡改版本控制系统(VCS)中的数据或配置来破坏开源项目的完整性或可信度。这种攻击可能涉及以下工具或方法:
- 利用恶意账户或盗取合法账户来修改VCS中的代码、元数据、分支、标签等。
- 利用VCS中的漏洞或错误配置来执行任意命令、访问敏感信息、删除数据等。
- 利用VCS中的历史记录重写功能来擦除痕迹或伪造历史记录。
- 构建系统:攻击者试图通过操纵构建系统中的数据或配置来影响开源项目的构建过程和结果。这种攻击可能涉及以下工具或方法:
- 利用恶意账户或盗取合法账户来修改构建系统中的构建脚本、配置文件、环境变量等。
- 利用构建系统中的漏洞或错误配置来执行任意命令、访问敏感信息、删除数据等。
- 利用构建系统中的缓存污染功能来注入恶意代码或依赖到构建结果中。
- 下游用户:攻击者试图通过利用下游用户的行为或信任来诱导他们下载或执行恶意包或版本。这种攻击可能涉及以下工具或方法:
- 利用社交工程学技巧,例如发送钓鱼邮件、伪造身份、制造紧急情况等,来诱骗下游用户点击恶意链接或附件。
- 利用拼写错误或相似的包名或域名,例如 Typosquatting,来欺骗下游用户下载错误的包或版本。
- 利用下游用户对开源项目的信任,例如使用默认密码、不检查签名、不验证来源等,来植入恶意代码或依赖到包或版本中。
- 利用下游用户对开源项目的需求,例如使用过时的包、缺少安全更新、寻求新功能等,来推荐恶意包或版本给下游用户。
论文总结的 33 个缓解措施
- M1: 使用安全的编程语言和工具可以防止或减轻由于编程语言或工具本身的漏洞或限制而导致的攻击,例如缓冲区溢出、内存泄露、格式化字符串等。
- M2: 使用静态和动态分析工具可以防止或减轻由于代码中的错误或漏洞而导致的攻击,例如逻辑错误、输入验证、内存管理等。
- M3: 使用代码审查工具和流程可以防止或减轻由于代码质量不高或存在恶意代码而导致的攻击,例如代码复杂度、风格一致性、安全性规范等。
- M4: 使用代码签名和加密技术可以防止或减轻由于代码被篡改或窃取而导致的攻击,例如数字签名、哈希校验、对称加密、非对称加密等。
- M5: 使用代码质量和安全性指标可以防止或减轻由于使用不可信赖的开源项目或贡献者而导致的攻击,例如代码覆盖率、漏洞数量、维护频率、信誉评分等。
- M6: 使用代码依赖管理工具可以防止或减轻由于使用过时或有漏洞的依赖项而导致的攻击,例如依赖项版本控制、更新提醒、漏洞扫描等。
- M7: 使用代码托管平台的安全功能可以防止或减轻由于代码托管平台被入侵或滥用而导致的攻击,例如双因素认证、访问控制列表、分支保护、合并请求等。
- M8: 使用多因素身份验证和授权机制可以防止或减轻由于身份被冒用或权限被滥用而导致的攻击,例如密码加盐哈希、验证码、令牌、角色分配等。
- M9: 使用强密码和密钥管理工具可以防止或减轻由于密码或密钥被破解或泄露而导致的攻击,例如密码生成器、密码管理器、密钥生成器、密钥存储器等。
- M10: 使用恶意软件检测和防御工具可以防止或减轻由于恶意软件感染系统而导致的攻击,例如杀毒软件、防火墙、沙箱、隔离环境等。
- M11: 使用网络安全监控和防火墙工具可以防止或减轻由于网络攻击或拦截而导致的攻击,例如端口扫描、数据包嗅探、分布式拒绝服务、跨站脚本等。
- M12: 使用安全的通信协议和渠道可以防止或减轻由于通信内容被窃听或篡改而导致的攻击,例如安全套接字层、传输层安全、超文本传输协议安全、虚拟专用网络等。
- M13: 使用安全的开发环境和设备可以防止或减轻由于开发环境或设备被感染或损坏而导致的攻击,例如操作系统更新、驱动程序更新、硬件加密、物理锁等。
- M14: 遵循最低特权原则和最小暴露原则可以防止或减轻由于过多的特权或暴露而导致的攻击,例如最小化代码库访问权限、最小化系统访问权限、最小化网络访问权限、最小化数据共享等。
- M15: 遵循开源许可协议和法律规定可以防止或减轻由于违反开源许可协议或法律规定而导致的攻击,例如遵守版权声明、遵守免责声明、遵守贡献者协议、遵守隐私政策等。
- M16: 遵循开源社区的最佳实践和指南可以防止或减轻由于不符合开源社区的标准或期望而导致的攻击,例如遵守代码风格指南、遵守文档编写指南、遵守测试编写指南、遵守发布流程指南等。
- M17: 建立并维护开源项目的信誉和声誉可以防止或减轻由于开源项目被质疑或抵制而导致的攻击,例如建立并展示项目的愿景、目标、价值、成就等。
- M18: 建立并维护开源项目的透明度和可追溯性可以防止或减轻由于开源项目被隐藏或篡改而导致的攻击,例如公开并记录项目的活动、决策、变更、问题等。
- M19: 建立并维护开源项目的活跃度和响应度可以防止或减轻由于开源项目被遗弃或忽视而导致的攻击,例如定期并及时地更新项目的代码、文档、测试、版本等。
- M20: 建立并维护开源项目的多样性和包容性可以防止或减轻由于开源项目被排斥或利用而导致的攻击,例如欢迎并支持来自不同背景和经验的贡献者、用户和利益相关者等。
- M21: 建立并维护开源项目的合作性和互信性可以防止或减轻由于开源项目被分裂或背叛而导致的攻击,例如建立并遵守项目的规则、道德、文化、社区等。
- M22: 选择并使用可信赖的开源项目和贡献者可以防止或减轻由于使用不可信赖的开源项目或贡献者而导致的攻击,例如评估并验证开源项目和贡献者的信誉、声誉、透明度、可追溯性、活跃度、响应度、多样性、包容性、合作性和互信性等。
- M23: 选择并使用可信赖的包管理器和仓库可以防止或减轻由于使用不可信赖的包管理器或仓库而导致的攻击,例如评估并验证包管理器和仓库的安全性、可靠性、稳定性、性能等。
- M24: 选择并使用可信赖的构建工具和流程可以防止或减轻由于使用不可信赖的构建工具或流程而导致的攻击,例如评估并验证构建工具和流程的正确性、完整性、一致性、效率等。
- M25: 选择并使用可信赖的测试工具和流程可以防止或减轻由于使用不可信赖的测试工具或流程而导致的攻击,例如评估并验证测试工具和流程的覆盖度、有效性、敏感度、鲁棒性等。
- M26: 选择并使用可信赖的发布工具和流程可以防止或减轻由于使用不可信赖的发布工具或流程而导致的攻击,例如评估并验证发布工具和流程的安全性、兼容性、兼容性、用户友好度等。
- M27: 定期更新开源项目的依赖项和版本号可以防止或减轻由于使用过时或有漏洞的依赖项或版本号而导致的攻击,例如跟踪并应用依赖项和版本号的更新、修复、改进等。
- M28: 定期检查开源项目的漏洞报告和修复方案可以防止或减轻由于忽略或延迟处理开源项目的漏洞而导致的攻击,例如订阅并关注漏洞报告和修复方案的来源、内容、影响等。
- M29: 定期备份开源项目的代码库和数据集可以防止或减轻由于开源项目的代码库或数据集被破坏或丢失而导致的攻击,例如使用可靠的备份工具和媒介、设置合理的备份频率和保留期限等。
- M30: 定期审计开源项目的代码库和数据集可以防止或减轻由于开源项目的代码库或数据集被隐藏或篡改而导致的攻击,例如使用专业的审计工具和方法、设置合理的审计频率和标准等。
- M31: 及时报告并修复发现的漏洞或异常行为可以防止或减轻由于漏洞或异常行为被利用或扩散而导致的攻击,例如使用合适的报告渠道和格式、使用合适的修复工具和方法等。
- M32: 及时通知并帮助受影响的下游用户或组织可以防止或减轻由于下游用户或组织被感染或损害而导致的攻击,例如使用合适的通知渠道和内容、提供合适的帮助资源和建议等。
- M33: 参与并支持开源社区的安全倡议和活动可以防止或减轻由于开源社区的安全意识或能力不足而导致的攻击,例如参与并支持开源软件基金会、开源安全联盟、开源安全峰会等。