打開網(wǎng)易新聞 查看精彩圖片

簡單說,LLM(大型語言模型)生成出來的代碼,可能讓我們在面對供應(yīng)鏈攻擊時脆弱得多。

最新研究發(fā)現(xiàn),AI 生成的那些代碼里,竟然藏著一大堆指向根本不存在的第三方庫的引用。這簡直是給搞供應(yīng)鏈攻擊的壞蛋們送上了一個絕佳的機(jī)會!他們可以趁虛而入,把帶毒的軟件包塞進(jìn)正常的程序里,輕輕松松就能偷數(shù)據(jù)、留后門,或者干別的壞事。

這項研究找來了市面上最常用的 16 個大型語言模型,讓它們生成了 57.6 萬份代碼樣本。結(jié)果驚人:這些代碼里引用的軟件包“依賴項”(dependencies)中,有整整 44 萬個是“幻覺”出來的——也就是說,它們在現(xiàn)實世界里根本不存在。開源模型最愛“幻覺”,有 21% 的依賴項都鏈到了不存在的庫。解釋一下,“依賴項”就像是搭積木時必不可少的一塊兒,沒了它另一塊積木就沒法正常工作。有了依賴項,程序員就不用啥都自己寫,省老鼻子事兒了,它可是現(xiàn)代軟件供應(yīng)鏈里特別重要的一環(huán)。

“幻覺軟件包”的那些驚魂瞬間

這些不存在的依賴項,通過加劇一種叫做“依賴項混淆攻擊”的手段,給軟件供應(yīng)鏈帶來了大麻煩。這種攻擊怎么玩兒呢?簡單講,就是利用軟件調(diào)用依賴項時可能犯迷糊的機(jī)會。比如,壞蛋發(fā)布一個惡意軟件包,給它起個跟正版一模一樣的名字,但版本號弄得更高。有些軟件在調(diào)用這個依賴項時,一看版本號新的,就可能直接抓取那個惡意版本,而不是正版那個。

