人工智能生成的计算机代码中充斥着对不存在的第三方库的引用,为供应链攻击创造了绝佳机会,可以通过恶意软件包毒害合法程序,窃取数据、植入后门并执行其他邪恶行为,最新发布的研究显示。
这项研究使用了16个最广泛使用的大型语言模型生成576,000个代码样本,发现其中440,000个包依赖是"幻觉",意味着它们并不存在。开源模型幻觉最多,21%的依赖链接到不存在的库。依赖是代码正常工作所需的必要代码组件。依赖可以为开发者节省重写代码的麻烦,是现代软件供应链的重要组成部分。
这些不存在的依赖通过加剧所谓的依赖混淆攻击,对软件供应链构成威胁。这些攻击的工作原理是导致软件包访问错误的组件依赖,例如发布恶意软件包并给它与合法软件包相同的名称但版本更新。在某些情况下,依赖该软件包的软件会选择恶意版本而非合法版本,因为前者看起来更新。
这种攻击形式也被称为包混淆,最初是在2021年通过概念验证漏洞展示,在苹果、微软和特斯拉等全球最大公司的网络上执行伪造代码。这是软件供应链攻击的一种技术,旨在从源头毒害软件,试图感染下游所有用户。
"一旦攻击者发布了以幻觉名称命名的包,并包含一些恶意代码,他们就依赖模型向毫无戒心的用户推荐该名称,"得克萨斯大学圣安东尼分校的博士研究生、首席研究员约瑟夫·斯普拉克伦通过电子邮件告诉Ars。"如果用户相信大语言模型的输出并在未仔细验证的情况下安装该包,攻击者隐藏在恶意包中的有效载荷就会在用户系统上执行。"
在人工智能中,当大语言模型生成事实上不正确、毫无意义或与分配的任务完全无关的输出时,就会发生幻觉。幻觉长期困扰着大语言模型,因为它们降低了模型的实用性和可信度,并且证明难以预测和纠正。在一篇将于2025年USENIX安全研讨会上发表的论文中,他们将这一现象称为"包幻觉"。
在这项研究中,研究人员进行了30次测试,其中16次使用Python编程语言,14次使用JavaScript,每次测试生成19,200个代码样本,总共576,000个代码样本。在这些样本中包含的223万个包引用中,440,445个(占19.7%)指向不存在的包。在这些440,445个包幻觉中,205,474个具有唯一的包名。
使包幻觉在供应链攻击中potentially有用的一个原因是,43%的包幻觉在10次查询中重复出现。"此外,"研究人员写道,"58%的情况下,幻觉包在10次迭代中多次重复,这表明大多数幻觉并非简单的随机错误,而是一种在多次迭代中持续存在的可重复现象。这很重要,因为持续的幻觉对于寻求利用此漏洞的恶意行为者更有价值,使得幻觉攻击向量成为更可行的威胁。"
换句话说,许多包幻觉并非随机的一次性错误。相反,特定的不存在包名称一再重复。攻击者可以通过识别反复出现的不存在包来利用这一模式。然后,攻击者会发布使用这些名称的恶意软件,并等待大量开发者访问。
研究发现,在产生最多包幻觉的大语言模型和编程语言方面存在差异。CodeLlama和DeepSeek等开源大语言模型产生的包幻觉平均百分比接近22%,而商业模型仅略高于5%。用Python编写的代码比JavaScript代码产生的幻觉更少,平均为近16%,而JavaScript则略高于21%。当被问及导致这些差异的原因时,斯普拉克伦写道:
"这是一个困难的问题,因为大语言模型是极其复杂的系统,很难直接追溯因果关系。尽管如此,我们观察到商业模型(如ChatGPT系列)和开源模型之间存在显著差异,这几乎可以肯定归因于商业变体更大的参数数量。大多数估计表明,ChatGPT模型的参数至少是我们测试的开源模型的10倍,尽管确切的架构和训练细节仍然是专有的。有趣的是,在开源模型中,我们没有发现模型大小与幻觉率之间的明确联系,可能是因为它们都在相对较小的参数范围内运行。
"除了模型大小,训练数据、微调、指令训练和安全调整的差异可能都在包幻觉率中发挥作用。这些过程旨在提高模型可用性并减少某些类型的错误,但可能对包幻觉等现象产生意想不到的下游影响。
"同样,JavaScript包比Python包的幻觉率更高也很难明确归因。我们推测,这源于JavaScript生态系统中的包大约是Python的10倍,加上命名空间更复杂。在更大、更复杂的包环境中,模型更难准确回忆特定的包名称,导致其内部预测中的不确定性更大,最终导致更高的包幻觉率。"
这些发现是最新证明大语言模型输出固有的不可信性的研究。随着微软首席技术官凯文·斯科特预测五年内95%的代码将由人工智能生成,希望开发者能够听取这个信息。
这篇文章最初发表在 Ars Technica上。




