开源风险治理平台“伏羲”在漏洞传播影响分析中取得重要进展,助力开源软件安全治理
2025-1-3 00:0:0 Author: mp.weixin.qq.com(查看原文) 阅读量:2 收藏

研究背景:开源组件漏洞威胁软件供应链安全

开源软件已成为现代软件生态系统中不可或缺的基础构件。然而,随着组件库规模的持续扩大,其潜在的漏洞问题日益突显,对软件供应链安全构成了重大威胁。以Maven Central仓库为例,作为Java生态系统中使用最为广泛的组件库管理平台,其月度下载量达到37.8亿次,其中约3.97亿次的下载组件中存在漏洞。这些漏洞可能通过组件依赖链传播至下游项目,进而引发大规模的安全隐患。一个典型案例是Apache Log4j组件中的Log4Shell漏洞(CVE-2021-44228)。该漏洞影响了Maven Central中8%以上的Java组件,涉及组件数量高达35,863个[1]。根据Sonatype发布的2024年度软件供应链报告数据显示,即使在Log4Shell漏洞披露之后,仍有13%的Apache Log4j下载存在漏洞[2]。尽管新版本的组件能够有效修复这些漏洞,但由于开发者对版本升级后的兼容性存在顾虑等原因,导致80%的项目依赖一年以上未进行更新。值得关注的是,由于开发者对开源组件的漏洞影响范围的认知不足,约3.6%的依赖被升级至另一个同样存在漏洞的版本。

图1 Sonatype 2024年度软件供应链报告

为应对开源组件漏洞引发的安全威胁,研究人员已经提出了多种分析与缓解方法。最常见的方法是基于软件成分分析的漏洞存在性检测方法,其通过提取项目依赖树并通过漏洞数据库匹配来识别潜在的漏洞组件。然而,由于这类方法未能考虑软件项目对漏洞函数的实际调用情况,导致较高的误报率。针对该局限性,研究人员提出了基于函数调用图的漏洞可达性分析方法,其通过构建软件项目的函数调用图来检测通向漏洞函数的潜在调用链。然而,这类方法仍然无法准确评估软件项目触发漏洞的实际可能性,因此依然存在误报问题。为了进一步解决误报,研究人员提出了组件漏洞的可触发性分析方法。这些方法使用漏洞组件的测试用例来引导软件项目的测试用例生成从而去触发组件漏洞。在软件项目直接调用漏洞函数的简单场景中,这些方法表现出色。然而,当软件项目通过调用链调用漏洞函数时,漏洞触发路径的复杂性显著增加,使得现有方法难以生成有效的漏洞触发测试用例。

开源组件漏洞影响传播示例

以Apache commons-beanutils组件1.9.3版本为例,该组件版本受漏洞CVE-2019-10086影响。图2展示了CVE-2019-10086漏洞的触发样例,其中bean对象和“class”字符串构成了漏洞函数的触发上下文。

图2 CVE-2019-10086漏洞触发样例

Apache commons-validator在1.7版本之前依赖了存在漏洞的Apache commons-beanutils组件。图3展示了通过Apache commons-validator分步触发CVE-2019-10086漏洞的过程。其中,Form.validate函数依次调用Field.validate函数、Field.getIndexedPropertySize函数,并最终调用PropertyUtils.getProperty函数。

图3 CVE-2019-10086漏洞分步触发示例图

在Field.getIndexedPropertySize函数调用PropertyUtils.getProperty函数过程中,要成功触发该漏洞,PropertyUtils.getProperty的第二个参数(即getIndexedListProperty的返回值)必须为“class”。这表明,getIndexedPropertySize函数的实例对象中,indexedListProperty字段的值必须设置为“class”。当该实例对象执行getIndexedPropertySize时,传递一个Object实例即可触发漏洞。在Field.validate调用Field.getIndexedPropertySize过程中,传递给getIndexedPropertySize的参数bean来自第43行代码中的params对象。params是validate函数的第一个参数,是一个Map对象,用于检索键为“java.lang.Object”的值。因此,为了通过validate函数触发该漏洞,params必须设置为{“java.lang.Object”: Object实例},同时在validate函数执行到调用getIndexedPropertySize时,应保持此时的程序状态与getIndexedPropertySize触发漏洞时的程序状态一致。

