OWASP Top 10 for LLM Applications 全覽

作者: 發布: 19 分鐘閱讀
所屬主題: LLM 應用資安

查核資訊: 本文於 2026-08-05 依 OWASP GenAI Security Project 官方文件初次查核,並於 2026-08-12 完成最終查核。內容以官方資源頁提供的 OWASP Top 10 for LLM Applications 2026 為準。資源頁標示 August 3, 2026;初次查核時的封面縮圖顯示 Version 2026、August 4th, 2026。最終查核時,官方 PDF 的 publication date 欄位已改為待定,因此日期差異只代表官方網站版本交接時的歷史快照,8 月 4 日不是唯一可驗證的正式發布日。初次與最終查核時,官方 genai.owasp.org/llm-top-10/ 著陸頁仍停留在 2025 版,且明說沒有新版;2026 版則由資源頁提供。條目與緩解建議會隨版本演進,引用前請自行確認當下版本。

查 OWASP 清單之前,我先逼自己回答一個問題:不看任何資料,我認為 LLM 應用最重要的風險是什麼?

我列出三條:prompt 注入、權限過大、透露過多資訊。並且預測:官方十條裡,大概七條會落在前兩篇的結論——最小權限、後端授權、sink 驗證——這個範疇。(sink 指資料最後真正被使用的地方,例如送進 SQL、瀏覽器或交給人閱讀;本文用到的專有名詞,下面有一張對照表。)

然後我去對答案,先撞到一件跟內容無關、但更值得先講的事。

查核資訊時,官方網站正處於版本交接

我一開始查的是官方著陸頁。著陸頁列出 2025 十條,還明白告訴我沒有更新版本,所有單一條目頁也都是 2025。

OWASP GenAI Security Project 的 LLM Top 10 著陸頁截圖,於 2026-08-05 擷取。主標題為「2025 Top 10 Risk & Mitigations for LLMs and Gen AI Apps」,內文寫著這是最新的 Top 10,封面縮圖標示 Version 2025、November 18, 2024,頁面提供的另一個版本連結只有 2023-24。下方十張卡片依序為 LLM01:2025 Prompt Injection 到 LLM10:2025 Unbounded Consumption,沒有任何 2026 版的痕跡。

同一時間,2026 版已經出現在官方資源頁,但著陸頁還沒跟上。資源頁標示 August 3, 2026;我在 2026-08-05 擷取的頁面中,封面縮圖顯示 Version 2026、August 4th, 2026。我是在追別的問題時才撞見那個網址,回頭抓 PDF 才發現整份清單重排過。

OWASP 官方資源頁截圖,同樣於 2026-08-05 擷取。標題為「OWASP GenAI LLM Top 10 2026」,頁面日期 August 3, 2026,說明文字寫著這是最新的社群版本,並提到依據數千筆真實 AI 資安事件的新研究。右側封面縮圖的版本區塊經放大後可讀出 Version 2026、August 4th, 2026。

兩張截圖是同一天、同一個官方網站,相隔幾次點選。著陸頁那張用肯定句告訴你這是最新版,資源頁的頁面日期與封面縮圖日期卻不一致。2026-08-12 最終查核時,官方 PDF 的 publication date 欄位又改為待定。這些日期只能說明當時頁面的呈現狀態,不能單獨當成唯一正式發布日。

如果我只信著陸頁,這篇文章會建立在一份已被資源頁上 2026 版取代的清單上,而且會附帶一句「官方沒有預告新版」的錯誤保證。這次的落差本身就是可帶走的教訓:**查框架版本時,著陸頁可能落後正式發布,而且著陸頁會用肯定句告訴你沒有新版。**讀者要查的是發布清單,不能只看導覽頁。

先把名詞講清楚

接下來的十條會密集出現幾個專有名詞。這些名詞在後面二十幾篇還會反覆用到,所以先在這裡一次講清楚,讀者不必為了看懂一條風險而中斷去查別的資料。

