AIDEFEND in Action AIA-0099 實證研究 發布於 AIA: 2026年10月23日

SSMS Copilot:資料庫指示繞過唯讀檢查,讓 db_owner 取得 sysadmin 權限

Johann Rehberger 測試微軟 SQL Server Management Studio(SSMS,用來管理 SQL Server 的工具)內建的 Copilot AI 查詢助理,發現資料庫擁有者寫入的惡意指示,能誘使 Copilot 借用另一位權限更高的使用者連線來執行 SQL。系統內建以正規表示式判斷是否唯讀的防護機制,未能阻止動態 SQL;研究者最終成功將攻擊者的登入帳號加入 sysadmin 伺服器角色。此外,研究另以直接提示詞示範透過備份工具將資料表內容經由 SMB 傳出;這是另一組獨立測試,目前沒有公開資料顯示這些手法已被用於實際攻擊。

Indirect Prompt InjectionConfiguration PoisoningTool AuthorizationAI Infrastructure
5 項對應的 AIDEFEND 防禦手法
來源: From SELECT to SYSADMIN with SQL Copilot (CVE-2026-65669) 
作者: Johann Rehberger
原文發布: 2026年9月30日

威脅分析

  • 跨越兩道信任邊界: 資料庫擁有者可將惡意指示寫入中繼資料(如 CONSTITUTION.md 或 AGENTS.md),供 Copilot 在組裝提示詞時讀取。原本標榜唯讀的工具隨後直接沿用受害者已驗證的高權限連線送出查詢,而非使用受限的專用身分執行。
  • 動態 SQL 繞過正規表示式唯讀檢查: ReadFromDatabase 工具僅依賴正規表示式黑名單來判定 SQL 是否為唯讀操作。研究者將動態 SQL 包裝於變數中並透過 EXEC 呼叫,順利繞過比對機制,藉由受害者連線的管理員權限將攻擊者登入帳號直接加入 sysadmin 伺服器角色。
  • 獨立的備份工具與 SMB 外洩測試: 研究人員另外以直接提示詞測試 ReadFromDatabase 與 RestoreVerifyBackupFile,示範執行任意 SQL 並透過 SMB 通訊協定將資料表內容外洩至外部伺服器。備份測試屬於獨立的概念驗證成果,並非權限提升後的既定後續步驟。
  • 修補範圍與中繼資料防禦極限: 微軟於 SSMS 22.8.2 版修補此問題(CVE-2026-65669)。雖然 CONSTITUTION.md 提供 agentExecuteAsUser 進行 EXECUTE AS 模擬,但若中繼資料遺失或遭刪除,系統將直接退回使用登入帳號的原始權限。由於具備 db_owner 權限的攻擊者能竄改中繼資料,單靠此設定無法取代由資料庫引擎強制落實的低權限連線。

適用的 5 項 AIDEFEND 防禦手法

