軟件包幻覺(jué):LLM可能會(huì)向粗心的開(kāi)發(fā)人員提供惡意代碼
大型語(yǔ)言模型傾向于“虛構(gòu)”不存在的代碼包,這可能會(huì)成為一種新型供應(yīng)鏈攻擊的基礎(chǔ),這種攻擊被賽斯·拉森(Seth Larson,Python軟件基金會(huì)的駐場(chǎng)安全開(kāi)發(fā)人員)稱為“slopsquatting”。
一種已知現(xiàn)象
如今,許多軟件開(kāi)發(fā)人員使用大型語(yǔ)言模型(LLM)來(lái)輔助編程,然而,不幸的是,LLM在回答各種話題的問(wèn)題時(shí),會(huì)編造事實(shí)并自信地呈現(xiàn)出來(lái),這一已知傾向也延伸到了編碼領(lǐng)域。這種情況已為人所知一段時(shí)間了。一些研究人員之前已經(jīng)注意到,LLM偶爾會(huì)推薦不存在的軟件庫(kù)和包,并認(rèn)為這種傾向可能會(huì)被攻擊者利用,以這些名稱創(chuàng)建惡意包,并在PyPI(適用于Python)和npm(適用于JavaScript)等流行的代碼存儲(chǔ)庫(kù)中提供下載。
“這些包的虛構(gòu),是在使用LLM生成代碼時(shí)出現(xiàn)事實(shí)沖突錯(cuò)誤而產(chǎn)生的,代表了一種新型的包混淆攻擊,對(duì)軟件供應(yīng)鏈的完整性構(gòu)成了嚴(yán)重威脅,”來(lái)自德克薩斯大學(xué)圣安東尼奧分校、俄克拉荷馬大學(xué)和弗吉尼亞理工學(xué)院的一組研究人員指出。
潛在的惡作劇
該團(tuán)隊(duì)決定檢查包虛構(gòu)問(wèn)題的嚴(yán)重程度,為此,他們測(cè)試了16個(gè)代碼生成AI模型(GPT-4、Claude、CodeLlama、DeepSeek Coder、Mistral等),使用了兩個(gè)獨(dú)特的提示數(shù)據(jù)集。LLM提供了576000個(gè)Python和JavaScript代碼樣本,其中推薦的包中,近20%是不存在的。為了確定LLM是否會(huì)反復(fù)虛構(gòu)相同的包,研究人員使用了一個(gè)包含500個(gè)生成包虛構(gòu)提示的隨機(jī)樣本,并對(duì)每個(gè)提示重復(fù)了10次查詢。
結(jié)果如何?“當(dāng)用同一個(gè)生成了虛構(gòu)的包的提示反復(fù)查詢模型時(shí):43%的虛構(gòu)包在所有10次查詢中都被重復(fù),而39%的虛構(gòu)包在10次查詢中根本沒(méi)有重復(fù)?!薄按送?,58%的情況下,一個(gè)虛構(gòu)的包在10次迭代中會(huì)被重復(fù)一次以上,這表明大多數(shù)虛構(gòu)并非僅僅是隨機(jī)錯(cuò)誤,而是一種在多次迭代中持續(xù)存在的可重復(fù)現(xiàn)象,”他們指出。“這一點(diǎn)很重要,因?yàn)槌掷m(xù)的虛構(gòu)對(duì)試圖利用這一漏洞的惡意行為者來(lái)說(shuō)更有價(jià)值,并使虛構(gòu)攻擊向量成為一個(gè)更可行的威脅?!?/p>
雖然大多數(shù)模型在許多情況下能夠檢測(cè)到自己的虛構(gòu),但問(wèn)題在于,有許多開(kāi)發(fā)人員使用AI模型來(lái)輔助組裝程序,并信任其提供的代碼。
“比如說(shuō),我讓ChatGPT幫我寫(xiě)一些代碼,它寫(xiě)了。現(xiàn)在,假設(shè)在生成的代碼中它包含了一個(gè)包的鏈接,我信任它并運(yùn)行了代碼,但這個(gè)包不存在,它是一個(gè)虛構(gòu)的包。一個(gè)敏銳的對(duì)手/黑客可能會(huì)看到LLM的這種行為(LLM告訴人們使用這個(gè)不存在的包,這個(gè)虛構(gòu)的包),并意識(shí)到這一點(diǎn)。然后,對(duì)手就可以簡(jiǎn)單地用與LLM推薦的虛構(gòu)包(名稱相同)創(chuàng)建一個(gè)新包,并在其中注入一些惡意代碼,”德克薩斯大學(xué)圣安東尼奧分校計(jì)算機(jī)科學(xué)系的副教授穆?tīng)枅D扎·賈德瓦拉(Murtuza Jadliwala)博士說(shuō)。“現(xiàn)在,當(dāng)下一次LLM在生成的代碼中推薦相同的包時(shí),一個(gè)毫無(wú)戒心的用戶執(zhí)行了代碼,這個(gè)惡意包就會(huì)被下載并在用戶的機(jī)器上執(zhí)行。”
最小化包虛構(gòu)
研究人員認(rèn)為,也許許多虛構(gòu)的包在之前存在過(guò),被包含在模型的預(yù)訓(xùn)練數(shù)據(jù)中,并在此期間被刪除了,于是他們對(duì)此進(jìn)行了調(diào)查,并發(fā)現(xiàn)已刪除的包是他們觀察到的包虛構(gòu)現(xiàn)象的“可忽略的來(lái)源”。他們還發(fā)現(xiàn),跨語(yǔ)言虛構(gòu)(例如,當(dāng)一種編程語(yǔ)言中的一個(gè)虛構(gòu)的包具有另一種編程語(yǔ)言中現(xiàn)有包的名稱時(shí))在搜索JavaScript包時(shí)更容易發(fā)生。最后,雖然大多數(shù)虛構(gòu)的包的名字與現(xiàn)有包的名字“有實(shí)質(zhì)性差異”,但這些名字通常很有說(shuō)服力,并且符合上下文。
研究人員已提出了一些建議,以幫助LLM創(chuàng)建者在代碼生成過(guò)程中減少包虛構(gòu),但對(duì)于利用LLM的個(gè)人編碼人員來(lái)說(shuō),一般建議是,在包含提供的代碼之前,先檢查推薦的包。