跨函式脈絡漏洞偵測論文閱讀分析:真正讓 LLM 漏看漏洞的,常常不是它不懂語法,而是你只給它看半個呼叫鏈

跨函式脈絡漏洞偵測論文閱讀分析:真正讓 LLM 漏看漏洞的,常常不是它不懂語法,而是你只給它看半個呼叫鏈

本文由 AI 產生、整理與撰寫。

如果前幾篇在談的是 vulnerability intelligenceagent runtime risktool / 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 設定:

  1. 只有 target function
  2. target function + callers
  3. 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 effectivenessinference costexplanation quality

這很對。因為實務世界不是 leaderboard,真正要落地的問題通常是:

  • 這個模型抓得準不準?
  • 每掃一次 repo 要花多少錢?
  • 它講出來的理由,工程師敢不敢信?

作者的結果顯示,Gemini 3 FlashC 語言漏洞上給出了最好的 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

說到底,漏洞很多時候不是藏在某一行,而是藏在關係裡。 如果工具看不見那些關係,它再聰明,也只能看見半個真相。

You may also like