名詞 在這篇文章裡的意思
sink 資料最後真正被使用的地方,例如送進 SQL、HTML、shell、Email,或直接交給人閱讀。資安上的通則是:不可信資料抵達 sink 之前,必須先依那個 sink 的規則處理過。
token 模型讀寫文字的最小單位。模型看到的是一長串 token,system prompt、使用者輸入與檢索到的文件在這一串裡沒有型別上的差別。
context 這一次請求交給模型的全部文字,包含 system prompt、對話紀錄、檢索到的資料與工具說明。
system prompt 開發者預先寫好、每次請求都附在最前面的指示,用來規定模型的角色與行為。
RAG 檢索增強生成。系統先從外部知識庫查出相關片段,再連同使用者問題一起交給模型作答。
embedding 把文字轉成一串數字向量,讓系統能用數學上的距離找出語意相近的內容,是 RAG 檢索的基礎。
向量資料庫 專門存放 embedding 並執行相似度檢索的資料庫。
adapter 疊在既有模型之上的小型微調權重(例如 LoRA),可以改變模型行為而不必重新訓練整個模型。
agentic 模型不只回話,還能自行呼叫工具、連續執行多個步驟的用法。
MCP Model Context Protocol,把 AI 應用串接到外部資料、工具與流程的開放標準。
schema 描述資料或工具參數長什麼樣子的結構定義。
provenance 來源履歷:一個模型、資料集或套件從哪裡來、經過誰的手、中途有沒有被改過。
parameterized query 把 SQL 的語法結構與參數分開送給資料庫的寫法,資料因此不可能被當成語法執行。
XSS/SSRF/RCE 跨站腳本、伺服器端請求偽造、遠端程式碼執行。在本文討論的情境中,三種結果都可能出現在下游元件沒有依實際 sink 處理不可信內容,讓不可信內容被當成程式碼、指令或資源位置使用。
Denial of Wallet 攻擊者刻意觸發大量昂貴的推論,把按用量計費的帳單推到無法負擔的程度。

官方十條,先對答案

十條沒有增減,但順序大幅重排。最右欄是對照我事前清單的結果:

2026 條目 一句話講什麼 我的直覺
LLM01 Prompt Injection 輸入改變模型行為;官方明講模型不區分指令與資料,指令與資料是同一串 token 命中
LLM02 Sensitive Information Disclosure 個資、營業秘密、憑證經由輸出或訓練資料外洩 命中(透露過多資訊)
LLM03 Excessive Agency 功能、權限或自主性超過需要,模型做出破壞性動作 命中(權限過大)
LLM04 Supply Chain 預訓練模型、adapter、套件與資料集的來源風險 完全沒想到
LLM05 Data and Model Poisoning 預訓練、微調或 embedding 資料被投毒,可植入後門 完全沒想到
LLM06 Unbounded Consumption 推論資源不設限:服務中斷、Denial of Wallet 與模型抽取 沒想到
LLM07 Misinformation 模型產出看似可信的錯誤內容,被人或下游流程當真並據以行動 沒想到
LLM08 Hidden Context Exposure 隱藏的系統指令與 operational context 被提取、推論或重建 命中(透露過多資訊)
LLM09 Vector and Embedding Weaknesses RAG 的檢索越權、跨租戶洩漏、embedding 反推與知識庫污染 沒想到
LLM10 Improper Output Handling 模型輸出未經驗證就送進下游,導致 XSS、SSRF、RCE 沒列,但前篇結論講的就是這條

三條直覺對上四條官方條目。「透露過多資訊」拆成兩條:LLM02 是洩漏的內容,LLM08 是特別常見的洩漏位置。

我的直覺剛好撞上這一版最具影響的調整。Excessive Agency 從第 6 升到第 3,官方理由是 agentic 部署才是損害真正發生的地方。而 2025 年的 System Prompt Leakage 改名並擴大成 Hidden Context Exposure,範圍從 system prompt 延伸到開發者指令、RAG 取回的政策文字、工具與函式 schema。官方要求開發者假設隱藏 context 必然會被發現,不要在隱藏 context 裡嵌憑證,也不要單獨拿隱藏 context 當授權邊界。

