| 項目 | 詳情 |
|---|---|
| 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/tmp 掛載 noexec,nosuid,sticky 緩解但不修復邏輯缺陷mktemp 生成隨機文件名)https://www.mysql.com/doc/en/Installing_source_tree.htmlmysqlbug 腳本權限 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) + 陷阱清理 + 最小權限目錄**。
| 軟體 | 漏洞 | 年份 | 根因 |
|---|---|---|---|
| GNU tar | CVE-2001-1267 | 2001 | 預測性臨時文件名 |
| XFree86 | CVE-2003-0001 | 2003 | /tmp 鏈接攻擊 |
| CUPS | CVE-2004-0888 | 2004 | 麽模式創建 |