這種攻擊手法也叫“軟件包混淆”,在 2021 年的一次概念驗證攻擊中首次被公開展示過。那次攻擊可厲害了,成功在地球上一些最大公司(你沒聽錯,包括蘋果、微軟、特斯拉?。┑木W(wǎng)絡(luò)上跑了偽造的代碼。這,就是軟件供應(yīng)鏈攻擊的一種玩法——目標(biāo)是從軟件最源頭下手,把病毒/惡意代碼悄悄植入進(jìn)去,好感染所有下游使用這款軟件的用戶。

研究的牽頭人 Joseph Spracklen 博士(他是德克薩斯大學(xué)圣安東尼奧分校的博士生)通過郵件告訴 Ars 網(wǎng)站說:“一旦攻擊者用那個‘幻覺’出來的名字發(fā)布一個包含惡意代碼的軟件包,他們就等著模型把這個名字推薦給那些沒多想的用戶?!薄耙怯脩籼嘈?LLM 的輸出,沒仔細(xì)檢查就安裝了那個軟件包,藏在惡意軟件包里的攻擊載荷就會在用戶的系統(tǒng)里運(yùn)行起來。”

在 AI 的世界里,“幻覺”就是指 LLM 吐出來的內(nèi)容事實不對、沒邏輯,或者跟它該干的活兒完全不搭邊?;糜X這個毛病一直困擾著 LLM,因為它讓 AI 變得不好用,也不那么值得信賴,而且預(yù)測和解決起來也特別頭疼。在計劃于 2025 年 USENIX 安全峰會上發(fā)表的一篇論文里,他們就把這種現(xiàn)象正式命名為“軟件包幻覺”。

為了搞這項研究,研究人員用了 Python 和 JavaScript 兩種編程語言跑了 30 組測試,每組測試生成 19200 份代碼樣本,總共弄出了 57.6 萬份代碼。這些樣本里一共引用了 223 萬個軟件包,其中有 440445 個,也就是 19.7%,指向的是不存在的軟件包。在這 440445 個“幻覺”軟件包里,有 205474 個是獨一無二的名字。

讓這些幻覺軟件包在供應(yīng)鏈攻擊中特別值得注意的一點是,有 43% 的幻覺軟件包在超過 10 次提問中竟然重復(fù)出現(xiàn)!研究人員寫道:“更進(jìn)一步說,有 58% 的時候,同一個幻覺軟件包在 10 輪生成里不止一次出現(xiàn),這說明大部分幻覺不是簡單的隨機(jī)錯誤,而是一種可以重復(fù)出現(xiàn)的現(xiàn)象,反復(fù)在多輪生成中頑固存在。這太關(guān)鍵了,因為一個老是重復(fù)出現(xiàn)的幻覺,對于那些想利用這個漏洞的壞蛋來說更有價值,也讓這種利用幻覺的攻擊手段變得更可行、威脅更大?!?/p>

換句話說,很多幻覺軟件包的名字不是隨機(jī)蹦出來一次就沒了。恰恰相反,那些根本不存在的軟件包名字,很多時候會反復(fù)被 AI 編出來。攻擊者就可以抓住這個規(guī)律,找出那些被 AI 反復(fù)“幻覺”出來的、不存在的軟件包名字。然后,他們就用這些名字發(fā)布惡意軟件,就等著大量開發(fā)者“中招”、把它們下載到自己的系統(tǒng)里。

研究還發(fā)現(xiàn),不同的 LLM 和編程語言產(chǎn)生幻覺軟件包的比例差異很大。像 CodeLlama 和 DeepSeek 這些開源 LLM,平均有近 22% 的軟件包是幻覺出來的,而商業(yè)模型(比如 ChatGPT 系列)只有略高于 5%。用 Python 寫的代碼比 JavaScript 代碼產(chǎn)生的幻覺少,Python 代碼平均近 16%,而 JavaScript 代碼平均略高于 21%。當(dāng)被問及原因時,Spracklen 博士寫道:

這問題挺難回答的,因為大型語言模型這玩意兒太復(fù)雜了,很難直接追溯因果。不過,我們確實觀察到商業(yè)模型(比如 ChatGPT 系列)和開源模型之間存在顯著差異,這幾乎肯定是因為商業(yè)模型的參數(shù)量要大得多。大多數(shù)估算認(rèn)為,ChatGPT 模型的參數(shù)量至少是我們測試的開源模型的 10 倍以上,不過它們具體的架構(gòu)和訓(xùn)練細(xì)節(jié)都是保密的。有意思的是,在開源模型內(nèi)部,我們沒有發(fā)現(xiàn)模型大小和幻覺率之間有明確的聯(lián)系,這可能是因為它們的參數(shù)量都在一個相對較小的范圍內(nèi)。

除了模型大小,訓(xùn)練數(shù)據(jù)、微調(diào)、指令訓(xùn)練、安全調(diào)優(yōu)等方面的差異,很可能都對軟件包幻覺率有影響。這些過程本來是為了提高模型的使用便利性和減少某些錯誤,但它們可能會在軟件包幻覺這樣的現(xiàn)象上產(chǎn)生意想不到的連鎖反應(yīng)。

同樣,JavaScript 軟件包幻覺率比 Python 高的原因也難以蓋棺定論。我們猜測,這可能是因為 JavaScript 的生態(tài)系統(tǒng)里軟件包數(shù)量大約是 Python 的 10 倍,再加上其命名空間更復(fù)雜。面對一個更大、更復(fù)雜的軟件包“地圖”,模型就更難準(zhǔn)確回憶起特定的軟件包名字,這導(dǎo)致其內(nèi)部預(yù)測的不確定性更大,最終表現(xiàn)為更高的幻覺軟件包率。

這些發(fā)現(xiàn),是最新一批證明 LLM 輸出“骨子里就不靠譜”的研究??紤]到微軟 CTO Kevin Scott 都預(yù)測未來五年 95% 的代碼將由 AI 生成,希望咱們開發(fā)者們都能把這個警告放在心上!

關(guān)注【黑客聯(lián)盟】帶你走進(jìn)神秘的黑客世界