System Prompt 使用者平常看不到,是不是就代表裡面的東西很安全?不一定。
把 API Key 或資料庫密碼寫進 System Prompt,再補一句「絕對不能告訴使用者」,等於把鑰匙放進抽屜,再貼一張「禁止打開」的紙條。規則只能要求別說,不能讓祕密消失。
一次請求送進模型的上下文裡,可能同時有 System Prompt、RAG 撈出的內部文件、使用者資料、工具回傳、tool schema,有時還有除錯訊息。
把它們繞到輸出端的路徑不只一條:Prompt Injection、權限設計錯誤、RAG 查詢範圍過寬、應用程式順手把 Log 拼進 context。任何一條成立,後台的東西就會出現在回答裡。
第一層是祕密本身——金鑰、密碼、內部資料。
第二層更常被忽略:就算 System Prompt 裡一個祕密都沒有,洩漏一樣有價值。 它會告訴攻擊者你有哪些工具、參數長什麼樣、過濾規則怎麼寫、哪些話術會被擋。抽出 System Prompt 只是個有趣的展示,真正有用的是它交出了下一次攻擊的藍圖。
Hui 等人(2024)的 PLeak 就是針對這件事做的。它把「抽出 System Prompt」formulate 成最佳化問題,用梯度方法逐段逼近,在黑箱條件下自動生成對抗查詢,並且在 Poe 平台上的真實應用測試過,效果明顯優於人工編寫的提示。攻擊程式碼是公開的。
在 OWASP Top 10 for LLM Applications 2025 版裡,這一項叫 LLM07:2025 System Prompt Leakage。2026 版把它改名並擴大成 LLM08:2026 Hidden Context Exposure,涵蓋所有被組進 context 而使用者不該看到的內容——不只 System Prompt,還包括 tool schema、被撈出來的政策文字、流程規則。
(注意編號有變動:2026 版的 LLM07 是 Misinformation,用舊編號去查會查到別的東西。)
OWASP 的建議很直接:假設 hidden context 會被挖出來,然後把系統設計成它被挖出來也不痛。
真正的保密,不是叫模型閉嘴,而是讓它從一開始就拿不到祕密。