查核資訊: 本文於 2026-08-25 重新確認各項資源的官方頁面。OWASP 清單、靶場內容、模型版本與工具介面都可能變動;開始練習前,仍應回到官方文件確認目前狀態。
LLM 應用資安的資源不少,難點是安排學習順序:該先讀威脅分類、練習提示注入,還是直接安裝紅隊工具?
如果一開始就跑掃描器,報告裡會出現一串檢測程式(probe)、判定器(detector)、攻擊策略(attack strategy)與分數,但這些結果本身無法說明問題出現在輸入、模型處理、工具授權或輸出處理的哪個環節。如果只讀風險清單,也很容易記住十個名稱,卻無法判斷外部文件中的指示為什麼能改變 Agent 的工具操作。
先建立威脅地圖,再到安全靶場動手攻擊;接著把問題放回檢索增強生成(RAG)與 AI Agent 的資料流,最後才接上護欄與自動化紅隊工具。每一階段都要留下可檢查的成果,不能只把資源加入書籤。

這套方法不先寫完整答案,再替文章補上參考資料,而是依序進行以下五個步驟:
模型輸出具有變動性,單次成功不代表控制穩定;工具顯示 PASS,也不代表整個應用程式安全。先寫下預測與測試條件,才能判斷實際結果支持原本的預測,還是只是剛好符合預期。
| 階段 | 核心問題 | 主要資源 | 完成後應留下的成果 |
|---|---|---|---|
| 建立威脅地圖 | LLM 應用有哪些資產、信任邊界與常見失敗方式? | OWASP GenAI LLM Top 10、OWASP AISVS | 一張自己的系統圖與初版風險清單 |
| 練習攻擊 | 直接提示注入、間接提示注入與工具濫用如何發生? | Gandalf、HackAPrompt、PortSwigger、Simon Willison 的案例 | 攻擊紀錄、成功條件與未達成攻擊目標的案例 |
| 串接 RAG 與 Agent | 不可信資料如何進入模型的處理範圍,模型輸出又能觸發哪些功能? | PortSwigger、供應商的 Agent 安全文件、自己的最小應用程式 | 資料來源、檢索、模型、工具與輸出處理的信任邊界圖 |
| 驗證防禦 | 哪一道控制負責阻擋、限制或偵測?工具結果能證明到哪裡? | NeMo Guardrails、Prompt Guard、Llama Guard、garak、PyRIT | 有對照組的測試結果、判定方式與限制 |
這四個階段不是依工具難度排列,而是依理解所需的前後關係排列。先知道要保護什麼,才知道靶場裡的成功代表什麼;先看懂攻擊路徑,才知道護欄應放在哪裡;先定義判定方式,紅隊工具的結果才有解讀基礎。
先用 OWASP GenAI LLM Top 10 2026 建立共同語言,辨認提示注入、敏感資訊揭露、供應鏈、資料與模型投毒、不當輸出處理、過度代理能力等風險。Top 10 用來辨認風險,不能直接證明系統已完成安全驗證。
讀 Top 10 時,不要只抄分類名稱。應把每一項風險放回自己的系統,至少回答四個問題:
建立威脅地圖時,可以搭配 OWASP Artificial Intelligence Security Verification Standard(AISVS)1.0。AISVS 是公開的安全要求目錄,每項要求都設計成可測試、可實作與可驗證。Top 10 負責辨認風險,AISVS 提供可驗證的控制要求;依兩份文件整理清單,仍不代表通過 AISVS 或完成合規稽核。
最後,把使用者輸入、系統指示、檢索內容、工具回傳與模型輸出的來源、途中經過的解析與控制,以及能到達的功能或外部系統,畫成自己的資料流圖。
威脅分類提供名稱,靶場讓抽象名詞變成可觀察的行為。練習時不要只收集越獄提示,應該記下攻擊成立的條件。
Gandalf 會隨關卡逐步增加限制,適合用來初步觀察提示注入與防護規則的互動。每完成一關,除了保留成功提示,也要記錄提示利用的機制:角色扮演、格式轉換、資訊拆分、上下文混淆,或判定條件本身的漏洞。
不要把通關解讀為某一種提示可以穩定擊敗所有模型。關卡、模型與防護可能更新,同一句輸入也可能得到不同結果。真正值得留下的是攻擊假設與成功條件。
HackAPrompt 提供提示攻擊題目與競賽形式,適合比較不同策略如何組合。閱讀公開解法時,重點不是複製一句成功提示,而是把它拆成可重複檢查的機制,例如要求模型改寫受限制內容、把目標藏在編碼中,或利用評分規則與輸出格式之間的落差。
競賽題目的成功條件由題目與評分器定義。它能訓練攻擊思路,但不能直接代表真實應用程式的資料授權、工具權限與輸出處理都會以相同方式失守。
PortSwigger Web Security Academy 的 Web LLM attacks 將 LLM 放回 API、外掛與 Web 應用程式的情境,涵蓋 API 攻擊面、過度代理能力、間接提示注入、不安全輸出處理與連鎖利用。這份材料會把提示注入與伺服器端請求偽造(SSRF)、跨網站指令碼(XSS)、存取控制等既有問題連在一起;具備相應的 Web 安全基礎,較容易理解這些攻擊路徑。
練習時要區分兩層結果:模型是否產生了攻擊者想要的內容,以及應用程式是否真的執行了未授權操作。模型偏離指示是重要訊號,真正的影響仍取決於後端是否把模型輸出當成授權、是否限制工具與資源,以及高風險動作是否需要額外確認。
Simon Willison 的 prompt injection 主題頁 長期整理提示注入案例、失敗模式與防禦討論。這個主題頁不是官方標準,也不是循序靶場,適合在實作前後挑選與目前架構相關的文章,檢查系統是否同時接觸外部內容、私密資料與對外通訊,以及三者組合後產生的風險。
LLMSecTest 目前仍處於早期開發階段(pre-alpha),是一套以 pytest 執行 LLM 應用安全測試的框架。部分互動實驗頁面仍可使用,但網站定位與內容正在變動,因此使用前要重新確認目前功能、可用頁面與工具成熟度。
使用者本身是攻擊者時,惡意指示會直接透過使用者輸入進入應用程式,形成直接提示注入。RAG 與 AI Agent 還會處理文件、網頁、電子郵件、資料庫欄位與工具回傳。即使攻擊者無法直接對模型輸入指示,也能把惡意指示藏在應用程式之後會取得的內容裡,形成間接提示注入。
Anthropic 的提示注入防護文件 也把直接與間接提示注入分開:前者通常來自對抗性使用者輸入,後者來自網頁、文件或工具結果等第三方內容。這個分類適合用來檢查自己的資料來源,但實際控制仍要依應用程式架構設計。
接下來,建立一個最小 RAG 或工具呼叫應用程式,並標出以下路徑:
使用者要求
→ 應用程式建立模型請求(request)
→ 檢索或工具取得外部內容
→ 應用程式將外部內容轉成模型能處理的格式
→ 模型產生回覆或工具提案
→ 應用程式驗證身分、資源、參數與動作
→ 顯示結果或執行外部操作
接著用一份正常文件與一份含惡意指示的文件測試同一個問題。記錄檢索器是否選取測試文件、應用程式是否把文件內容送進模型請求、模型輸出是否改變,以及後端是否允許模型提出的操作。四項結果要分開記錄,不能合併成單一的「攻擊成功」。
最後,分開標出三個邊界:哪些資料會進入模型的處理範圍、模型輸出會送到哪些解析或執行元件,以及哪一層程式真正負責資料與動作授權。
等攻擊面與判定方式清楚後,再選工具處理特定問題。這些工具的名稱常一起出現在資源清單裡,實際責任並不相同。
| 工具 | 適合先驗證的問題 | 結果不能單獨證明什麼 |
|---|---|---|
| NeMo Guardrails | 輸入、輸出、主題與其他安全檢查如何編排 | 不能取代應用程式的身分與資源授權 |
| Prompt Guard | 輸入是否具有提示注入或越獄特徵 | 分類結果不是穩定的安全邊界,也不是動作許可 |
| Llama Guard | 輸入與輸出是否符合設定的安全分類 | 不會替後端限制工具參數、資料範圍或副作用 |
| garak | 以多種 probe 與 detector 快速探索模型或系統的失敗方式 | 一輪沒有命中不代表沒有其他攻擊路徑 |
| PyRIT | 編排單輪、多輪、情境式與人工參與的紅隊測試 | 自動評分仍需檢查評分條件、漏判與誤判 |
NeMo Guardrails 適合學習如何在模型前後安排可設定的檢查;Prompt Guard 與 Llama Guard 適合觀察分類器如何產生風險訊號;garak 適合快速執行一批結構化探測;PyRIT 適合編排攻擊策略、測試目標與評分方式,並保存結果。沒有必要為了完成清單而一次接上所有工具。
可以先選一項最小目標,例如「惡意文件被檢索後,應用程式仍不得執行未授權工具」。測試先建立一組正常內容與一組攻擊內容,再加入一項控制,並固定模型、設定、輸入、重複次數與判定方式。完成測試後,比較控制前後的結果,並記錄未涵蓋的限制。
先備知識分成三組:LLM/RAG/Agent 基本運作、Web 安全,以及 Python 搭配任一 LLM API 或本地模型。不必全部讀完才開始;遇到下列情況時再補:
解讀攻擊或防禦結果前,需要先說明資料來源、模型處理的內容、輸出流向,以及哪一層會實際改變外部狀態。
每一步都要留下可檢查的成果,例如系統圖、威脅假設、攻擊紀錄、測試程式、原始結果或限制說明。系統圖、測試紀錄與限制說明能支撐後續文章和安全決策,也能在模型、提示、檢索器或工具權限變更後重新驗證。
每一項資源都應回答明確問題:OWASP 用來建立威脅地圖,靶場用來理解攻擊條件,RAG 與 AI Agent 練習用來畫出信任邊界,護欄與紅隊工具則用來驗證特定控制與擴大測試。
學習 LLM 應用資安可以從最小系統開始:先寫下預測,執行可重複的測試,再用官方資料修正判斷。文章、清單與工具報告只能保存結果與證據,不能代替實際驗證。
本文同步刊載於作者的個人 Blog:閱讀原文。