我的直覺涵蓋的是「請求路徑」

第二個預測得用數的。我把十條的緩解策略逐條讀過,看有幾條最後回到最小權限、後端授權與 sink 驗證。

答案是六條:LLM01 要求最小權限與高風險動作的人工核准;LLM02 要求對資料來源套最小權限;LLM03 的三個根因——功能過多、權限過大、自主性過高——整條就是最小權限的反面清單;LLM08 明確寫著不得把隱藏 context 當成授權或政策執行的邊界;LLM09 的核心緩解策略是 permission-aware 的向量資料庫與 fine-grained 存取控制;LLM10 要求依下游 context 重新編碼,並使用 parameterized query。

第七條要看怎麼算:LLM05 的緩解策略包含沙箱與異常偵測,勉強沾邊,但主體是資料治理。所以我的「七條」預測,嚴格說是六條半。

數字接近不是因為我懂 OWASP,而是因為這六條有共同的形狀:這六條的主要防線都能放回一次請求的路徑上。不可信輸入進來、模型讀到不該讀的資料、模型說了或做了不該做的事。前兩篇建立的原則本來就是為請求路徑設計的,所以這套原則能處理這六條落在請求路徑上的部分,不能取代資料攝取、模型更新等生命週期控制。

盲點不在數量,在軸線

預測失準的四條,錯法比數字有趣。

LLM04 與 LLM05 暴露的是只盯著請求路徑時看不到的風險。LLM04 的模型、adapter、套件與資料集在取得、建置或更新時就可能被掉包;LLM05 則可能發生在預訓練、微調、embedding 建立、RAG 資料攝取與持續學習。LLM04 與 LLM05 的共同點不是都發生在部署前,而是風險會污染跨請求保留的模型、資料或元件,單次請求上的權限控制無法取代來源驗證與資料治理。這兩條構成生命週期軸。

LLM07 的 sink 不是程式,是人的信任,或者信任模型輸出的下游流程。摘要器捏造一段內容不需要任何權限,也不經過任何工具呼叫;只要有人信了、或有流程據以行動,損害就成立。官方把 LLM07 定位成系統層級的失效,而不是使用者不夠謹慎。

LLM06 攻擊的是資源。官方對這條的定性是「成本不對稱」:攻擊者用極低代價觸發不成比例的昂貴運算。官方也點名 MCP 這類工具協定會把單一請求放大成連鎖的下游操作,並直言傳統的請求速率限制已經不夠。

所以這張地圖不是十條平行的風險,而是三條軸線:

  1. 請求路徑:LLM01、02、03、08、09、10——最小權限、後端授權、sink 驗證在這裡有效。
  2. 生命週期:LLM04、05——防線是來源驗證、provenance 與資料治理,從部署前延伸到上線後的資料攝取、更新與持續學習流程。
  3. 資源與信任:LLM06、07——防線是額度、成本上限、輸出查證與介面設計,對象是帳單和人。

同一份清單,兩種分法

我把十條分完三軸才發現,2026 版自己也附了一張分類圖,而且分法跟我不一樣。

我的三軸問的是「這條風險該在系統的哪一層防」。官方那張圖問的是另一個問題:「這條風險在一次攻擊裡負責哪個環節」。官方因此把十條排成同心圓,外圈是攻擊的進入向量,中圈是把災害放大的放大器,正中央是最終造成的影響

OWASP Top 10 for LLM Applications 2026 的官方結構圖,標題為 Concentric Threat Flow。最外層「Entry Vectors」放 LLM01 Prompt Injection、LLM04 Supply Chain、LLM05 Data and Model Poisoning;中層「Amplifiers / Machinery」放 LLM08 Hidden Context Exposure、LLM09 Vector and Embedding Weaknesses,以及下緣的 LLM03 Excessive Agency 與 LLM10 Improper Output Handling,四者皆為虛線框;核心「Impacts」放 LLM02 Sensitive Information Disclosure、LLM06 Unbounded Consumption、LLM07 Misinformation。圖下註明攻擊由外向內流動、防禦由內向外推,虛線代表該條目橫跨多層。

