Linux
非特權文件如何啟用有效位?(POSIX 能力)
我試圖了解 POSIX 功能原則,它們在 execve() 期間的轉換更具體。我會在我的問題中引用文件中的一些引號:
P'(ambient) = (file is privileged) ? 0 : P(ambient) P'(permitted) = (P(inheritable) & F(inheritable)) | (F(permitted) & P(bounding)) | P'(ambient) P'(effective) = F(effective) ? P'(permitted) : P'(ambient) P'(inheritable) = P(inheritable) [i.e., unchanged] P'(bounding) = P(bounding) [i.e., unchanged] where: P() denotes the value of a thread capability set before the execve(2) P'() denotes the value of a thread capability set after the execve(2) F() denotes a file capability set
據此,首先我們檢查執行檔是否具有特權。特權文件在那裡定義為具有功能或啟用了 set-user-ID 或 set-group-ID 位的文件。
When determining the transformation of the ambient set during execve(2), a privileged file is one that has capabilities or has the set-user-ID or set-group-ID bit set.
然後我們檢查文件的有效位是否啟用。所以現在我們有 4 種情況基於兩個檢查:
- 特權文件啟用了有效位 -> 文件具有必須考慮的功能 -> 計算新功能
- 非特權文件已禁用有效位 -> 文件沒有功能 -> 使用執行緒的環境集
- 特權文件已禁用有效位 -> 文件可能已啟用 setuid/setguid 位。我假設,這意味著根本不應該使用功能,不要混合兩種不同的權限工具 -> 執行緒的有效集變為 0
不過,我無法理解第 4 種情況。非特權文件啟用了有效位。它沒有能力(因為它沒有特權),所以
- 非特權文件怎麼可能啟用有效位?
- 即使有效位不影響文件的特權狀態,我們應該在沒有允許或有效功能的情況下將其設置為啟用嗎?
所以,我的問題是,可能會出現什麼具體情況導致第 4 種情況?
我認為不會出現這種情況,即如果沒有允許或繼承的能力,則無法設置有效位。
看到的行為
setcap
似乎證實了這一點:$ sudo setcap cap_chown=ep mybinary $ getcap mybinary mybinary = cap_chown+ep $ sudo setcap cap_chown=e mybinary $ getcap mybinary mybinary =
但是,正如您所發現的,即使沒有儲存任何功能,也可以設置有效位*:*
$ xattr -l mybinary 0000 01 00 00 02 00 00 00 00 00 00 00 00 00 00 00 00 ................ 0010 00 00 00 00 ....
這些值表示結構
vfs_cap_data
,版本 2 (0x02000001)。在第一個 32 位值中設置的最後一位表示這些是有效的能力;但功能(繼承和允許)都設置為 0。