Linux

非特權文件如何啟用有效位?(POSIX 能力)

  • May 7, 2022

我試圖了解 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 種情況。非特權文件啟用了有效位。它沒有能力(因為它沒有特權),所以

  1. 非特權文件怎麼可能啟用有效位?
  2. 即使有效位不影響文件的特權狀態,我們應該在沒有允許或有效功能的情況下將其設置為啟用嗎?

所以,我的問題是,可能會出現什麼具體情況導致第 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。

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