官方那張圖有三個訊息不在條目清單裡

這張圖值得多花一分鐘讀,因為只看十條的名稱看不到下面三件事。

第一,攻擊與防禦的方向相反。 圖的下緣寫著攻擊由外向內流、防禦由內向外推。攻擊者從最外圈任何一個入口進來,一路往核心推進;防守方的順序剛好倒過來,先確定核心那三種影響絕對不能發生,再往外決定每一層要擋掉什麼。這個方向感回答了一個常見問題:十條該先修哪一條沒有標準答案,因為要先決定的不是條目順序,而是你這套系統最不能承受哪一種影響。

第二,中間那一圈是把小事變成大事的機制。 LLM08、LLM09、LLM03 與 LLM10 通常不是攻擊的起點。這四條的作用是放大:把一次成功的注入從「模型講錯話」,變成「資料被送出去」或「危險動作被執行」。官方對 LLM08 的描述就直接寫著,隱藏 context 外洩經常放大 LLM01、LLM02、LLM03 與 LLM10。換句話說,同一次注入最後有多嚴重,取決於中圈這四條被打開了幾條。

第三,虛線代表這一條同時待在不只一層。 中圈那四條全是虛線框。以 LLM03 過度代理為例,LLM03 既可以是放大器,也可以是入口。官方在 LLM03 的內文裡列出幾種觸發情境,其中一種是「先前呼叫過的惡意或已被攻陷的工具」——被攻陷的那個工具本身,就是攻擊起點。

圖說還補了一個例外:不是每一次 LLM04 供應鏈攻擊都要由外往內走,有些直接造成影響。官方沒有舉例。不過 LLM04 涵蓋的狀況包含「取得的模型工件並不是宣稱的那一個」,據此推斷,最直接的情形就是下載到的模型或 adapter 本身已被動過手腳。這種攻擊不需要任何注入,惡意行為在元件裡就已經內建好了。

兩種分法交叉起來

用 LLM02 敏感資訊洩漏當例子最清楚。我把 LLM02 放進請求路徑軸,因為擋住 LLM02 的手段是限制模型讀得到什麼、輸出前再驗證一次,那些手段全都落在一次請求的路徑上。官方把 LLM02 放進最內圈,因為資料真的被洩漏出去時,那已經是攻擊的最終結果,不是攻擊的手法。同一條風險,我問「在哪防」得到請求路徑,官方問「是什麼環節」得到最終影響,兩個答案都對。

把兩種分法交叉排開,十條的落點如下:

我的軸線\官方環節 進入向量 放大器 最終影響
請求路徑 LLM01 LLM03、LLM08、LLM09、LLM10 LLM02
生命週期 LLM04、LLM05
資源與信任 LLM06、LLM07

生命週期軸的兩條全部落在進入向量,資源與信任軸的兩條全部落在最終影響。我當初分這兩軸時並沒有看過官方這張圖,兩種分法卻把同樣的條目放進同一組,所以這兩軸不是我硬湊出來的分類。

真正分開的只有請求路徑那一軸:這一軸的六條散落在官方的三個環節裡。原因就是 LLM02 那個例子講的——防線位置相同的風險,在攻擊鏈上可以分別是入口、放大器和結果。

兩種分法我都會留著,但使用時機不同。決定要把防禦人力和預算投到哪一層時,我用自己的三軸,因為三軸的每一格都能直接對應到要改的程式或設定。事後要理解一起已經發生的事故時,我用官方那張圖,因為同心圓能較快指出攻擊從哪個環節進來、又在哪裡被放大。

「注入是模型問題」只對了一半

診斷時我把 prompt 注入歸給「模型本身」,其他歸給「系統整合」。讀完官方條目,這個二分法站不住。