研究进展:基于LLM增强的分步式组件漏洞可触发性分析技术

复旦大学CodeWisdom团队的开源风险治理平台“伏羲”提出了一种基于LLM增强的分步式组件漏洞可触发性分析技术Magneto,能够有效降低组件漏洞的误报率,助力开源软件安全治理。相关研究论文“Magneto: A Step-Wise Approach to Exploit Vulnerabilities in Dependent Libraries via LLM-Empowered Directed Fuzzing”已发表于ASE 2024。该方法的流程框架如图4所示,包含五个关键步骤:漏洞可达性分析、漏洞触发上下文提取、种子模板生成、初始种子合成,以及反馈引导的定向模糊测试。首先,该方法执行轻量级的漏洞可达性分析,以识别从客户端项目到漏洞函数的所有函数调用链。随后,它对每个可达调用链进行可触发性分析,其中是客户端项目中的函数,是漏洞组件中的漏洞函数。该方法按照逆序将调用链分解为一系列调用步骤,并对每个调用步骤分别执行基于LLM增强的定向模糊测试。最终目标是生成一个能够通过触发中漏洞的测试用例。

于每个调用步骤的触发测试用例来源分为两种情况:当i > 1时,由前一个调用步骤的分析过程生成;当i = 1时,则直接从漏洞触发的测试用例中获取。给定及其触发测试用例,Magneto提取触发上下文,记录触发中漏洞所需的程序状态。这些程序状态包括调用的实例对象以及传递给的参数。同时,给定,Magneto通过提示工程使用LLM推断种子模板,记录调用所需的程序状态。这些程序状态包括调用的实例对象、传递给的参数,以及它们到的数据流。随后,Magneto结合漏洞触发的上下文和种子模板,合成一个能够执行到的种子,同时保持触发中漏洞所需的程序状态。

由于执行到的数据流可能较为复杂,通过大模型合成的种子可能无法保持所需的程序状态。因此,以合成的种子作为初始种子,Magneto利用定向模糊测试器对种子进行变异,使所需的程序状态得以满足,并生成的触发测试用例。最终,当前生成的触发测试用例将辅助下一个调用过程的可触发性分析。

图4  Magneto的流程框架图

(一)漏洞可达性分析:对客户端项目进行依赖树的轻量化分析与调用图的构建,识别出项目中所有调用到漏洞函数的可达调用链。

(二)漏洞触发上下文提取:提取每个调用步骤的触发上下文。一条完整的可达调用链可以记作,其中是项目所依赖的漏洞组件中的漏洞函数,对于每一步调用过程,会从漏洞数据库中的已知漏洞触发测试用例或是上一步测试中生成的触发测试用例中提取被调用函数的触发上下文。这一上下文记录了通过调用链来触发漏洞函数所需的程序状态。

(三)种子模板生成:采用上下文敏感的静态分析,结合提示工程,利用LLM对当前测试函数的语义进行深度理解,辅助生成种子模板。在每步调用中,使用LLM推断如何设置调用时的实例对象和传递给的参数,以确保在中调用理论上,这些实例对象和参数可以表示为数据流上的表达式,称为种子模板由于数据流分析在推导时存在局限性,因此使用LLM进行近似推导,并格式化地返回推导结果。

(四)初始种子合成:使用LLM推导出的种子模板来实例化种子的参数和实例对象,从而生成初始种子。由于LLM在处理实例对象时存在不足,因此还需要通过静态分析来补充推导结果。具体地,如果两个函数属于同一个类,则需要遍历实例对象中的所有字段,并将其中非空的字段分配给对应的值;如果两个函数不属于同一个类,则需要通过上下文敏感的反向污点分析来确定实例对象的来源,并将其正确赋值给相应的字段。

(五)反馈引导的定向模糊测试:使用合成的种子作为初始输入,进行定向模糊测试,目标是生成项目的漏洞触发测试用例。为了有效地区分不同变量在漏洞触发过程中作用,将种子中的变量分为三类:

●漏洞触发相关变量:这些变量在执行过程中与实例对象和参数之间有数据流关系,且可能影响漏洞触发;

●控制流相关变量:这些变量控制程序的执行路径和分支决策,影响到达目标函数的可达性;