AID-H-017.002
Least-Privilege Tool Architecture
極高
使用獨立 SQL 連線,由伺服器權限嚴格限制僅能執行任務所需的查詢動作,明確拒絕變更角色成員、危險預存程序及模擬高權限身分,並以該連線實際測試確認各項操作皆遭資料庫引擎拒絕。指引 G001 的單一用途工具與後端唯讀角色正適用於此,但需配合 SQL Server 的權限模型實作。攻擊者若具備 db_owner 權限,便能直接修改或刪除憲章,導致系統退回原連線權限,因此單靠 agentExecuteAsUser 不能取代真正的低權限登入。備份驗證操作亦應限縮為單一用途且參數受限的介面,並以缺乏任意 SQL 執行權限、權限變更與對外連線能力的專用帳號執行。在未修改的 SSMS 原生環境中,目前可立即落實的做法是改採低權限連線或停用 Copilot;若要替換內建工具則需等待廠商更新。防守方應分別測試備份與資料讀取工具,確認所有未授權操作皆確實遭到阻擋。
AID-H-003.010
Deployed AI Software Vulnerability Remediation Lifecycle
極高
完整盤點企業內部實際執行的 SSMS 執行檔,依微軟發布的漏洞紀錄找出受影響版本,並全面部署 22.8.2 或更新的受支援版本,接著確認實際執行中的版本並進行動態 SQL 繞過的負向測試。僅下載安裝程式不代表全企業端點已完成修補。對於暫時無法升級的主機,應透過集中管理控制項停用 Copilot,直到風險完全排除,且這項補償性控制本身亦須能獨立讀回驗證。
AID-H-004.001
User & Privileged Access Management
高
日常使用 SSMS 的登入帳號,不應該同時持有 sysadmin;只要那條連線能授予伺服器角色,中繼資料裡的指示就能借它把攻擊者加進 sysadmin。會用 Copilot 的管理員平常應該用低權限登入,需要伺服器層級權限時,改透過 PAM 或 just-in-time 角色指派,開一個有時限、有申請理由、且不開啟 Copilot agent 模式的獨立工作階段。另外要定期重新確認哪些帳號握有 sysadmin 與 db_owner。這項控制管的是人的身分與權限;Copilot 工具連線本身的邊界由 AID-H-017.002 負責。
AID-H-021.003
Agent Context Source & Configuration Governance
中
CONSTITUTION.md 與 AGENTS.md 這兩種延伸屬性,應該當成受治理的 agent 指示來源來管,而不是順手寫的說明文件。先建立一份清單,列出哪些資料庫與物件被允許放 Copilot 指示、擁有者是誰、信任層級為何、核准的內容是什麼,再定期雙向比對實際存在的延伸屬性;沒列在清單上或內容被改過的指示,就是一筆要處理的發現。同時配合權限審查,只讓指定擁有者持有能寫入這些屬性的 ALTER 或 db_owner 權限。這能縮小能植入指示的人選、讓多出來的指示現形;不過它擋不住一個合法 db_owner 自己寫入,所以真正決定結果的仍是 AID-H-017.002 的執行邊界。
AID-D-004.003
Runtime Configuration & Policy Drift Detection and Monitoring
中
Copilot 存在資料庫裡的設定一被改動,就要有人知道。定期把實際生效的 CONSTITUTION.md 與 AGENTS.md 延伸屬性和核准版本比對,並用 SQL Server Audit 或 DDL 觸發程序記錄每一次針對這些屬性的 sp_addextendedproperty、sp_updateextendedproperty 呼叫,連同執行者、時間與新內容一起留存;這樣植入的指示會在下一位管理員開啟 Copilot 之前就先變成一筆偵測發現。上游公開的作法範例是 GitOps 與 Kubernetes 環境,這裡需要改寫成 SQL Server 的實作。這是偵測而不是預防,只有在受害者連線執行之前有人處理這筆發現,它才真的幫得上忙。

身為資安防禦者,我們應該這麼做

  • 盤點實際在終端上啟動的 SSMS 版本。受影響的安裝環境應立即升級至受支援的修補版本(22.8.2 或更新版本),並確認執行中的實際版本,同時重複進行負向測試,驗證資料庫讀取與備份工具皆能確實拒絕危險操作。尚未完成修補的主機,應先透過集中管理原則(Group Policy 或 Intune)全面停用 Copilot。
  • 為 Copilot 配置專屬且獨立的低權限 SQL 連線。必須使用該連線實際測試變更角色成員、模擬高權限身分、動態 SQL 與危險預存程序是否皆會被資料庫引擎拒絕,切勿依賴模型或介面所宣稱的「唯讀」狀態。
  • 嚴格審查資料庫延伸屬性權限,控管誰能修改全資料庫層級的 CONSTITUTION.md 與個別物件層級的 AGENTS.md。替每個被允許放置這些指示的資料庫建立擁有者與核准內容的清單,定期和實際生效的延伸屬性比對,並稽核 sp_addextendedproperty 與 sp_updateextendedproperty 的呼叫,讓植入的指示在下一位管理員開啟 Copilot 之前就被看見。即使已設定 agentExecuteAsUser,底層實際登入的連線仍須維持最小權限,並實測當中繼資料遭竄改或刪除時,系統是否不會退回高權限身分。
  • 日常操作 SSMS 的登入帳號不要再掛 sysadmin。需要伺服器層級權限時,改走 PAM 或 just-in-time 角色指派,在另一個不開 Copilot agent 模式的工作階段完成,並定期重新確認 sysadmin 與 db_owner 的成員名單。
  • 用群組原則(Group Policy)或 Intune 集中派送 Copilot 設定:不需要工具執行的主機與帳號直接關閉 agent 模式或 Copilot,主機設定一偏離核准狀態就發出警示通知。
  • 在 SQL Server 主機層級嚴格限制對外(egress)SMB 連線,僅允許連向服務運作絕對必要的伺服器,並實測非授權連線確實遭主機防火牆阻擋。僅限制開發者桌面端的瀏覽器流量,無法防範由資料庫主機發起的對外連線。

結論

AIDEFEND  把本案對應到幾個具體的防禦落點:以資料庫實際權限為後盾的單一用途工具連線、確實驗證部署範圍的 SSMS 修補、對使用 Copilot 的管理員實施特權存取管理、集中強制的客戶端設定,以及對 Copilot 會讀取的資料庫端指示做治理與變更偵測。真正決定可執行動作的邊界,是實際送出 SQL 的資料庫主體身分;中繼資料裡的指示和前端的唯讀分類器,都不能繼承人類管理員的完整連線權限。

最後更新: