觸發器在 `INSERT/UPDATE/DELETE` 時自動執行,常用於稽核、同步。但若權限落入惡意使用者(`db_owner`、`sysadmin`、`db_ddladmin`),可植入 **加密觸發器竊取敏感資料(如明文密碼)**,且難被發現。
CREATE TRIGGER dv_admin_history
ON Dv_log
WITH ENCRYPTION
FOR INSERT
AS
BEGIN
-- 解析 inserted 虛擬表中的 l_content 擷取明文密碼
-- 寫入普通用戶可見的隱蔽位置(如某大型文字欄位、自建稽核表)
END;
| 層面 | 措施 |
|---|---|
| 最小權限 | 應用程式帳號**僅授 `db_datareader/db_datawriter` + 執行預存程序**,嚴禁 `db_owner`/`db_ddladmin`。 |
| 審計觸發器 | 定期腳本掃描 `sys.triggers`、`sys.sql_modules`,檢查 `is_encrypted = 1`、非預期建立時間、可疑物件名稱。 |
| DDL 觸發器防範 | 建立 Server/Database 級 DDL Trigger 記錄所有 `CREATE/ALTER/DROP TRIGGER` 事件,寫入不可竄改稽核表/轉發 SIEM。 |
| 敏感資料不落地 | **密碼僅存雜湊 (bcrypt/Argon2/PBKDF2)**,嚴禁明文寫入任何資料表/日誌/錯誤訊息。 |
| 加密物件解密備份 | 保留 DAC 連線/第三方工具解密 `WITH ENCRYPTION` 物件的能力,納入事件應急流程。 |
-- 列出所有加密觸發器
SELECT
SCHEMA_NAME(t.schema_id) AS SchemaName,
t.name AS TriggerName,
OBJECT_NAME(t.parent_id) AS ParentTable,
t.create_date,
t.modify_date
FROM sys.triggers t
JOIN sys.sql_modules m ON m.object_id = t.object_id
WHERE m.definition LIKE '%WITH ENCRYPTION%';
觸發器本身非漏洞,**權限過度授予 + 敏感資料明文儲存 + 缺乏 DDL 審計 = 後門溫床**。落實最小權限、禁用明文密碼、建立 DDL 審計管道,才能從根源斷除此類隱患。