●其他变量:这些变量与分支条件和漏洞触发无关;

同时为了有效选择和变异种子,我们对种子的执行路径进行覆盖分析,基于种子执行过程中覆盖的代码行数距离到目标函数的距离来计算适应性评分;适应性评分越小的种子说明执行过程中离漏洞函数越接近,则优先被选中进行执行和变异。

实验评估:助力开源软件安全治理

为了评估该方法的有效性,复旦大学CodeWisdom团队进行了大规模的实验评估,我们收集了49个GitHub开源项目,包含84对“漏洞组件-项目”组合与182条可触发漏洞的函数调用链,函数调用链总长度为429。我们对比了目前的SOTA工具,如表1 所示,其中EPN(Exploited Pairs Number)表示工具在“漏洞组件-项目”组合中成功生成漏洞触发测试用例的组合对数量;ECN(Exploited Call Chains Number)表示工具成功生成的可触发调用链的数量;MEL(Maximum Exploited Length)表示工具成功生成的漏洞可触发调用链中的最大长度;AEL(Average Exploited Length)表示工具成功生成的漏洞可触发调用链的平均长度。Magneto成功为79个“漏洞组件-项目”组合生成漏洞触发测试用例,比SOTA方法提高75.6%;成功为135个可达调用链生成漏洞触发测试用例,比SOTA方法提高154.7%。

图5 Magneto与SOTA工具的有效性分析结果

此外,我们还从调用链长度维度对工具的组件漏洞可触发性分析能力进行了定量分析。表2的前两列展示了基准数据集中182个可触发调用链的长度分布,后三列则分别报告了各工具成功触发的调用链长度分布情况。对于78个长度为1的可触发调用链,Transfer和Vesta展现出相对良好的有效性。Magneto在该场景中表现突出,仅有一例未能成功触发。对于调用链长度大于1的可触发调用链,Transfer和Vesta的性能出现显著下降,仅在少数案例中取得成功。Magneto由于使用了分步触发的策略,在复杂场景中仍保持了相对稳定的表现。

图6 基于调用链长度的工具有效性分析结果

关于“伏羲”

“伏羲”是复旦大学CodeWisdom团队推出的开源风险治理平台,旨在推动学术与合作交流,同时提高开源风险的治理水平。“伏羲”在高质量开源软件供应链知识(包括漏洞知识等)汇聚的基础上,利用高精度程序分析技术(包括代码差异分析、调用图分析等)实现多种开源软件供应链风险(包括安全风险、法律风险等)的分析与治理服务。目前“伏羲”提供了漏洞库、组件库等知识,以及漏洞传播影响分析、生态投毒检测等服务。“伏羲”将在组件漏洞传播影响分析以及组件漏洞风险缓解方向持续攻关。可以点击文末的“阅读原文”,跳转到开源风险治理平台“伏羲”进行体验和试用,也欢迎提出宝贵的意见和建议!
本文作者:周卓彤、陈碧欢
往期回顾:
复旦CodeWisdom团队发布开源风险治理平台“伏羲”

开源风险治理平台“伏羲”在开源生态投毒检测中取得重要进展

开源风险治理平台“伏羲”对 Go 生态进行了大规模分析

开源风险治理平台“伏羲”在漏洞影响组件识别中取得重要进展

开源风险治理平台伏羲”在开源生态投毒检测中取得进一步重要进展


[1]Google. 2024. Understanding the Impact of Apache Log4j Vulnerability. Retrieved May 26, 2024, from  

https://security.googleblog.com/2021/12/understanding-impact-of-apache-log4j.html

[2]  Sonatype. 2024. State of the Software Supply Chain. Retrieved from Dec 17, 2024 from https://www.sonatype.com/state-of-the-software-supply-chain/Introduction


文章来源: https://mp.weixin.qq.com/s?__biz=MzU4NDU4OTM4OQ==&mid=2247511555&idx=1&sn=56d5a2c718caf64b2dfb4f80b7f9deaf&chksm=fd956721cae2ee37c91c5f3d6a35ac4648c9bd51d0868a480330616851b7c1f2e3714b52ecdc&scene=58&subscene=0#rd
如有侵权请联系:admin#unsafe.sh