简单说,LLM(大型语言模型)生成出来的代码,可能让我们在面对供应链攻击时脆弱得多。
最新研究发现,AI 生成的那些代码里,竟然藏着一大堆指向根本不存在的第三方库的引用。这简直是给搞供应链攻击的坏蛋们送上了一个绝佳的机会!他们可以趁虚而入,把带毒的软件包塞进正常的程序里,轻轻松松就能偷数据、留后门,或者干别的坏事。
这项研究找来了市面上最常用的 16 个大型语言模型,让它们生成了 57.6 万份代码样本。结果惊人:这些代码里引用的软件包“依赖项”(dependencies)中,有整整 44 万个是“幻觉”出来的——也就是说,它们在现实世界里根本不存在。开源模型最爱“幻觉”,有 21% 的依赖项都链到了不存在的库。解释一下,“依赖项”就像是搭积木时必不可少的一块儿,没了它另一块积木就没法正常工作。有了依赖项,程序员就不用啥都自己写,省老鼻子事儿了,它可是现代软件供应链里特别重要的一环。
“幻觉软件包”的那些惊魂瞬间
这些不存在的依赖项,通过加剧一种叫做“依赖项混淆攻击”的手段,给软件供应链带来了大麻烦。这种攻击怎么玩儿呢?简单讲,就是利用软件调用依赖项时可能犯迷糊的机会。比如,坏蛋发布一个恶意软件包,给它起个跟正版一模一样的名字,但版本号弄得更高。有些软件在调用这个依赖项时,一看版本号新的,就可能直接抓取那个恶意版本,而不是正版那个。
这种攻击手法也叫“软件包混淆”,在 2021 年的一次概念验证攻击中首次被公开展示过。那次攻击可厉害了,成功在地球上一些最大公司(你没听错,包括苹果、微软、特斯拉!)的网络上跑了伪造的代码。这,就是软件供应链攻击的一种玩法——目标是从软件最源头下手,把病毒/恶意代码悄悄植入进去,好感染所有下游使用这款软件的用户。
研究的牵头人 Joseph Spracklen 博士(他是德克萨斯大学圣安东尼奥分校的博士生)通过邮件告诉 Ars 网站说:“一旦攻击者用那个‘幻觉’出来的名字发布一个包含恶意代码的软件包,他们就等着模型把这个名字推荐给那些没多想的用户。”“要是用户太相信 LLM 的输出,没仔细检查就安装了那个软件包,藏在恶意软件包里的攻击载荷就会在用户的系统里运行起来。”
在 AI 的世界里,“幻觉”就是指 LLM 吐出来的内容事实不对、没逻辑,或者跟它该干的活儿完全不搭边。幻觉这个毛病一直困扰着 LLM,因为它让 AI 变得不好用,也不那么值得信赖,而且预测和解决起来也特别头疼。在计划于 2025 年 USENIX 安全峰会上发表的一篇论文里,他们就把这种现象正式命名为“软件包幻觉”。
为了搞这项研究,研究人员用了 Python 和 JavaScript 两种编程语言跑了 30 组测试,每组测试生成 19200 份代码样本,总共弄出了 57.6 万份代码。这些样本里一共引用了 223 万个软件包,其中有 440445 个,也就是 19.7%,指向的是不存在的软件包。在这 440445 个“幻觉”软件包里,有 205474 个是独一无二的名字。
让这些幻觉软件包在供应链攻击中特别值得注意的一点是,有 43% 的幻觉软件包在超过 10 次提问中竟然重复出现!研究人员写道:“更进一步说,有 58% 的时候,同一个幻觉软件包在 10 轮生成里不止一次出现,这说明大部分幻觉不是简单的随机错误,而是一种可以重复出现的现象,反复在多轮生成中顽固存在。这太关键了,因为一个老是重复出现的幻觉,对于那些想利用这个漏洞的坏蛋来说更有价值,也让这种利用幻觉的攻击手段变得更可行、威胁更大。”
换句话说,很多幻觉软件包的名字不是随机蹦出来一次就没了。恰恰相反,那些根本不存在的软件包名字,很多时候会反复被 AI 编出来。攻击者就可以抓住这个规律,找出那些被 AI 反复“幻觉”出来的、不存在的软件包名字。然后,他们就用这些名字发布恶意软件,就等着大量开发者“中招”、把它们下载到自己的系统里。
研究还发现,不同的 LLM 和编程语言产生幻觉软件包的比例差异很大。像 CodeLlama 和 DeepSeek 这些开源 LLM,平均有近 22% 的软件包是幻觉出来的,而商业模型(比如 ChatGPT 系列)只有略高于 5%。用 Python 写的代码比 JavaScript 代码产生的幻觉少,Python 代码平均近 16%,而 JavaScript 代码平均略高于 21%。当被问及原因时,Spracklen 博士写道:
这问题挺难回答的,因为大型语言模型这玩意儿太复杂了,很难直接追溯因果。不过,我们确实观察到商业模型(比如 ChatGPT 系列)和开源模型之间存在显著差异,这几乎肯定是因为商业模型的参数量要大得多。大多数估算认为,ChatGPT 模型的参数量至少是我们测试的开源模型的 10 倍以上,不过它们具体的架构和训练细节都是保密的。有意思的是,在开源模型内部,我们没有发现模型大小和幻觉率之间有明确的联系,这可能是因为它们的参数量都在一个相对较小的范围内。
除了模型大小,训练数据、微调、指令训练、安全调优等方面的差异,很可能都对软件包幻觉率有影响。这些过程本来是为了提高模型的使用便利性和减少某些错误,但它们可能会在软件包幻觉这样的现象上产生意想不到的连锁反应。
同样,JavaScript 软件包幻觉率比 Python 高的原因也难以盖棺定论。我们猜测,这可能是因为 JavaScript 的生态系统里软件包数量大约是 Python 的 10 倍,再加上其命名空间更复杂。面对一个更大、更复杂的软件包“地图”,模型就更难准确回忆起特定的软件包名字,这导致其内部预测的不确定性更大,最终表现为更高的幻觉软件包率。
这些发现,是最新一批证明 LLM 输出“骨子里就不靠谱”的研究。考虑到微软 CTO Kevin Scott 都预测未来五年 95% 的代码将由 AI 生成,希望咱们开发者们都能把这个警告放在心上!
关注【黑客联盟】带你走进神秘的黑客世界