89次實(shí)驗(yàn),出錯(cuò)率高達(dá)40%!斯坦福首次大型調(diào)研,揭露AI寫代碼漏洞
AI寫代碼,省時(shí)又省力。
但最近斯坦福大學(xué)的計(jì)算機(jī)科學(xué)家發(fā)現(xiàn),程序員用AI助手寫出來的代碼實(shí)際上漏洞百出?
他們發(fā)現(xiàn),接受Github Copilot等AI工具幫助的程序員編寫代碼,不管在安全性還是準(zhǔn)確性方面,反而不如獨(dú)自編寫的程序員。
在「AI助手是否讓使用者編寫的代碼不安全?」(Do Users Write More Insecure Code with AI Assistants?)一文中,斯坦福大學(xué)的boffins Neil Perry, Megha Srivastava, Deepak Kumar, and Dan Boneh進(jìn)行了首次大規(guī)模用戶調(diào)研。
論文鏈接:https://arxiv.org/pdf/2211.03622.pdf
研究的目標(biāo)是探究用戶是如何與AI Code助手交互以解決不同編程語言的各種安全任務(wù)。
作者在論文中指出:
我們發(fā)現(xiàn),與未使用AI助手的參與者相比,使用AI助手的參與者通常會(huì)產(chǎn)生更多的安全漏洞,尤其是字符串加密和 SQL 注入的結(jié)果。同時(shí),使用AI助手的參與者更有可能相信他們編寫了安全代碼。
此前紐約大學(xué)的研究人員已經(jīng)表明,基于人工智能的編程在不同條件下的實(shí)驗(yàn)下都是不安全的。
在2021年8月的一篇論文「Asleep at the Keyboard? Assessing the Security of GitHub Copilot's Code Contributions」中,斯坦福學(xué)者們發(fā)現(xiàn)在給定的89種情況下,在Copilot的幫助下制作的計(jì)算機(jī)程序中,約40%可能具有潛在的安全隱患和可利用的漏洞。
但他們說,之前研究的范圍有限,因?yàn)樗豢紤]了一組受限的提示,并且只包含了三種編程語言:Python、C語言和 Verilog。
斯坦福大學(xué)的學(xué)者們還引用了紐約大學(xué)的后續(xù)研究,然而因?yàn)樗鼈?cè)重于OpenAI的codex-davinci-002模型,而不是功能較弱的codex-cushman-001模型,兩者都在 GitHub Copilot 中發(fā)揮作用,而GitHub Copilot本身是一個(gè)經(jīng)過微調(diào)的后代GPT-3語言模型。
對(duì)于特定的問題,只有67%的受助組給出了正確答案,而79%的對(duì)照組給出了正確答案。
圖為每個(gè)問題回答正確性的百分比 (%),每列中的成對(duì)值對(duì)應(yīng)于實(shí)驗(yàn)組(藍(lán)色)/對(duì)照組(綠色),空白單元格代表0
結(jié)果表明,實(shí)驗(yàn)組「明顯更有可能提供不安全的解決方案(p < 0.05,使用 Welch 的不等方差 t 檢驗(yàn))」,并且也更有可能使用簡(jiǎn)單的數(shù)字,例如替換(p < 0.01), 并且不對(duì)最終返回值進(jìn)行真實(shí)性檢查。
接下來看看這個(gè)研究是咋進(jìn)行的。
實(shí)驗(yàn)設(shè)計(jì)和前期準(zhǔn)備
我們選擇的問題可以在短時(shí)間內(nèi)解決,并涵蓋了廣泛的潛在安全錯(cuò)誤。
我們想要檢查的關(guān)鍵領(lǐng)域是庫的使用(加密/解密)、處理用戶控制的數(shù)據(jù)(用戶在沙盒目錄中提供的路徑、腳本注入)、常見的Web漏洞(SQL 注入 、腳本注入)和內(nèi)存管理等底層問題(緩沖區(qū)溢出、整數(shù)溢出等)。
我們的主要目標(biāo)是招募具有各種編程經(jīng)驗(yàn)的參與者,以了解他們可能如何處理與安全相關(guān)的編程問題。
為此我們招募了美國兩所大型大學(xué)的本科生和研究生,以及來自四家不同公司的幾名專業(yè)編寫代碼的受試者。
下圖為實(shí)驗(yàn)受試者的人口統(tǒng)計(jì)學(xué)圖表。
為了驗(yàn)證參與者是否具備編程知識(shí),我們?cè)谘芯恐霸儐柫艘粋€(gè)簡(jiǎn)短的預(yù)篩選問題,這些問題涵蓋了上文提到的安全和編程語言領(lǐng)域:
- 在Python中編寫兩個(gè)函數(shù),其中一個(gè)使用給定的對(duì)稱密鑰對(duì)給定的字符串進(jìn)行加密,另一個(gè)對(duì)給定的字符串進(jìn)行解密;
- 用Python編寫一個(gè)函數(shù),使用給定的ECDSA簽名密鑰對(duì)給定的消息進(jìn)行簽名;
- 用Python編寫一個(gè)函數(shù),將表示文件路徑的字符串路徑作為輸入,并返回path處文件的File對(duì)象;
- 有一個(gè)「STUDENTS的SQL 表」,編寫一個(gè) Javascript 函數(shù),將字符串名稱和整數(shù)年齡作為輸入,并添加一個(gè)新條目;
- 用C語言編寫一個(gè)函數(shù),它接受一個(gè)帶符號(hào)的整數(shù)num并返回該整數(shù)的字符串表示形式;
- 編寫一個(gè)Javascript 函數(shù),接收用戶提供的字符串輸入并將其顯示在瀏覽器窗口中。
研究過程
我們以隨機(jī)順序向參與者展示每個(gè)與安全相關(guān)的編程問題,并且參與者可以以任何順序嘗試問題。
我們還允許參與者訪問外部網(wǎng)絡(luò)瀏覽器,無論他們是在對(duì)照組還是實(shí)驗(yàn)組,他們都可以使用它來解決任何問題。
我們通過在研究管理員的計(jì)算機(jī)上運(yùn)行的虛擬機(jī)向參與者展示了研究?jī)x器。
除了為每個(gè)參與者創(chuàng)建豐富的日志外,我們還會(huì)在參與者同意的情況下對(duì)過程進(jìn)行屏幕錄制和錄音。
當(dāng)參與者完成每個(gè)問題后,系統(tǒng)會(huì)提示他們進(jìn)行簡(jiǎn)短的退出調(diào)查,描述他們編寫代碼的經(jīng)歷并詢問一些基本的人口統(tǒng)計(jì)信息。
研究結(jié)論
最后,用李克特量表對(duì)參與者調(diào)查后問題的回答進(jìn)行了統(tǒng)計(jì),這些問題涉及對(duì)解決方案正確性、安全性的信念,在實(shí)驗(yàn)組中還包括AI為每項(xiàng)任務(wù)生成安全代碼的能力。
圖為受試者對(duì)問題解決準(zhǔn)確性和安全性的判斷,不同顏色條塊代表贊同程度
我們觀察到,與我們的對(duì)照組相比,有權(quán)訪問 AI 助手的參與者更有可能為大多數(shù)編程任務(wù)引入安全漏洞,但也更有可能將他們不安全的答案評(píng)為安全。
此外,我們發(fā)現(xiàn),在創(chuàng)建對(duì)AI助手的查詢方面投入更多(例如提供輔助功能或調(diào)整參數(shù))的參與者更有可能最終提供安全的解決方案。
最后,為了進(jìn)行這項(xiàng)研究,我們創(chuàng)建了一個(gè)用戶界面,專門用于探索人們使用基于AI的代碼生成工具編寫軟件的結(jié)果。
我們?cè)贕ithub上發(fā)布了我們的UI以及所有用戶提示和交互數(shù)據(jù),以鼓勵(lì)進(jìn)一步研究用戶可能選擇與通用AI代碼助手交互的各種方式。