隱藏在代碼中的安全漏洞如同一條通往業務核心數據資產的隱秘通道,極易被黑客盯上和利用。及時識別和修復代碼漏洞對防止黑客入侵和數據泄露至關重要。借助混元大模型, AI代碼助手與代碼安全團隊合作,推出代碼評審(Code Review,下文簡稱CR)之安全漏洞檢出能力,可極大提升公司核心數據資產安全性。
一、背景
代碼漏洞作為一種特殊的代碼缺陷,是黑客竊取數據的主要途徑。業界代碼漏洞導致的安全事件頻繁發生。23年5月,著名文件傳輸系統MoveIt Transfer被曝存在sql注入漏洞,導致2095個組織和超過6200萬人的數據被泄露。同樣在23年5月,梭子魚發現其郵件網關產品存在遠程命令執行漏洞,且已經被黑客利用超過8個月。
CR是保證代碼質量的重要手段,通過CR可以在開發階段提前發現并修復漏洞,避免漏洞流入線上造成嚴重數據泄露,并可極大提升漏洞風險閉環的效率。Steve McConnel在《Code Complete》中提到,通過CR能夠發現高達60%至65%的潛在缺陷,而大多數測試的潛在缺陷發現率僅在30%左右。SmartBear經過實際調研發現,引入代碼CR可以解決節約六成代碼修復成本。
由此可見,代碼漏洞如果不能在上線之前及時解決,流入到線上環境后,不但對業務影響大,而且發現難度高。在CR階段發現并修復漏洞,能夠更及時、高效地避免漏洞引發的安全威脅,保障業務安全穩定運營。
二、傳統代碼漏洞檢測方法的弊端
代碼本質上是一種高維的自然語言。在大模型技術涌現之前,代碼漏洞檢測主要依賴靜態分析:先將代碼解析成低維的語法結構,通過數據流和污點分析對代碼進行掃描,檢測代碼中的漏洞。靜態分析通常需要提供漏洞完整的上下文信息,包括source點(用戶控制入口)、sink點(漏洞作用位置)和數據流(傳播路徑),因此只適用于項目級代碼掃描。
CR 場景中,用戶合入的代碼通常是代碼片段,只包含項目代碼中的一小部分。直接使用靜態分析方法掃描整個項目,以檢測合入代碼的漏洞情況,會引入大量冗余的掃描動作,效率極低。據統計,靜態分析工具對項目級的掃描耗時平均需要20分鐘以上。如果用戶合入代碼后,需要等待幾十分鐘,甚至數個小時才能獲取代碼掃描結果,這遠遠無法滿足開發人員快速迭代的要求。而如果只基于合并的代碼片段進行漏洞檢測,由于沒有完整數據流,靜態分析方法難以奏效。
得益于大模型天然的代碼理解和分析能力,將代碼漏洞檢測回歸到語義層面理解,為代碼片段的漏洞檢測問題提供了新的契機。
三、大模型應用于片段代碼漏洞檢測的可行性探究
(1)利用大模型代碼理解能力分析代碼功能
CR 場景下檢測代碼漏洞的基礎是理解代碼功能。以 SQL 注入為例,檢測 SQL 注入風險的關鍵是識別不合理的SQL語句拼接。然而變量命名、函數用法等在代碼層面有各式各樣的寫法,單純從語言規則層面難以辨別。
利用大模型在代碼理解方面的強大能力,可以正確識別此類代碼功能。
(2)利用大模型上下文理解能力分析數據流
雖然代碼片段缺乏項目級數據流,但是我們依然需要基于代碼片段的上下文,分析是否存在sink 點信息是否會被外部可控。例如數據是否從安全的上下文中獲取,或者代碼片段中是否存在過濾函數等。
利用大模型,可以準確捕獲代碼片段的上下文信息,并且聚焦與漏洞相關的代碼,規避漏洞誤報,提高漏洞檢測準確率。
四、基于大模型的CR場景代碼漏洞檢測落地實踐
從上文可知,大模型的通用代碼理解能力為代碼漏洞檢測提供了良好的基礎。接下來我們詳細介紹如何設計代碼漏洞檢測提示詞,從而更好地發揮大模型的能力。
(1)CoT提升大模型漏洞檢測推理能力
借鑒思維鏈(Chain-of-Thought,簡稱CoT)思想,在提示詞中給出漏洞檢測詳細且明確的推理過程示例,并引導大模型按照步驟逐步分析。
由于大模型會將已輸出的內容作為上下文的一部分,因此顯式輸出推理過程可以有效引導大模型得到正確結果,顯著提升結果準確性。
(2)大模型與傳統規則相結合
即使提供了詳細的推理步驟,但是大模型還是存在偶發事實認定錯誤的情況。例如在明文賬密的場景,只有當賬密直接暴露在代碼中,才有泄露風險。但是大模型會偶發識別錯誤,將變量認定成字符串常數,從而認為存在賬密泄露問題。
這種現象存在一定隨機性,難以通過固定 prompt 模板徹底解決。起初,我們嘗試利用規則的方式消除這種隨機性帶來的誤報。然而在代碼域難以用規則或正則全部枚舉所有情況。
因此我們借助大模型的代碼理解和生成能力,先讓大模型將關鍵代碼內容按照指定模式輸出,然后在一個固定模式下,通過規則規避誤報情況。
(3)大模型輸出結果結構化
如何讓大模型輸出結構化的結果是一個常見的問題。
在CR 漏洞檢測場景中,我們在代碼存在漏洞的情況下,需要向用戶反饋結果,并提示漏洞所在具體的代碼行、漏洞類型、漏洞描述。由此可知,CR 場景要求大模型反饋的信息較多且結構化要求高。
初期我們嘗試了讓大模型在每一部分加入指定前綴,便于后續內容解析,但是經常遇到大模型不按指定格式輸出的情況。如:增加換行、冒號等字符,輸出格式外的額外信息等,最終導致解析失敗。
為了解決這一問題,我們選擇讓大模型按照 json 格式輸出。由于 json 是一種通用的結構化數據,大模型經過廣泛的預訓練可以很好輸出 json 格式數據,使得輸出結果更加準確。
五、CR場景漏洞檢測效果
經過多輪優化,漏洞檢出準確率提升 69%(26%->95%),日均發現 300+個代碼安全風險,可起到在代碼上線前提前阻斷風險的效果。
典型案例 1:成功檢出某業務Web前端代碼中存在AKSK硬編碼。若直接發布到線上環境,黑客掃描網頁即可獲取相應AKSK,進而使用該賬號下的所有資源。可能造成嚴重的數據泄露事故。
典型案例2:?某訂單系統項目中,業務同學在提交代碼時直接將上游變量拼接到 SQL 語句中,引入SQL注入漏洞,被模型成功檢出。若該缺陷代碼發布到線上環境,黑客可從客戶端入口構造惡意輸入,進而直接操作后端 DB,竊取用戶信息和訂單信息,獲取業務核心數據。
典型案例 3:非安全掃描案例,但同樣的,對代碼文件掃描出空指針異常、哈希算法優化、代碼邏輯優化空間成功檢出。在實際用法中,我們將安全掃描和代碼評審封裝成“/cr”命令,使大模型能力更加綜合,用法更加高效。