赞
踩
MalWuKong:快速、准确、多语言检测 OSS 供应链中的恶意代码中毒
面对软件注册表和管理系统中日益增加的威胁,我们满足了有效检测恶意代码的迫切需求。在本文中,我们提出了一种集成源代码切片、过程间分析和跨文件过程间分析的创新方法,从而提高检测精度并减少误报。这种方法已封装在基于多重分析的框架中,用于自动检测实际软件包中的恶意代码。在 PyPI 和 NPM 等主要第三方软件注册中心的应用中,我们的框架已被证明是有效的,可从连续五周内监控的总共 169,640 个恶意软件包中识别出 130 个恶意软件包。这项工作推进了当前最先进的恶意代码检测解决方案,在加强软件供应链防御方面展示了重大的实际影响。
在当今的数字互联时代,Python Package Index (PyPI) 和 Node Package Manager (NPM) 等软件注册表和管理系统在提高开发效率和代码可重用性方面发挥着关键作用。然而,随着这些注册表随着开源贡献而蓬勃发展,它们本质上就带来了潜在的威胁,它们是恶意代码扩散的成熟平台。这种阴险的恶意软件伪装在有用的软件包中,可以从事秘密活动,例如未经授权的网络连接 [1]、隐蔽屏幕或键盘监控 [2]、隐藏进程、保留秘密密码或密钥 [3] 等。这种行为不仅危害计算机系统的可靠性,还会给用户带来严重的损失和风险。特别令人担忧的是对软件供应链的影响,因为受损的软件包可能会渗透到众多应用程序中,从而扩大影响范围。
解决恶意源代码检测的复杂挑战存在三个主要障碍。首先,基于二进制的病毒扫描引擎的有效性受到阻碍是由于编程语言的广泛性和威胁不断变化的性质,导致无法准确检测隐藏的恶意软件。其次,现有的检测技术对于单文件和完整源代码评估至关重要,但往往会忽视威胁或在大规模软件注册表环境中出现问题。最后,尽管对恶意代码进行了广泛的研究,包括可追溯性分析和程序解构,但现有的恶意软件检测方法(例如基于规则的扫描和过程内分析[4])需要大量的体力劳动,并且常常产生不令人满意的准确性。即使引入了用于自动检测的人工智能,但缺乏全面的跨文件分析方法也加剧了这些方法的不精确性。这些相互交织的挑战凸显了迫切需要一种创新、强大的解决方案来增强对软件注册表中恶意源代码的检测和预防。
确定了这些挑战后,我们利用通过手动验证的试点研究获得的见解(将在第三部分详细介绍),继续构建解决这些具体问题的解决方案。我们的第一个关键见解是从传统的基于二进制的扫描引擎转向更复杂的源代码切片方法,从而提高恶意代码检测的有效性。源代码切片允许访问原始且丰富的代码形式,从而能够收集更深入的信息。相反,二进制扫描引擎仅处理编译代码,其中某些高级语言功能在编译过程中可能会丢失或变得模糊。值得注意的是,与只能在软件构建后使用的二进制扫描器不同,基于源代码的检测可以在软件开发的早期阶段进行干预。这允许在代码提交之前早期识别和纠正潜在的恶意代码或安全漏洞,从而降低与后期修复相关的成本和风险。
我们的第二个关键见解是将过程间分析与详细的程序切片相集成,从而能够精确解释恶意行为及其上下文。在试点研究中(将在第三部分详细介绍),我们深入探讨了现实世界中数据丰富的开源软件托管平台中潜在恶意软件包的特征。我们的调查表明,现实世界中的恶意代码通常表现出一定程度的复杂性,触发过程的多样性和隐蔽性超出了通常的预期。因此,为了有效检测大规模的现实恶意代码活动,需要针对恶意语义进行更细致、更深入的分析。因此,我们将过程间分析与更细粒度的程序切片相结合,从宏观和微观的角度全面审视和解释程序,帮助我们准确定位恶意行为的触发路径及其相关上下文。特别是,为了降低检测过程的高误报率,我们通过利用跨文件过程间分析进一步增强了我们的方法。该策略使我们能够通过 API 和污点分析更好地理解代码语义,并为更系统、更有效地检查链上代码中的恶意行为提供新的视角。
我们的工作。基于我们的两个关键见解,我们设计并实现了一种新颖的基于多重分析的框架,以自动检测实际软件包中的恶意代码。该框架由三个关键模块组成:更精确的程序分析器、包元数据分析器以及利用定制检测规则和语义分析的恶意行为检测器。我们将程序间和跨文件分析集成到我们的框架中,增强了其检测恶意代码的能力。我们已将此框架应用于广泛使用的第三方软件注册中心,包括 PyPI 和 NPM。经过五周的连续监控,我们的框架从这两个注册表中的总共 169,640 个软件包中有效地识别出了 130 个恶意软件包,其中 NPM 中有 23 个,PyPI 中有 107 个。这些发现证明了我们的框架的高效性和实用性。
我们总结了本文的主要贡献如下:
创新的恶意软件检测方法。我们开发了一种复杂的检测方法,集成了源代码切片、过程间分析和跨文件过程间分析,使用 CodeQL 进行解析。这种整体策略提高了检测精度,改进了对恶意行为和上下文的解释,并成功降低了误报率。
卓越的功效和增强的可用性。我们在我们构建的地面实况数据集上对 MALWUKONG 与最先进的方法进行了多维比较。结果表明,我们的方法在检测精度、粒度和工具可用性方面提供了更高更好的实现。
现实世界的实际影响。我们的创新检测方法已成功应用于 PyPI 和 NPM 等现实世界的软件注册表。我们从连续五周监控的总共 169,640 个恶意包中识别出 130 个恶意包 [5]。引人注目的是,我们发现了一系列以前未被检测到的恶意 NPM 软件包,这些软件包试图通过 NPM 平台分发网络钓鱼链接或恶意软件。
开源社区的发展及其软件使用的增加刺激了开源软件包的增加。这导致了复杂的依赖网络,虽然有利于开发,但也增加了软件供应链攻击和安全风险的可能性。根据 Snyk 的报告,自 2022 年中期以来,有问题的软件包中的恶意代码显着增加,凸显了向更复杂和晦涩的链上恶意行为的转变。为了便于检测,我们对恶意代码类型进行了分类,如表一所示。请注意,简单地将代码混淆标记为恶意代码(表中列出的 M5),这是许多检测技术普遍采用的方法,不可避免地会导致错误率升高积极的一面。作为缓解措施,我们只关注可能包含加密恶意代码的混淆内容,以便更准确地检测。
在开源软件供应链中的恶意代码检测方面已经开展了大量工作,从威胁检测算法到综合安全框架。两个值得注意的贡献是 MALOSS和 GUARDDOG,它们与我们在本研究中提出的技术进行了仔细检查。特别是,MALOSS 通过构建和分析软件依赖关系图来识别漏洞以及它们如何通过依赖关系传播,从而提供软件供应链安全格局的全面视图。然而,它的检测模式可能会忽略这些结构中未体现的微妙、复杂的模式。另一方面,GUARDDOG 利用静态代码分析和基于规则的方法来发现恶意软件包。然而,它对预定义规则的严重依赖可能会削弱其识别新型恶意策略的能力。我们将在第五节中详细介绍比较。
代码语义分析引擎 [9]、[10]、[11] 是旨在通过创建全面的代码分析来增强代码分析有关源代码的信息,包括语法、控制流、数据流、语义等的工具。特别是,我们在这项工作中利用了 CodeQL。它融合了抽象语法树(AST)、控制流图(CFG)和数据流信息等各种元素。这允许使用类似 SQL 的查询来识别特定的代码模式或潜在的安全漏洞,这些查询能够深入挖掘代码文件的语义信息。它擅长识别传统语法分析或模式匹配工具可能忽略的复杂安全漏洞。 CodeQL 支持多种编程语言,增强了其多功能性。在我们的背景下,CodeQL 极大地提高了我们对恶意代码检测和后续规则制定的理解和解释,使我们能够更深入地了解开源包中恶意代码的语义。
在我们的试点研究中,我们的目标是了解恶意语义在源代码分析中发挥的关键作用,以及如何利用它来增强恶意代码检测。我们的重点是评估 VirusTotal的性能。我们观察到,虽然 VirusTotal 在大多数场景下表现良好,但其解析源代码中恶意语义的效率似乎较弱,导致大量误报和漏报。
为了进行实证分析,我们使用了从 Snyk数据库中随机选择的 100 个恶意 JavaScript 源代码包作为 NPM 包,涵盖了表 1 中列出的所有类别。这些包之前已被确认包含恶意行为,使其成为我们研究的理想样本集。我们的目标是评估 VirusTotal 在扫描这些软件包时的误报率,特别是查看未检测到恶意软件包以及检测到的威胁与软件包中的实际恶意行为类型不一致的情况。
我们观察到 VirusTotal 对大量恶意软件包进行了错误分类,导致误报率高达约 90%。在这 100 个恶意样本中,VirusTotal 只能成功检测到 12 个,其中只有 7 个被 10 多个反恶意软件引擎发现,剩下的正确结果的置信度相对较低,报告的引擎不足 5 个。我们将这种高错误分类率归因于一些限制。其中包括 VirusTotal 无法检测不太常见或巧妙隐藏的恶意活动,对恶意行为类型的分类不准确,以及在识别代码中的特定问题区域时缺乏粒度。因此,很明显,像 VirusTotal 这样的传统检测系统在解释复杂的恶意语义时会遇到困难,从而导致检测错误。
为了更直观的解释,我们分别提供了 PyPI 和 NPM 平台的两个案例,每个案例都展示了现代恶意代码的复杂性和传统检测工具的局限性。
NPM 包示例。在我们的第一个案例研究中,如图 2 (a) 所示,我们剖析了名为 @seller-ui 的 JavaScript 包的操作。该软件包使用预安装脚本狡猾地执行一系列伪装成渗透测试的恶意操作。它使用 eval 函数从外部、身份不明的站点下载并执行可疑命令。它可以收集主机名、用户名、网络接口名称等关键信息,还可以建立 SOCKS5 代理以在目标基础设施内创建隧道。这不仅允许数据收集,还允许传输额外的恶意代码或命令,从而创建一个可以破坏系统和窃取数据的隐藏漏洞。尽管存在这一重大威胁,但当该程序包通过 VirusTotal 运行时,所有引擎均未能检测到这些活动。
PyPI 包示例。第二个案例研究检查了 PyPI 平台上名为 duonet 的 Python 包,如图 2 (b) 所示。从表面上看,duonet 看起来像一个典型的 Python 包,但在幕后,它导入(即通过 pip install typesutil)一个能够从远程服务器获取恶意软件的恶意包。它利用毫无戒心的 setup.py 脚本来启动 Python 代码(通过 exec),进而触发名为 W4SP Stealer的基于 Python 的开源木马。该木马旨在窃取各种关键系统信息,包括文件、密码、浏览器 cookie、系统元数据、Discord 代币以及各种加密货币钱包中的数据。尽管恶意方法链广泛且严重,VirusTotal 中的所有引擎均认为 duonet 包无害。
这两个案例研究尽管存在差异,但有一个共同的叙述:现代恶意代码的隐秘、复杂本质,传统检测工具难以捕获。随着攻击者不断改进策略,利用混淆、加密和多步骤执行来欺骗检测工具,简单的规则匹配机制越来越不够用。我们的研究结果强调了应对这一挑战的双重战略的重要性。首先,我们必须深入了解恶意语义,超越表面扫描,了解构成这些威胁核心的复杂交互网络。其次,我们必须通过能够解析这种复杂性并准确标记这些威胁的强大检测工具来加强这种理解。
如图所示,所提出的框架由四个模块组成:1)深入的静态分析器,2)包元信息分析器,3)规则匹配器和 4)用于维护多种语言之间的通用性的 CodeQL 安全引擎。除了详细解释其实现之外,我们还将解释如何应对现有挑战。
为了应对试点研究中观察到的高误报率和不准确的分析,我们实施了彻底的源代码切片分析,如图 4 所示。我们将控制流和数据流与功能信息集成以进行高级污点分析,其灵感来自于C/C++和Java等编译语言中使用的技术。利用封装跨函数或跨文件细节的函数调用链,我们进行过程间分析,捕获更详细、更深刻的源代码语义,目标是提取恶意语义信息。
除了详细的源代码切片分析之外,我们还深入研究了包的元数据信息,并从全局的角度仔细审查某些预安装和设置模块的操作细节。此类信息对于确定注册表中的条目特征和恶意包的影响范围非常有用。
包信息分析:我们的目标是提取和解释结构化信息,以描述每个包的属性和上下文。特别是,我们涵盖基本信息(例如名称、版本和作者)和扩展信息(例如包描述和上传时间)。
预安装/安装脚本分析:检查初步部署阶段的代码行为,尤其是安装阶段的预安装或安装脚本执行情况,可以提高我们的检测效率。在 NPM 中,这些是在 package.json 文件的预安装脚本字段中指定的。在 Python 中,这些脚本通常可以在 setup.py 文件中找到。在图 2 所示的 NPM 示例中,preinstall.js 文件中的恶意代码会向可疑 URL 发送请求,威胁系统安全,而能够触发此恶意代码的操作是部署文件中的 preinstall 语句节点 preinstall.js。类似的操作也可能发生在 Python 包中。
规则匹配机制:为了能够有效检测不同类型的恶意代码行为,需要分别制定具体的检测规则。我们应用 YARA [20] 规则作为每一类恶意行为的检测工具的一部分,如清单 1 所示。例如,我们考虑以下概念来构建敏感数据泄漏规则:敏感数据定义、不常见的通信路径、特定的API 调用。总体来说,我们提供了8类恶意代码的检测规则,包括敏感关键词的预匹配和初步过滤。经过过滤,结合细粒度的代码切片与特定类型恶意代码的规则匹配,以及强大的安全引擎,我们可以获得恶意代码的触发过程。
使用CodeQL进行恶意语义分析:为了进一步提高恶意代码语义检测的准确性,我们利用CodeQL安全引擎作为补充工具。简要分析过程如下: 1).我们之前的方法生成的代码片段被加载到 CodeQL 数据库中。 2)。我们使用一组与官方查询库集成的自定义 CodeQL 查询来执行自动批量扫描。 3)。然后将检测结果与规则匹配分类进行比较,得出最终结论。
我们的评估针对以下研究问题:
此 RQ 研究我们方法的准确性和时间消耗。
最终,MALWUKONG 在 PyPI 上的平均准确率达到 87.1%,召回率达到 94.1%,F 1 得分达到 90.5%。此外,它在 NPM 上的平均准确率为 96.6%,召回率为 85.2%,F 1 得分为 90.5%。对于C/C++,准确率、召回率、F 1 得分分别为88.0%、86.3%、87.1%。
该 RQ 将我们的框架与一些最先进的技术进行了比较。
与现有作品相比,MALWUKONG具有更高的可用性、更好的检测效率,并且采用了更精细的解析方法和更全面的规则。
此 RQ 评估我们框架的实用性和稳健性。
MALWUKONG 可以有效地检测现实世界开源包中涉及全面代码功能和复杂行为的漏洞。
本工作的研究结果的意义概括为以下三个方面。首先,我们的工作强调了语义分析在改进恶意代码检测和解释方面的重要性,有助于更全面地了解软件供应链中的潜在威胁。其次,通过介绍跨文件恶意行为检测的概念,我们说明了其在提高检测准确性和减少报告误报方面的有效性。三、PyPI和NPM中169,640个恶意包的识别和分类说明了我们方法的实用性,并提请人们注意这些生态系统中潜在威胁的程度。总体而言,这些见解增强了检测恶意代码的能力,并鼓励未来的研究,有助于更广泛地努力减轻供应链攻击的影响。
此外,我们对开源生态系统中的恶意代码包保持持续监控。这是通过持续从 PyPI 和 npm 等存储库获取更新并对其进行审查来实现的。同时,我们主动刷新规则数据库,确保我们的检测保持详尽且最新。
尽管做出了重大贡献,我们的工作仍然存在一些值得注意的局限性。首先,我们的模型主要关注 PyPI 和 NPM,而使用 MalWuKong 来探索 RubyGems 和 CPAN 等其他包生态系统。尽管如此,考虑到这些解释语言的共同特征以及基于 AST 的静态分析技术的泛化能力,我们注意到我们的方法具有巨大的潜力,可以轻松适应这些生态系统。其次,虽然我们的方法在语义分析方面表现出色,但检测混淆或加密的恶意代码提出了重大挑战,因为此类代码可能无法表现出在我们的检测技术中至关重要的清晰语义模式。我们的模型还假设恶意代码模式具有一定程度的一致性,但随着攻击者不断创新和发展,这一点可能并不成立。最后,我们的检测模型虽然有效,但并不能完全避免误报,这可能会导致不必要的警报。未来需要开展工作来解决这些限制,并进一步完善对软件供应链中恶意代码的检测。
总之,我们对 PyPI 和 NPM 包管理器的供应链攻击的大规模探索已经取得了重要的发现。我们提出并实现了一个高效、准确、多语言的恶意包检测框架MALWUKONG。该框架结合了恶意代码语义分析,以更好地解释恶意行为,并通过减少误报来提高检测效率。我们的模型支持跨文件恶意行为检测,超越了单个文件分析的限制。利用 MALWUKONG 检测从 PyPI 和 NPM 收集的 169,640 个包,我们发现其中 130 个包存在潜在威胁。通过这项研究,我们的目标是帮助理解和缓解供应链攻击,为未来加强开源软件生态系统安全性的工作铺平道路。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。