提示詞沙箱的滿分災難:GitLab AI Gateway 漏洞讓自訂 Flow 直接變成 Root Shell
CVE-2026-90970 讓任何具備 Duo Agent Platform 權限的登入使用者,都能透過惡意構造的自訂 Flow 逃離提示詞模板沙箱,在自架 AI Gateway 上執行任意命令。本文解析漏洞內容、受影響範圍,以及 CWE-1336 為何在 AI 基礎設施中一再重演。
2026 年 10 月 2 日,GitLab 發布了一份值得每個資安團隊放進檢討資料夾的修補公告。GitLab AI Gateway——那個位於 GitLab 實例與 AI 模型之間的樞紐服務——出現了一個 CVSS 9.9 分(滿分 10 分)的漏洞,距離滿分只差一口氣。編號 CVE-2026-90970 的這個缺陷,允許任何具備 Duo Agent Platform 存取權限的已登入使用者,透過特別構造的 flow 設定逃離提示詞模板沙箱(prompt-template sandbox),並在 Gateway 上執行任意命令。
事件概要
AI Gateway 是 GitLab AI 技術棧的連接中樞。它負責代理 GitLab 發往語言模型的請求、執行政策控制,而且——在自架(self-hosted)形式下——是專門為了讓重視安全的組織能把 AI 的請求與回應完全留在自家環境內而存在。正是這最後一點讓此漏洞格外刺人:那個以「保護隱私」為賣點的元件,恰恰拿到了接近滿分的風險評分。
攻擊面落在 Duo Agent Platform 的自訂 flow(custom flows)。所謂 custom flow,是使用者打造的 AI 工作流,用來自動化多步驟任務——串接提示詞、工具呼叫與條件邏輯,全部透過「設定」而非「寫程式」完成。GitLab 將此漏洞歸類為 custom flow 提示詞模板的「不當中性化」(improper neutralization)問題:惡意構造的 flow 設定,能夠掙脫原本應該約束它的模板沙箱。
一旦逃脫,攻擊者便能在 Gateway 上執行任意命令。而自架的 AI Gateway 是個極具價值的落點:它持有 JSON Web Token(JWT)的簽署金鑰——GitLab 自己的安裝文件都明言這些必須被視為敏感憑證;它同時維持與 GitLab 實例以及組織 AI 模型供應商兩端的連線。攻陷 Gateway,等於 potentially 同時動搖雙向的信任鏈。
爆炸半徑:比分數看起來窄,也比分數看起來廣
兩個重要的範圍界定事實可以緩解一下恐慌。第一,只有自架 AI Gateway 的部署受影響。GitLab 為其客戶代管 AI Gateway,且在公告發布前就已修復完畢,因此 GitLab.com、GitLab Dedicated 以及使用 GitLab 代管 Gateway 的 self-managed 實例都受到保護,無需採取任何行動。第二,此漏洞需要身份驗證——需要一個具備 Duo Agent Platform 權限的帳號,而不是網路上匿名的陌生人。
但 9.9 分並非虛張聲勢,原因值得細想。CVSS 向量為 AV:N/AC:L/PR:L/UI:N/S:C/C:H/I:H/A:H:可透過網路利用、攻擊複雜度低、所需權限低、無需使用者互動,而且——關鍵在這——發生了範圍變更(scope change)。S:C 代表攻擊會從漏洞元件的安全邊界突破到更大的範圍。機密性、完整性、可用性三者皆為高影響,湊齊了整張災難圖。一個低權限但已通過驗證的使用者,在受害者零互動的情況下,從一個工作流設定檔一路跳到握有 JWT 簽署金鑰的基礎設施上執行命令:這正是 CVSS 設計出來要殘酷打分的場景。
受影響的版本範圍也罕見地廣。從 18.1.6 起的每一個 AI Gateway 版本都在範圍內——修復版本為 19.2.4、19.3.2 與 19.4.1,而且 19.2.4 以下不存在任何已修復版本。這代表整條 18.x 線與 19.1 線都被困在受影響範圍裡。GitLab 的維護政策將 19.4、19.3、19.2 列為接收安全修補的版本,恰好就是拿到修補的三條線。更舊的版本是否會有 backport,公告中並未交代。
似曾相識:今年第二起
如果這個攻擊手法讓你覺得眼熟,那是應該的。2026 年 2 月,GitLab 才修過 CVE-2026-1868——同樣是 9.9 分、同樣可透過構造的 flow 定義觸發、同樣能在 Gateway 上造成阻斷服務或程式碼執行。兩個漏洞都屬於同一類模板引擎弱點:CWE-1336,「模板引擎中特殊元素的不當中性化」。
這是整個故事中最值得工程團隊深思的部分。模板注入(template injection)是一個老牌且被充分理解的漏洞類別——早在 2010 年代初期就開始肆虐各種伺服器端渲染引擎——但如今它換上一層 AI 的外衣捲土重來。當提示詞模板被當成「可信賴的設定」而非「圖靈完備引擎的輸入通道」來對待時,每一則提示詞都是潛在的注入向量,每一份「flow 設定」都是潛在的攻擊載荷。沙箱本來是解答;CVE-2026-90970 證明了沙箱本身也可以是 bug。
功勞歸於 HackerOne 上化名 invisiblemeerkat 的研究人員,他負責任地通報了這個問題。截至揭露日,CISA 針對該 CVE 紀錄附加的評估將「已遭利用」列為 “none”,公告也未提及漏洞是否曾被用於實際攻擊。目前沒有公開的 proof of concept,但一個帶著公開修補雜湊與詳細版本算術的 9.9 分漏洞,本身就是一張長期有效的邀請函——修補窗口是以小時計,不是以週計。
自架者實際上該怎麼做
修復本身很機械化,但有其稜角。AI Gateway 以獨立的 Docker image 或 Helm chart 發布,更新路徑與 GitLab 主實例分開。Docker 部署:停止並移除運行中的容器,拉取並運行新的 image tag(例如 self-hosted-v19.4.1-ee),然後確認 Gateway 健康地回來了。Helm 部署則是在 chart 的 image 設定中指定新的 tag。
尷尬的是公告沒有回答的那些問題。GitLab 的安裝指南告訴管理員要使用與 GitLab minor 版本相符的 gateway image——但公告沒說 19.2.4 的 gateway 是否能搭配 GitLab 19.1 或更早的實例,也沒說舊版本線是否規劃了修補。對於暫時無法更新的 Gateway,公告沒有提供任何 workaround,也沒有記載任何檢查 Gateway 在修補前是否已被攻擊的方法。運行 18.x gateway 線的團隊,面對的可能不是一次簡單的 tag 升級,而是一場計畫外的平台升級。
考量 Gateway 手中握有的東西,修補之後的保守劇本很直接:輪替 JWT 簽署金鑰、稽核 Gateway 對模型供應商的所有對外連線、並審查 custom flow 設定中有沒有任何沒有對應變更單就冒出來的東西。提示詞模板沙箱逃脫,說到底就是一個任意程式碼執行的原語——在證明清白之前,把修補後的環境視為「可能被碰過」。
修補背後的模式
拉遠來看,CVE-2026-90970 嚴絲合縫地嵌進 2026 年的主導資安敘事:AI 基礎設施層正在以機器速度,累積網路基礎設施花十年才根除的同類漏洞。本週 AWS 的 Loom agent 控制平面拿到了 CVSS 10.0;Apple 正在收緊 macOS 的 Full Disk Access,原因正是 AI agent 亂闖私人訊息;而 GitLab——一家對企業客戶的核心承諾就是「有紀律、可稽核的軟體交付」的公司——八個月內在自己的 AI 管線裡出了兩個 9.9 分的模板注入漏洞。
這些都不構成反對 AI 功能的理由。它們構成的是:AI 功能已經是基礎設施了,而基礎設施會被現成的、比目標技術本身更老的攻擊技術拿下。提示詞模板就是模板引擎。Flow 設定就是輸入。沙箱就是邊界。過去十年伺服器端模板注入的每一課都原封不動地適用——唯一新的,是整個產業被迫重新學會它們的速度。
自架 AI Gateway 的營運者應該把這當成當天就要完成的修補。其他人則應該記住這個模式:AI 技術棧裡最危險的 bug,不是什麼針對模型權重的奇異攻擊,而是那些掛著「提示詞」名牌的老朋友。