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