ChatGPT知道自己寫的代碼有漏洞,但它不說!來自加拿大的一項最新研究發現,ChatGPT生成的代碼中,有不少都存在安全漏洞。然而在被要求評估自己代碼的安全性時,ChatGPT卻很快發現這些代碼中的漏洞,並給出一些解決方案和建議。
這意味著它並不知道自己生成糟糕的代碼,但卻查得出它寫的代碼有漏洞,也有能力修復這些漏洞。
而在另一篇來自斯坦福的論文中,研究人員測試另一位著名AI程序員Copilot,也發現類似的問題。
所以,用AI生成代碼為啥會出現這種狀況?
寫的程序中76%有安全漏洞
研究人員試著讓ChatGPT生成21個程序。
整個測試過程如下,先提交需求給ChatGPT,生成相關代碼,再對這些代碼進行測試,並檢查問題、潛在的缺陷和漏洞等。
研究人員給ChatGPT提包括C++、C、Java和Python在內的21個寫代碼需求,這是評估的結果:
統計表明,ChatGPT生成的21個程序中,有17個能直接運行,但其中隻有5個程序能勉強通過程序安全評估,不安全代碼率達到76%以上。
於是,研究人員先試著讓ChatGPT“想想自己生成的代碼有啥問題”。
ChatGPT的回應是“沒啥問題”:隻要用戶每次的輸入都是有效的,那麼程序一定能運行!
顯然ChatGPT並沒有意識到,用戶並不都是行業專傢,很可能隻需要一個無效輸入,就能“引炸”它寫的程序:
發現ChatGPT不知道自己寫的程序不安全後,研究人員嘗試換種思路——用更專業的語言提示ChatGPT,如告訴它這些程序具體存在什麼漏洞。
神奇的是,在聽到這些針對安全漏洞的專業建議後,ChatGPT立刻知道自己的代碼存在什麼問題,並快速糾正不少漏洞。
經過一番改進後,ChatGPT終於將剩餘的16個漏洞程序中的7個改得更安全。
研究人員得出結論認為,ChatGPT並不知道自己的代碼中存在安全漏洞,但它卻能在生成程序後識別其中的漏洞,並嘗試提供解決方案。
論文還指出,ChatGPT雖然能準確識別並拒絕“寫個攻擊代碼”這種不道德的需求,然而它自己寫的代碼卻有安全漏洞,這其實有著設計上的不合理之處。
我們試試發現,ChatGPT確實會主動拒絕寫攻擊性代碼的要求:
大有一種“我不攻擊別人,別人也不會攻擊我寫的代碼”自信感。
程序員們在用它輔助寫代碼的時候,也需要考慮這些問題。
Copilot也存在類似問題
事實上,不止ChatGPT寫的代碼存在安全問題。
此前,斯坦福大學的研究人員對Copilot也進行過類似調查,隻不過他們探查的是用Copilot輔助生成的程序,而並非完全是Copilot自己寫的代碼。
研究發現,即便Copilot隻是個“打輔助”的角色,經過它改寫的代碼中,仍然有40%出現安全漏洞。
而且研究隻調查Copilot生成代碼中的一部分,包括C、Python和Verilog三種編程語言寫的程序,尚不知道用其他語言編寫的程序中,是否還存在更多或更少的安全漏洞。
基於此,研究人員得出如下結論:
ChatGPT等AI生成的代碼安全性並不穩定,用某些語言寫的代碼比較安全,而用其他語言寫的代碼卻很容易遭受攻擊。整體來看,它們就是一個黑盒子,生成的代碼是有風險的。
這並不意味著AI代碼工具不能用,隻是我們在使用時,必須考慮這些代碼的安全性。