首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL mysqlbug 腳本不安全臨時文件漏洞 (CVE-2004-0381) 分析與修復

     編輯:MySQL 資料庫相關知識

漏洞概覽

項目詳情
CVE 編號CVE-2004-0381
影響版本MySQL 3.20.32a – 4.1.0-alpha (幾乎所有 3.22/3.23/4.0 系列)
組件mysqlbug 錯誤報告腳本 (Shell/Perl 包裝器)
漏洞類型不安全臨時文件創建 (符號鏈接攻擊)
攻擊向量本地用戶
影響任意文件覆蓋/破壞 → 拒絕服務、權限提升
CVSS 2.0~4.6 (AV:L/AC:L/Au:N/C:N/I:P/A:P)

技術根因

mysqlbug 啟動編輯器讓用戶填寫報告,使用固定臨時文件名 $TEMP 和 $TEMP.x。用戶退出編輯器未修改時,腳本執行:

if cmp -s $TEMP $TEMP.x; then
    cp $TEMP /tmp/failed-mysql-bugreport  # 固定路徑,無 O_EXCL
    ...
fi

攻擊者預先建立符號鏈接:

ln -s /etc/passwd /tmp/failed-mysql-bugreport

當受害用戶 (如 root 運行 mysqlbug) 觸發該分支,**任意文件被覆蓋/截斷**。

利用條件與限制

  • 需本地賬號,誘導/等待高權限用戶運行 mysqlbug
  • 競態窗口極短 (編輯器退出到 cp 執行)
  • 現代 Linux /tmp 掛載 noexec,nosuid,sticky 緩解但不修復邏輯缺陷

官方修復方案

  1. 升級:MySQL 4.0.16 / 4.1.1+ 已修復 (使用 mktemp 生成隨機文件名)
  2. 補丁回港:https://www.mysql.com/doc/en/Installing_source_tree.html
  3. 臨時緩解:移除 mysqlbug 腳本權限 chmod 0 mysqlbug 或刪除

代碼級修復模式 (通用最佳實踐)

# 錯誤示範
TMPFILE="/tmp/myapp-$$.tmp"
echo "data" > $TMPFILE

# 正確示範 (Shell)
TMPFILE=$(mktemp /tmp/myapp.XXXXXX) || exit 1
trap "rm -f $TMPFILE" EXIT
echo "data" > $TMPFILE

# 正確示範 (Perl)
use File::Temp qw(tempfile);
my ($fh, $filename) = tempfile(DIR => '/tmp', UNLINK => 1);
print $fh "data";

核心原則:**隨機文件名 + 原子創建 (O_CREAT|O_EXCL) + 陷阱清理 + 最小權限目錄**。

同類歷史漏洞對比

現代防禦體系

  • 編譯器強化:-D_FORTIFY_SOURCE=2 檢測危險函數
  • 內核保護:fs.protected_symlinks=1、fs.protected_hardlinks=1 (Linux 3.6+)
  • 沙箱隔離:systemd PrivateTmp=yes、容器臨時目錄隔離
  • 靜態分析:Coverity/CodeQL 檢測 tmpfile/mktemp 誤用模式
  • 供應鏈審計:SBOM 掃描已知 CVE 組件

結語

CVE-2004-0381 是經典的「臨時文件競態」教科書案例。**修復不僅是升級版本,更是建立安全編碼規範:禁止硬編碼臨時路徑、強制使用安全 API、CI 集成靜態掃描、運行時沙箱隔離**。現代 Linux 內核與 systemd 已在系統層面大幅縮小攻擊面,但應用層邏輯缺陷仍需開發者自律。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
軟體漏洞年份根因
GNU tarCVE-2001-12672001預測性臨時文件名
XFree86CVE-2003-00012003/tmp 鏈接攻擊
CUPSCVE-2004-08882004麽模式創建