LLM01 的成因確實在模型,而且 2026 版把理由講得比我預期更直白:模型在架構上不區分「指令」與「資料」,指令與資料是同一串 token,因此沒有乾淨對應 parameterized query 的機制。前一篇實驗沒有觀察到語意上的攻擊服從,卻撞到另一個量測陷阱:<untrusted_document> 內的 marker 五次都被模型摘要或引用,exact matcher 因而誤報 5/5。這表示自然語言標記與單一字串 matcher 都不能取代系統層的確定性邊界;LLM01 的通用風險判斷仍應以官方條目與更多適應性測試為準,不能由這十次結果單獨推出。

但往下看 LLM01 的緩解策略:限制模型行為、驗證輸出格式、過濾輸入輸出、最小權限、人工核准、隔離標記不可信內容、對抗性測試——沒有一項是「把模型修好」,全部是系統層手段。

修正後的講法是:**成因可以在模型,防線一定在系統。**歸類一個風險時,問「這是誰的錯」沒有行動價值;要問的是「防線放得回哪一層」。

這一版第一次拿事件紀錄檢驗自己的清單

前面幾版排序靠的是從業者投票。2026 版第一次把投票拿去對照真實事件紀錄:蒐集 7,714 筆事件,其中 6,639 筆細節足以分類,最後投票佔四分之三權重、事件資料佔四分之一。

有意思的是分歧出現在哪裡。Prompt Injection 若只按原始事件數排名,會掉出前十。 官方判定這是「防禦效應」——大家防得兇,乾淨的成功利用比較少進到公開資料庫,公開數字因此低估了風險。官方選擇讓投票壓過資料,把 Prompt Injection 留在第一。Misinformation 則相反:投票偏低、事件紀錄偏高,是落差最大的一條,因此往上移。

這個推論陷阱我上一篇才踩過。當時固定 payload 連測五次都失敗,很容易把「這個 payload 沒成功」誤讀成「這個邊界有效」;OWASP 遇到的是同一個陷阱,只是規模放到七千多筆事件。低數字可能代表防守有效,也可能代表你根本沒測到會成功的那一面——分辨這兩種可能,比拿到數字本身更難。

把十條掛回示範應用

地圖要有用,得掛在具體的系統上。我目前的示範應用只有前篇那個最小摘要器:本機 Ollama 跑 gemma4:latest,system prompt 指定摘要任務,輸入是一份不可信文件,輸出是給人讀的純文字。沒有工具、沒有 RAG、沒有機敏資料。

我原本以為這麼小的應用只沾得上一兩條。逐條掛完,六條已經存在或部分存在:

條目 摘要器現況 系列深入篇
LLM01 已實測但未觀察語意服從:兩組各五次皆為 0/5;標記內 payload 的 exact 5/5 全是摘要或引用造成的誤報 第二週整組注入主題
LLM02 刻意排除:context 裡沒放機敏資料,無東西可洩;這是控制,不是免疫 〈敏感資料防護:PII 偵測與遮罩〉
LLM03 刻意排除:不給工具,所以沒有代理可以過度 〈Excessive Agency:Agent 的過度代理風險〉
LLM04 存在且未處理gemma4 是從 Ollama registry 拉下來的,我沒有驗證過來源與完整性 〈供應鏈風險:模型、套件與 MCP Server〉
LLM05 尚未涵蓋:沒有訓練、微調或 embedding 流程 〈資料投毒與知識庫污染〉
LLM06 部分存在:本機推論沒有帳單,但有算力可被榨取;換成雲端 API 就是 Denial of Wallet 〈濫用與成本攻擊:DoS、Token 榨取與速率限制〉
LLM07 存在:摘要器可能捏造文件裡沒有的內容,讀者信任就是 sink 系列沒有專篇,先併入輸出端防禦與觀測性兩篇
LLM08 存在但低影響:system prompt 只有任務描述,沒有秘密——正好符合官方「風險取決於你放了什麼」的定性 〈Hidden Context Exposure:外洩的不只是 system prompt〉
LLM09 尚未涵蓋:沒有 RAG 與向量資料庫 〈向量資料庫與 Embedding 的安全議題〉
LLM10 部分存在:輸出只給人讀,還沒有 HTML 或 SQL 下游;但「給人讀」本身就是 sink 〈輸出端防禦:過濾、審核與安全渲染〉

