其他
如何应对开源组件⻛险?软件成分安全分析(SCA)能力的建设与演进
总第511篇
2022年 第028篇
随着 DevSecOps 概念的推广,以及云原生安全概念的快速普及,研发安全和操作环境安全现在已经变成了近几年非常热的词汇。目前,在系统研发的过程中,开源组件引入的比例越来越高,所以在开源软件治理层面安全部门需要投入更多的精力。
但由于早期技术债的问题,很多企业内部在整个研发流程中对使用了哪些开源组件、这些开源组件可能存在哪些严重的安全隐患等相关的问题,几乎是没有任何能力去进行收敛,多年前的 SCA(Software Composition Analysis 软件成分分析)技术又重出江湖,变成该领域⻛险治理的一个“神器”。本文主要探讨如何利用 SCA 技术实现对开源组件⻛险治理相关能力的建设与落地,希望给大家以启发或者帮助。1. 前言
2. 安全视⻆下的研发⻛险
2.1 通用漏洞⻛险
2.2 供应链相关的⻛险
2.3 过维护期的组件
3. 业务视⻆下的安全研发⻛险
4. SCA 建设的过程
5. SCA 建设中遇到的问题
6. SCA 技术未来的展望
7. 结语
1. 前言
2. 安全视⻆下的研发⻛险
2.1 通用漏洞⻛险
2.2 供应链相关的⻛险
IDE 插件投毒 :为了更高效率地开发软件,开发人员往往会在自己的 IDE 当中引入各种各样的插件来提升自己的开发体验与效率。这是一件看起来非常正常的事情,但是软件开发人员往往没有足够的安全意识,导致自己的 IDE 中可能会安装了一些有问题的组件,甚至 IDE 本身也出现了供应链“投毒”的情况,这种 Case 数不胜数。比较出名的是在 2021 年 5 月份, Snyk 披露的一份安全报告中显示攻击者在 VSCode 的插件市场发起了“投毒”行为,一些有问题的扩展是“LaTeX Workshop”、“Rainbow Fart”、“在默认浏览器中打开”和“Instant Markdown”,所有这些有问题的扩展累计安装了大约 200 万次,此次事件所造成的影响也是非常广泛的。 提交缺陷代码 :在软件开发环节,开发人员因为水平、安全意识的诸多原因,往往会在开发过程中引入漏洞,这本身是一件十分正常的事情。但对于开源软件而言,因为几乎所有人都可以向开源项目提交代码,并且通过审核后就可以 Merge 进项目,所以总会有不怀好意的人故意引入有问题的代码,比较典型的 Case 是 2021 年 4 月,明尼苏达大学 Kangjie Lu 教授带领的研究团队因故意向 Linux 引入漏洞,导致整所大学被禁止参与 Linux 内核开发。抛开道德问题不谈,这种⻛险实际上有可能因为审核的疏忽导致⻛险直接被引入。 源代码平台被攻陷 :其实 Git 平台本身由于保护不当,也有极大的概率被攻陷。虽然说攻陷 GitHub 这种平台本身不太现实,但是有很多开源项目都是自己搭设的 Git 平台,再加上一些众所周知的原因,Git 平台本身缺乏保护是一件较大概率发生的事情。在 2021 年 3 月,PHP 的官方 Git 就遇到了类似的 Case,由于 PHP 官方团队在 git.php.net 服务器上维护的 php-src Git 仓库中被推送了两个恶意提交。攻击者在上游提交了一个神秘的改动,称其正在“修复排版”,假装这是一个小的排版更正,并且伪造签名,让人以为这些提交是由已知的 PHP 开发者和维护者 Rasmus Lerdorf 和 Nikita Popov 完成的。所以 Git 平台的安全保护本身也是需要被提高重视的。 代码 branch 被篡改导致打包结果不一致 :由于开源项目的 Git 仓库是向所有人开放的,有些攻击者会尝试新建不同的 branch 植入代码然后进行发布,虽然编译过后的包带有 CI/CD 平台的签名,但是仍旧会引发严重的安全隐患。早在 2019 年的 DEFCON 会议上,就有安全研究员就发现了 WebMin 的 1 .890 在默认配置中存在了一个很严重的高危漏洞,1. 882 到 1.921 版本的 WebMin 会受到该漏洞影响。但奇怪的是,从 GitHub 上下载的版本却未受到影响,影响范围仅限于从 SourceForge 下载的特定版本的 WebMin,后来经过调查后发现,是代码仓库没有添加分支保护机制,从动导致出现问题,引发了此类的安全⻛险。 CI/CD 体系被攻陷 :研发前期,如果我们完成了代码完整性检测的话,如果流程没有被篡改或者构建平台都运行正常的话,一般情况下,出现问题的几率很低。但如果 CI/CD 平台和前面的 Git 一样被恶意篡改或是破坏,也会出现安全隐患,SolarWind 事件就是由于这一原因导致的,攻击者在 CI/CD 过程中嵌入了“后⻔”,通过了签名校验,再通过 OTA 分发补丁之后,导致出现了让人震惊的供应链攻击事件。 不安全组件引入 :在依赖引入的过程中,如果引入了有问题的组件,则相当于引入了⻛险,这也是目前最典型的供应链攻击手段,通过我们对各个源的安全调查和分析后发现,“投毒”的重灾区在 Python 和 NodeJS 技术栈(一个原因是因为前端的“挖矿”已经很成熟,容易被黑产滥用,另外一个原因是 Python 的机器学习库相当丰富,加上机器学习配套的计算环境性能强悍,导致“挖矿”的收益会比入侵普通 IDC 主机更高)。由于例子较多,这里就不一一列举了。 外部 CI/CD 流程构建 :因为 CI/CD 平台有时候不能满足需求,或开发者出于其他因素考量,会使用非官方的 CI/CD 进行构建,而是自己上传打包好的 JAR 或者 Docker 镜像来部署,更有甚者会同时把打包工具链和源代码一起打包上传到容器实例,然后本地打包(极端情况下,有些“小可爱”的依赖仓库都是自己搭建的 Sonatype Nexus 源管理系统)。因为很多开源软件的使用者不会去做 CI/CD 的签名校验(比如说简单匹配下 Hash ),导致这类攻击时有发生。早在 2008 年的时候,亚利桑那大学的一个研究团队就对包括 APT、YUM 在内的 Linux 包管理平台进行了分析和研究,发现绝大多数源都不会对包进行校验,这些包随着分发,造成的安全问题也越来越广泛。 直接部署有问题的包 :有些打包好的成品在使用的时候,因为没有做校验和检查,导致可能会部署一些有问题的包,最典型的例子是 Sonatype 之前披露的 Web-Broserify 包的事件,虽然这个包是使用了数百个合法软件开发的,但它会对收集目标系统的主机信息进行侦查,所以造成了相当大规模的影响。
2.3 过维护期的组件
维保问题 :因为开源社区的人力和精力有限,往往只能维护几个比较主要的版本(类似于操作系统中的 LTS 版本,即 Long-Term Support,⻓期支持版本是有社区的⻓期支持的,但是非 LTS 版本则没有),所以一旦使用过时很久的版本,在安全更新这一部分就会出现严重的断层现象。如果出现了高危漏洞,官方不维护,要么就是自己编写补丁修复,要么就是升级版本,达到“⻓痛不如短痛”的效果,要么就是像一颗定时炸弹一样放在那里不管不问,祈求攻击者或者“蓝军”的运气差一点。 安全基线不完整 :随着信息安全技术的发展和内生安全的推动,版本越新的安全组件往往会 Secure By Design,让研发安全的要求贯穿整个研发设计流程。但早期由于技术、思路、攻击面的局限性,这一部分工作往往做了跟没做一样。感触特别深的两个例子,一个是前几年 APT 组织利用的一个 Office 的 0day 漏洞,瞄准的是 Office 中一个年久失修的组件,这个组件可能根本连基本的 GS(栈保护)、DEP(数据区不可执行)、ASLR(内存地址随机化)等现代的代码安全缓解机制都没有应用。熟悉虚拟化漏洞挖掘的同学们可能知道,QEMU/KVM 环境中比较大的一个攻击面是 QEMU 模拟出来的驱动程序,因为 QEMU/KVM 模拟的驱动很多都是老旧版本,所以会存在很多现代化的安全缓解技术没有应用到这些驱动上面,从而引入了攻击面。其实,在开源软件的使用过程中也存在类似的情况,我们统称为“使用不具备完整安全基线的开源软件”。 未通过严谨的安全测试 :现在的很多开源组件提供商,诸如 Sonatype 会在分发前进行一定程度的安全检测,但是时间越早,检测的范围越小。换句话说就是,组件越老出现的问题越多。毕竟之前不像现在一样有好用的安全产品和安全思路,甚至开发的流程也没有嵌入安全要求。而这样就会导致很多时候,新发布的版本在修复了一个漏洞的同时又引入了一个更大的漏洞,导致⻛险越来越大,越来越不可控。
3. 业务视⻆下的安全研发⻛险
兼容性问题 :在推动以版本升级为主要收敛手段的⻛险修复中,业务提出最多质疑的往往是兼容性问题,毕竟稳定性对于业务来说非常重要。所以一般情况下,我们在推动升级时,往往会推送安全稳妥且稳定性最高的修复版本,作为主要的升级版本。但这种问题不是个例,每次遇到此类型推修的时候,业务都会问到类似问题。考虑到本文篇幅原因,这里就不再进行展开。 安全版本的问题 :跟上一个问题类似,业务同学在引入组件时也会考虑安全性的问题,但业务同学由于缺乏一些安全知识,导致自己对于“安全版本“的判断存在一定的出入,所以业务同学会把这个问题抛给安全同学。但是安全同学很难100%正确回答这个问题,因为开源组件太多,绝大多数企业不能像Google、微软一样把市面上所有的组件安全性全都分析一遍,所以一般只能现用现查。一来一去,会拉低这一部分的质量和效率。所以这一部分需求也是重要且急迫的。 追求“绝对安全” :有些业务同学也会直接问,到底该怎么做,才能安全地使用各种组件?话虽直接,但是能够体现出背后的问题:安全的尺度和评价标准不够透明。让安全问题可量化,并且追求标准透明也是非常急迫的工作,考虑到这更像是运营层面的问题,在此也不展开叙述了。 合规问题 :很多业务因不了解开源协议,导致违反了开源协议的约束,引发了法务或者知识产权问题。
4. SCA 建设的过程
软件资产的透视 :企业内部需要对所有的应用系统引用了哪些组件这件事情有着非常清晰的认知,在考虑尽量多的情况下,尽量覆盖绝大多数的场景(业务应用系统、Hadoop 作业等数据服务、Puppet 等运维服务等),并且研究它们的开发流程,分析哪些阶段可以引入 SCA 能力做⻛险发现。 ⻛险数据的发现 :现在是一个数据爆炸的时代,安全团队每天需要关注的安全⻛险信息来源五花八⻔,但是需要尽可能多地去收集⻛险相关的数据,并且做上下文整合,使之可以自动化和半自动化地运营起来。但仔细想一下,除了追求⻛险数量,能否更进一步追求更强的实效性,达到先发制人的效果?通过企业内部多年的安全威胁情报能力建设,同时追求实效性和可用性的双重 SLA 是可行的。除此之外,需要关注的⻛险,不能仅仅局限于漏洞和“投毒”这两个场景,还需要对开源软件的基线信息进行收集。 ⻛险与资产关联基础设施的建设:前面的两个方向是数据维度的需求,考虑 SCA 落地不单单是信息安全部⻔的事情,在实际落地过程中,还需要跟业务的质量效率团队、运维团队建立良性的互动机制,才能让安全能力深入到业务,所以需要建设相关的基础设施去实现核心 APIs 能力的建设,对业务进行赋能。虽然听上去很简单,但实际上开发的东⻄可能是 UDF 函数,也可能是某些分析服务的插件,甚至可能是 CEP(Complex Event Process 复杂事件处理,一种应用于实时计算的分析技术)的规则。 可视化相关需求 :既然有了⻛险,安全团队及业务相关团队的同学除了自己知道之外,还需要让负责系统开发相关同学也了解⻛险的存在,并且要及时给出解决方案,指导业务完成修复,同时安全团队也需要通过获取运营数据,了解⻛险的修复进度。
第一阶段 :数据盘点与收集,在项目建设前期,信息安全团队应当跟企业内部的基础架构相关的团队,完成企业内部基础组件的数据资产盘点,旨在从基础技术和信息安全的视⻆实现对研发技术栈、研发流程链路的摸排,在合适的位置进行数据卡点,从而获取相关数据,完成对资产数据的采集。另一方面,信息安全部⻔在现有的威胁情报经验和数据上,对组件数据进行数据封装和整合,建立一个单独的开源组件⻛险数据库,旨在收集来自于全量互联网上披露的⻛险,方便与后面的资产数据进行联动。 第二阶段 :SOP(Standard Operating Procedure,标准运营流程)和概念验证建设,信息安全团队通过自己的漏洞修复经验进行 SOP 的固化,通过不断地调优,完成一个通用的漏洞修复 SOP,通过实际的演练和概念验证(PoC,即Proof-of-Concept)证明,该 SOP 可以在现有的技术条件下很好地完成⻛险修复这一部分工作。同时结合 SOP,对之前收集的资产数据和⻛险数据进行查漏补缺,完成对数据和数据链路的校验工作,保证系统高可用。在这个阶段,SCA 的服务提供方需要开放部分的核心 API 给部分业务的质量效率团队,帮助他们进行测试并收集反馈,让其融入到自己的⻛险治理环节。 第三阶段 :平台化及配套稳定工作的建设,当 SOP 初步成型并且完成了概念验证之后,应当需要建设对应的平台和子系统,让这一部分工作脱离手动统计,使其接近 100% 线上化。得益于内部 SOC 的模块化设计,可以在现有的平台上轻松构建出 SCA 相关的子系统,完成能力的数据。针对终端用户可视化⻛险这一问题,SCA 子系统会提供核心的 APIs 给面向研发同学端的 SOC 平台完成⻛险信息的同步。为了保证服务的高可用,后续还会建设配套的数据链路检查机制,不断完善数据的可用性。
NVD/CNVD/GitHub-GHSA 等通用漏洞数据库:这个是基本操作,旨在收集漏洞⻛险,结合漏洞实际情况进行人工和研判。 Jira、Commit、Release 和 Bugzilia 等 Pull-Request 相关的数据 :通过获取相关的数据,结合自研的 NLP(Natural Language Process,自然语言分析)分析引擎对内容进行倾向性判断,过滤并输出安全相关的信息,然后组织人工或自动化研判,通过实践,我们发现可以大幅度提前发现⻛险(笔者在 ISC2019 上曾经阐述过⻛险发现前置的必要性和落地经验)。 组件专用⻛险库:经过我们对于漏洞数据相关的调研,诸如 Github 和 Snyk 这些机构会有专⻔的组件⻛险库对外提供,通过获取并分析这些信息,经过加工后可以得到可用性极高的组件⻛险库,可按需研判。 软件风险相关的新闻资讯和 RSS 订阅 :这类源主要是解决 0day 和被 APT 组织在野利用等特殊披露的漏洞,同 Pull-Request 数据一样,该类型的绝大部分⻛险数据都是需要通过 NLP 分析引擎进行情报数据分析,进一步进行情感推断后才达到可用的标准。 手动录入 :这也是常规操作,虽然采集了很多类型的⻛险,但的确受限于供应链攻击的多种多样和发展,所以不可能考虑得面面俱到,仍旧需要手动接口补充需要运营的⻛险。但安全团队仍希望将手动录入的⻛险占全部⻛险的比例,控制到一个合理的范围,保证这部分能力不会因为运营人员的问题(如经验不足、离职等),而导致能力的闪崩性缺失。
5. SCA 建设中遇到的问题
漏洞-资产关联规则缺乏一个成熟且有效的行业标准:在 SCA 领域,目前没有一个成熟的可以匹敌 NVD 相关的生态环境,在 NVD 体系下,有用来描述漏洞信息的 CVE ,有描述资产影响范围的 CPE(Common Product Enumunation),有描述攻击路径的 CAPEC(Common Attack Pattern Enumeration and Classification),还有描述⻛险类型的 CWE(Common Weakness Enumunation)。但是在组件安全领域,由于各家公司的基础设施建设成熟度和技术选型差异巨大,所以没有一个可用的完整生态可以做到“开箱即用”,所以我们需要基于现有的技术架构和基础设施来设计自己的规则,同时推广这套标准在安全运营工作中落地。 数据质量与数据链路的可靠性:数据质量和可用性问题是从立项开始一直到后期运营阶段都会出现的问题,问题可能来自于上游采集逻辑不完备或采集错误,还有数据链路不稳定导致写入计算引擎出现大批量丢失的问题,还有数据链路没有检查机制,导致不知道具体问题出在哪里,甚至由于使用的数据分析技术栈的原因,导致打过来的数据是错乱的,错乱的数据有可能会影响 CEP 规则的准确性和有效性。这当中的有些问题不是偶发的,甚至有些问题在真实应用的场景下会高频出现,所以建立一个⻓效的数据拨测机制和数据污点追踪能力是必要且必须的。 ⻛险数据的数据结构与准确度:由于在⻛险数据中引入了过多的来源,且大量引入了机器学习和 NLP 技术,将非结构化数据转换成结构化数据,考虑到模型训练的精度、训练样本数据、训练网络等问题,导致平台提取出来的漏洞信息很多时候会有一定的出入,并且由于⻛险情报数据比较依赖上下文和实效性,所以需要在各方面做取舍,这个问题其实和数据的问题一样,不是一朝一夕能解决的,需要大量的实践运营和拨测机制 Case by Case 地去推动解决。 CI/CD 管制与非标准资产的治理:这一方面实际上与 SCA 落地的关系不是很大,但是提及的原因是 SCA 本身是一个需要强关联研发流程的能力,好的 SCA 平台除了可以提供标准化的 APIs 和 GUI 让用户快捷操作,同时也需要兼容非标准的发布流程和上线标准,这就是为什么除了主要的几个技术栈之外,仍旧覆盖了一些偏小众的技术栈,如 C#/Powershell 的 NuGet、ErLang 的 Hex 包管理等。 资产透视深度:这一部分其实是 SCA 核心能力的体现,从理论上讲,SCA 是有能力分析诸如 FatJar 这种开源组件嵌套的 JAR 包,但实际上受制于数据质量和技术能力,往往无法分析到一个非常细的粒度,所以这一部分需要去设计一个 MTI(Maximum Tolerate Index 在这里表示可接受的最粗分析粒度)指标去指导相关的设计。
6. SCA 技术未来的展望
7. 结语
8. 本文作者
9. 参考文献
Software Composition Analysis (SCA) reviews Reviews and Ratings Deep dive into Visual Studio Code extension security vulnerabilities That Time Linux Banned the University of Minnesota PHP's Git server hacked to add backdoors to PHP source code Webmin backdoor blamed on software supply chain breach Highly Evasive Attacker Leverages SolarWinds Supply Chain to Compromise Multiple Global Victims With SUNBURST Backdoor Open Source Software Is Under Attack; New Event-Stream Hack Is Latest Proof Stork: Package Management for Distributed VM Environments Hello open source security! Managing risk with software composition analysis Introducing Microsoft Application Inspector Cyber Supply Chain Risk Management THE SOFTWARE BILL OF MATERIALS AND ITS ROLE IN CYBERSECURITY Cybersecurity Supply Chain Risk Management C-SCRM Introducing the Open Source Insights Project Announcing a unified vulnerability schema for open source Google stakes new Secure Open Source rewards program for developers with $1M seed money Introducing SLSA, an End-to-End Framework for Supply Chain Integrity Binary Authorization for Borg: how Google verifies code provenance and implements code identity A Kubernetes CI/CD Pipeline with Asylo as a Trusted Execution Environment Abstraction Framework AllStar: Continuous Security Policy Enforcement for GitHub Projects Google open-sources Allstar, a tool to protect GitHub repos Measuring Security Risks in Open Source Software: Scorecards Launches V2 2022 OPEN SOURCE SECURITY AND RISK ANALYSIS REPORT Focus on the Stability of Large Systems: Toward Automatic Prediction and Analysis of Vulnerability Threat Intelligence Open Source Security Explained CycloneDX Specification 4 Key Sigstore Takeaways: Recap of Twitter Space with Kelsey Hightower SLSA vs. Software Supply Chain Attacks The State of Open Source Vulnerabilities 2021 GitHub 2020 Digital Insight Report 2020 State of the Software Supply Chain Making Sense of Unstructured Intelligence Data Using NLP OpenSCA-Cli MurphySec Code Scan Method and system for monitoring a software artifact Method and system for monitoring metadata related to software artifacts Method and system for evaluating a software artifact based on issue tracking and source control information sigstore - A non-profit, public good software signing & transparency service
阅读更多