Shell

root 無法寫入普通使用者擁有的文件

  • February 21, 2022

我以普通使用者的身份創建一個文件testuser

$ cat > /tmp/zz

該文件歸該使用者所有(如預期的那樣):

$ ls -lA /tmp/zz 
-rw------- 1 testuser testuser 0 Feb 20 15:32 zz

現在,當我嘗試將其截斷為 時root,我的權限被拒絕:

# truncate --size=0 /tmp/zz
truncate: cannot open '/tmp/zz' for writing: Permission denied

當我嘗試使用時strace,我看到以下內容:

openat(AT_FDCWD, "/tmp/zz", O_WRONLY|O_CREAT|O_NONBLOCK, 0666) = -1 EACCES (Permission denied)
write(2, "truncate: ", 10truncate: )              = 10
write(2, "cannot open '/tmp/zz' for writin"..., 33cannot open '/tmp/zz' for writing) = 33
...
write(2, ": Permission denied", 19: Permission denied)     = 19
write(2, "\n", 1

為什麼 root 沒有權限寫入該文件?root 可以刪除文件,但不能寫入。

這是自4.19 版以來 Linux 核心上提供的一種新行為,用於防止使用/tmp/技巧的攻擊。該選項的預設值可能已在以後啟用,或者根據分佈而有所不同。

(特色)避免無意寫入攻擊者控制的 FIFO 或正常文件:禁止在全域可寫粘性目錄中打開不屬於使用者的 FIFO 或正常文件,除非所有者與目錄的所有者相同或文件已打開沒有 O_CREAT國旗。目的是使數據欺騙攻擊更加困難。protected_fifos可以通過 sysctl 為 FIFO ( ) 和正常文件 ( )分別打開和關閉此保護protected_regular,就像符號連結/硬連結保護送出一樣

這是為了保護使用者(包括通常始終具有足夠權限的 root 使用者)寫入目錄中的預先存在的文件,/tmp或者/var/tmp當它打算自己創建它時。

它通過此sysctl切換啟用:fs.protected_regular。可以通過以下方式恢復以前的行為:

sysctl -w fs.protected_regular=0

但這可能會降低整體安全性,同時使像 OP 案例這樣的一些奇怪的“錯誤”消失。

至於為什麼root仍然可以刪除文件,那是因為僅在打開文件進行寫入而不是取消連結時才觸發附加安全功能:truncate -s ...確實打開文件進行寫入,rm不(它使用unlinkunlinkat)。

引用自:https://unix.stackexchange.com/questions/691441