這張表修正了我的第三個誤判。我以為「掛不上去」代表應用太小,實際上掛完發現兩件事。

第一,LLM04 已經在系統裡了。我下載模型時完全沒想過供應鏈——這正是「完全沒想到」的條目會咬人的方式:供應鏈風險不在我的威脅模型裡,所以我連「沒驗證」這個狀態都沒意識到。

第二,「尚未涵蓋」和「刻意排除」是兩回事。LLM03 掛不上去,是因為我依前兩篇的結論選擇不給工具;LLM05 掛不上去,只是因為還沒做到那裡。地圖的價值就在讓每一個「沒有」變成「刻意沒有」,其餘的標成待辦。

順帶一提,LLM10 的官方條件清單裡有一項值得畫線:會自動抓取模型輸出中外部資源的用戶端渲染器——瀏覽器、聊天介面、IDE、終端機——Markdown 圖片、連結預覽或 iframe 都算,這些渲染器會透過對外請求把 context 資料送出去。也就是說,把輸出「變好看」這個看起來純屬介面的決定,官方直接列為外流條件。

這份清單管到哪裡為止

2026 版還畫了一條我原本沒意識到的邊界:**模型作為應用裡的「元件」時,風險歸這份清單;一旦模型成為「行動者」——能呼叫工具、跨 session 攜帶記憶、在下游造成後果——風險就移交給 OWASP 的 Agentic 清單。**那是另一份獨立的十條,2025 年 12 月公布,涵蓋目標劫持、工具濫用、身分與權限濫用、記憶與 context 污染、代理間通訊、連鎖失效等。

這條邊界剛好把現在的摘要器留在 LLM 清單這一側。但只要哪天我給摘要器工具或記憶,我就得同時看兩份清單,而不是等這一份長出對應的條目。

帶走的判斷

下次拿到任何 LLM 應用——自己的或別人的——我會沿三條軸線問:

  1. 請求路徑:輸入從哪裡進來、模型讀得到什麼、輸出流向哪些 sink、每個動作誰重新授權?(LLM01、02、03、08、09、10)
  2. 生命週期:模型、adapter、套件、訓練與檢索資料各自從哪來,來源驗證過沒有?(LLM04、05)
  3. 資源與信任:推論的用量與成本有沒有上限?誰會不經查證就相信輸出?(LLM06、07)

然後再加一個這次學到的前置動作:先確認手上這份清單是不是最新版,而且不要只問導覽頁。

清單掛完,最大的未解問題是:目前的示範應用小到只能觀察十條裡的一部分。下一篇把實驗環境正式建起來,讓後面的攻擊與防禦每一條都有地方跑。

參考資料

文中兩張網頁截圖擷取自 genai.owasp.org,擷取時間為 2026-08-05;同心圓結構圖為《OWASP Top 10 for LLM Applications 2026》(Version 2026)第 9 頁的 Figure 2,自官方 PDF 原樣取出,未修改圖說或標籤。OWASP 文件與網站內容除另有標示外採 Creative Commons Attribution-ShareAlike 4.0 授權;OWASP 與其標誌為 OWASP Foundation, Inc. 的商標。兩張網頁截圖僅移除第三方朗讀外掛的浮動元件,未修改頁面文字,其中資源頁那張的版本區塊另加放大標示。

本文同步刊載於 iThome 鐵人賽


《LLM 應用資安:從 Prompt Injection 到 AI Red Teaming》第 3/30 篇

上一篇:傳統資安 vs LLM 資安:到底哪裡不一樣 · 下一篇:打造你的資安實驗室:環境建置