Capabilities

出自 Arch Linux 中文维基

能力(capability)是 POSIX 1003.1e 標準引入的功能,手冊說明參見capabilities(7)。它允許使用更小的粒度控制超級管理員權限,可以避免 root 權限的濫用。軟件開發者應當儘可能為二進制文件賦予最小權限,而不是過度使用強大的setuid。Arch Linux 中很多軟件包用了能力,例如 fping 中的 fping 就使用了 CAP_NET_RAW (能力的一種)。這樣一來,普通用戶也可以正常執行 fping,效果與使用 setuid 相似,同時減少了fping的潛在安全隱患。

實現[編輯 | 編輯原始碼]

在 Linux 中,能力通過 security 名空間下的擴展屬性(詳見xattr(7))實現。主流 Linux 文件系統均支持擴展屬性 ,包括Ext2,Ext3,Ext4,Btrfs,JFS,XFS 和 Reiserfs 等。

下面的示例使用 getcap 顯示「fping」的能力(Capabilities),以及通過 getfattr 顯示其編碼後的「fping」的能力信息。

$ getcap /usr/bin/fping
/usr/bin/fping = cap_net_raw+ep
$ getfattr -d -m "^security\\." /usr/bin/ping
# file: usr/bin/ping
security.capability=0sAQAAAgAgAAAAAAAAAAAAAAAAAAA=

部分程序能夠自動保留文件的擴展屬性,但更多的情況下需要單獨指定參數,詳情可以參考頁面 文件權限與屬性#保留擴展屬性

在 Arch 中, 能力可以通過包的安裝腳本(如 fping 中的 [1])設置。

管理和維護[編輯 | 編輯原始碼]

如果一個軟件包設置了過度寬鬆的能力,那應當被視為一個錯誤(bug)並上報, 而不是在這裏列舉出來。 同時,因為Arch不支持 MAC/RBAC ,所以設置 CAP_SYS_ADMINCAP_DAC_OVERRIDE ,不應當被視為錯誤(bug)。

警告: 過多的能力會可能會導致權限問題。可以在 Brad Spengler的帖子中查看例子和解釋:False Boundaries and Arbitrary Code Execution.

其他從capabilities受益的程序[編輯 | 編輯原始碼]

下面列舉的軟件中沒有使用 setuid 屬性的文件,但是他們中的部分命令需要 root 權限才能正常使用。通過設置能力,普通用戶可以在不提升權限的情況下使用這些軟件。

下文中能力後面的 +ep 表示相關能力標記為 生效(effective)允許(permitted)。更多信息請參閱 capabilities(7) § File capabilities

軟件 執行命令(以 root 權限執行)
beep(1) setcap cap_dac_override,cap_sys_tty_config+ep /usr/bin/beep
chvt(1) setcap cap_dac_read_search,cap_sys_tty_config+ep /usr/bin/chvt
iftop(8) setcap cap_net_raw+ep /usr/bin/iftop
mii-tool(8) setcap cap_net_admin+ep /usr/bin/mii-tool
mtr(8) setcap cap_net_raw+ep /usr/bin/mtr-packet
nethogs(8) setcap cap_net_admin,cap_net_raw+ep /usr/bin/nethogs
wavemon(1) setcap cap_net_admin+ep /usr/bin/wavemon

實用命令[編輯 | 編輯原始碼]

找到具有 setuid-root 權限的文件:

$ find /usr/bin /usr/lib -perm /4000 -user root

找到具有 setgid-root 權限的文件:

$ find /usr/bin /usr/lib -perm /2000 -group root

為程序臨時授予能力[編輯 | 編輯原始碼]

capsh(1)可以以指定的能力運行程序,而不需要修改文件擴展屬性。

下面的例子展示了如何為 gdb(1) 賦予 CAP_SYS_PTRACE 能力來調試程序:

$ sudo -E capsh --caps="cap_setpcap,cap_setuid,cap_setgid+ep cap_sys_ptrace+eip" --keep=1 --user="$USER" --addamb="cap_sys_ptrace" --shell=/usr/bin/gdb -- -p <pid>

上面的命令用 -E 參數是 sudo 命令中,保留當前用戶環境變量的參數。詳細說明參閱 sudo(8)

nc(1) 監聽低端口號的例子:

$ sudo -E capsh --caps="cap_setpcap,cap_setuid,cap_setgid+ep cap_net_bind_service+eip" --keep=1 --user="$USER" --addamb="cap_net_bind_service" --shell=/usr/bin/nc -- -lvtn 123
Listening on 0.0.0.0 123

參閱[編輯 | 編輯原始碼]