跨函式脈絡漏洞偵測論文閱讀分析:真正讓 LLM 漏看漏洞的,常常不是它不懂語法,而是你只給它看半個呼叫鏈
跨函式脈絡漏洞偵測論文閱讀分析:真正讓 LLM 漏看漏洞的,常常不是它不懂語法,而是你只給它看半個呼叫鏈
本文由 AI 產生、整理與撰寫。
如果前幾篇在談的是 vulnerability intelligence、agent runtime risk、tool / skill supply chain,那這篇 Vulnerability Detection with Interprocedural Context in Multiple Languages: Assessing Effectiveness and Cost of Modern LLMs 做的事情比較底層,但同樣很重要:它直接問了一個很多團隊其實還沒真的面對的問題——當漏洞不是藏在單一函式裡,而是沿著 caller / callee 關係跨出去時,LLM 到底還看不看得到?
我很喜歡這篇的切點,因為它沒有再把問題停在「模型能不能做 vulnerability detection」這種過度抽象的層次,而是把限制講得更具體:很多漏洞本來就不是 function-local 的。 如果資料流、控制流、權限檢查、資源釋放、驗證邏輯分散在不同函式裡,那你只丟一段 target function 給模型,等於一開始就把最重要的證據切掉了。
- 論文標題:Vulnerability Detection with Interprocedural Context in Multiple Languages: Assessing Effectiveness and Cost of Modern LLMs
- 作者:Wesley K. G. Assunção 等
- 來源:arXiv:2604.08417(2026)
- 研究類型:LLM-based vulnerability detection / interprocedural analysis / multi-language empirical study
這篇論文做了什麼?
作者針對 509 個來自 ReposVul dataset 的漏洞案例,評估四個現代模型在跨函式脈絡下的漏洞偵測表現:
- Claude Haiku 4.5
- GPT-4.1 Mini
- GPT-5 Mini
- Gemini 3 Flash
測試語言則涵蓋 C、C++、Python。更關鍵的是,作者不是只跑單一輸入格式,而是系統性比較三種 context 設定:
- 只有 target function
- target function + callers
- target function + callees
這個設計非常實際。因為很多真實漏洞剛好就卡在這裡:
- 驗證在 caller 做,但危險操作在 callee 做
- 敏感參數一路往下傳,最後才在深層函式出事
- 資源取得、邊界檢查、錯誤處理分散在不同呼叫點
- 單看一個 function 會覺得沒事,拉出呼叫鏈才知道其實 protection 根本沒接上
所以這篇的核心不是「再測一次 LLM 能不能找漏洞」,而是量化 interprocedural context 到底值多少錢、值多少效果、又會帶來多少額外成本。
這篇最重要的提醒:很多漏洞根本不是 local pattern matching 問題
這篇之所以值得看,是因為它把一個很常被忽略的錯誤假設講破:只靠單函式片段做漏洞判斷,往往是在把問題偷簡化。
在安全分析裡,很多關鍵訊號都不在同一塊程式碼:
- 來源資料有沒有 sanitize,可能在上游 caller
- 危險 sink 的真正語義,可能在下游 callee
- 權限檢查與例外處理,可能被包在另一層 helper
- 某個 function 看起來安全,前提卻是呼叫者先保證某個 invariant
也就是說,漏洞不是只存在於 token 序列裡,也存在於函式之間的關係裡。 這點對所有想把 LLM 接進 SAST、code review、secure coding assistant 的團隊都很重要。因為如果輸入切法本身就把關鍵脈絡砍掉,模型再強也只能在殘缺證據上猜。
結果怎麼看?不是單純誰最準,而是誰最划算、誰最能解釋
論文最有意思的地方之一,是它沒有只談 accuracy,而是一起看了 detection effectiveness、inference cost 與 explanation quality。
這很對。因為實務世界不是 leaderboard,真正要落地的問題通常是:
- 這個模型抓得準不準?
- 每掃一次 repo 要花多少錢?
- 它講出來的理由,工程師敢不敢信?
作者的結果顯示,Gemini 3 Flash 在 C 語言漏洞上給出了最好的 cost-effectiveness trade-off,F1 達到至少 0.978,而且每種 configuration 的估計成本約在 0.50–0.58 美元。如果你站在工具建置者的角度,這個數字很值得注意,因為它說的不是「最強模型再贏一次」,而是較輕量模型在合理脈絡供給下,也可能把實用性推到很高。
另一個亮點則是 Claude Haiku 4.5:作者指出它在評估案例中,能夠正確辨識並解釋漏洞的比例達到 93.6%。這點很重要,因為很多安全流程不是只要一個 binary label,而是需要能交給工程師、reviewer 或 AppSec 團隊看的 reasoning。會抓到,跟能說清楚為什麼抓到,是兩回事。
這篇真正有價值的,不只是分數,而是 input design 的啟示
我覺得這篇最值得帶走的,不是哪個模型又多了幾個百分點,而是它其實在提醒大家:LLM-based security analysis 的上限,很大一部分取決於你怎麼包裝問題給模型。
在這類任務裡,prompt engineering 常常不是幾句話術,而是:
- 你有沒有把 caller / callee 關係一起帶進來
- 你提供的是純程式碼,還是有最小必要 execution context
- 你是把 repo 當扁平文本切片,還是保留程式結構
- 你要模型猜 pattern,還是讓它能沿著 dependency chain 推理
這跟近幾篇在講 agent、RAG、knowledge graph 的邏輯其實是同一條線:模型常常不是因為不夠聰明而失敗,而是因為系統沒有把對的上下文送進去。
對多語言安全工具來說,這篇也有實際意義
這篇另一個我認為很實務的點,是它沒有只盯單一語言,而是同時看 C、C++、Python。這件事很重要,因為真實世界的 codebase 幾乎不會只活在一種語言裡:
- 底層 service 可能是 C / C++
- 工具鏈、部署腳本、資料處理常常是 Python
- 安全問題會穿過 FFI、binding、wrapper 與 helper script
如果一個 LLM-based security tool 只能在單一語言、單一函式、單一路徑下看起來漂亮,那它離真正能進組織流程還很遠。這篇至少往前推了一步:它把跨語言 generalization 與 context sensitivity 放進同一個評估框架,讓結果更接近真實工具選型時要考慮的條件。
這篇也順手打臉一種很常見的偷懶做法
現在不少「AI for code security」產品或 demo,很喜歡把問題包成:
- 截一個 function
- 丟進模型
- 請它回答有沒有漏洞
這樣做不是完全沒價值,但它很容易高估系統成熟度。因為一旦進入真實專案,最麻煩的問題往往是:
- 檢查邏輯在別處
- 危險行為藏在 helper chain
- 一段 code 是否安全,取決於它「被誰呼叫、又呼叫了誰」
換句話說,你如果還把漏洞偵測當成單片段分類問題,最後很可能只是把模型訓練成一個比較會說話的 pattern matcher。
當然,這篇也有它的限制
- 它評估的是 ReposVul 上的 509 個案例,仍然不等於真實企業 codebase 的全部複雜度。
- interprocedural context 這裡只先看 callers / callees,不代表已完整覆蓋更長鏈條的全域資料流。
- 成本估算與模型表現會受 API 定價、prompt 模板與 deployment policy 影響。
- 解釋品質雖然很重要,但是否真能穩定支撐 engineering remediation,還需要更多真實流程驗證。
不過這些限制不會改變它最重要的價值:它把漏洞偵測從「單函式猜題」重新拉回「跨函式推理」這個比較像真實世界的方向。
結語:安全分析真正缺的,常常不是更大的模型,而是更完整的程式脈絡
這篇 Vulnerability Detection with Interprocedural Context in Multiple Languages 最值得記住的地方,是它讓問題重新對焦:當 LLM 漏掉漏洞時,原因不一定是模型不行,很多時候只是因為你給它看的程式世界被切得太碎。
對 AppSec、SAST、AI code review 與 secure SDLC 工具來說,這篇的啟示很直接:
- 不要只優化模型,先優化 context construction
- 不要只看 detection rate,也要看 explanation quality 與成本
- 不要把 function-local success 誤認成 repo-level readiness
說到底,漏洞很多時候不是藏在某一行,而是藏在關係裡。 如果工具看不見那些關係,它再聰明,也只能看見半個真相。
