支持命令執行的常見二進製文件,如 awk
和 vim
,不尊重 setuid 位?
我正在強化 Linux 系統,並希望使用支持命令執行的常見二進製文件(如、等)測試(
setuid
基於 - 的)shell 轉義。awk``vim
但是,我測試過的所有二進製文件除了
sh
並且bash
不尊重它們的setuid
位。特別是,
awk
繼續作為普通使用者執行:$ ls -lL /usr/bin/awk -rwsr-xr-x 1 root root 121976 Mar 23 2012 /usr/bin/awk $ id uid=1000(bob) gid=1000(bob) groups=1000(bob) $ awk 'BEGIN{system("id")}' uid=1000(bob) gid=1000(bob) groups=1000(bob)
相反,在給定選項時
bash
執行:root``-p
$ ls -la /bin/bash -rwsr-xr-x 1 root root 1168776 Apr 18 2019 /bin/bash $ /bin/bash -p # id uid=1000(bob) gid=1000(bob) euid=0(root) groups=1000(bob)
有什麼方法可以讓
awk
,vim
,less
等尊重該setuid
位並將命令執行為root
?作業系統:
# cat /etc/os-release PRETTY_NAME="Debian GNU/Linux 10 (buster)" NAME="Debian GNU/Linux" VERSION_ID="10" VERSION="10 (buster)" VERSION_CODENAME=buster ID=debian HOME_URL="https://www.debian.org/" SUPPORT_URL="https://www.debian.org/support" BUG_REPORT_URL="https://bugs.debian.org/"
更新:
parallels@debian-gnu-linux-vm:~$ ls -la /proc/self/fd/0 /dev/fd/0 /dev/stdin lrwx------ 1 parallels parallels 64 Mar 26 08:15 /dev/fd/0 -> /dev/pts/1 lrwxrwxrwx 1 root root 15 Mar 20 19:56 /dev/stdin -> /proc/self/fd/0 lrwx------ 1 parallels parallels 64 Mar 26 08:15 /proc/self/fd/0 -> /dev/pts/1
$ ls -lL /usr/bin/awk -rwsr-xr-x 1 root root 121976 Mar 23 2012 /usr/bin/awk $ awk 'BEGIN{system("id")}' uid=1000(bob) gid=1000(bob) groups=1000(bob)
在您的範例中,不是
awk
放棄特權或不“尊重其 setuid 位”,而是/bin/sh
awk 用於實現其system()
功能的命令。就像它的 C 對應物一樣,awk
system()
不會直接解析和執行命令,而是將其作為參數傳遞給/bin/sh -c
. 如果/bin/sh
是 bash(或 dash 的 Debian 版本,或其他幾個從 bash 複製此錯誤功能的 shell),它會將其有效 uid 重置為真實的。同樣的事情適用於 awk
print | "cmd"
或"cmd" | getline
在 awk 中——它們是通過popen(3)
which calls實現的/bin/sh -c
。請注意,它始終是/bin/sh
(或系統的外殼,例如/system/bin/sh
在 Android 上),而不是使用者的登錄外殼或來自$SHELL
環境變數的外殼。$$ 1 $$這在 perl 中是不同的:perl 的
system
,exec
,open "|-"
,open2
,open3
等如果使用多個參數呼叫它們或命令不包含 shell 元字元,則將直接執行命令:$ id -nu ahq $ ls -l /tmp/perl -rwsr-xr-x 1 dummy_user dummy_user 3197768 Mar 24 18:13 /tmp/perl $ env - /tmp/perl -e 'system("id -nu")' dummy_user $ env - /tmp/perl -e 'system("{ id -nu; }")' ahq
這個例子是在 Debian 10 上的。在其他系統上,比如 FreeBSD 或更舊的 Debian,這兩個命令將列印同樣的東西,因為它們
/bin/sh
不會放棄特權。$$ 2 $$筆記:
**$$ 1 $$**其他程序喜歡
vim
並且less
確實使用$SHELL
環境變數,因此通過將其指向某個包裝器,它們很容易“修復”。vim
您還可以使用:set shcf=-pc
將-p
選項傳遞給用於:!
和類似命令的 shell 。**$$ 2 $$**perl 範例也可以在 OpenBSD 上執行,就像在 FreeBSD 上一樣,前提是您將 替換
env - /tmp/perl 'script'
為更鈍的echo 'script' | /tmp/perl /dev/fd/0
。當以 setuid 模式執行時, OpenBSD 的 perl 將拒絕該
-e
參數並拒絕從標準輸入讀取其腳本(請參閱此處結束的內容——OpenBSD 應該具有安全的 setuid 腳本)。但這不適用於,當作為腳本名稱給出時
/dev/fd/N
perl 正在處理自己/dev/fd/N
(僅形式,而不是/dev/stdin
or/proc/self/fd/N
)。obsd66$ ls -l /tmp/perl -rwsr-xr-x 1 dummy_user dummy_user 10728 Mar 25 18:34 /tmp/perl obsd66$ env - /tmp/perl -e 'system("{ id -nu; }")' No -e allowed while running setuid. obsd66$ echo 'system("{ id -nu; }")' | env - /tmp/perl No program input from stdin allowed while running setuid. obsd66$ echo 'system("{ id -nu; }")' | env - /tmp/perl /dev/stdin Can't open perl script "/dev/stdin": Operation not permitted obsd66$ echo 'system("{ id -nu; }")' | env - /tmp/perl /dev/fd/0 dummy_user
debian10$ su - other_user -c 'perl /dev/fd/7' 7<<<'print "OK\n"' OK debian10$ su - other_user -c 'perl /proc/self/fd/7' 7<<<'print "OK\n"' Can't open perl script "/proc/self/fd/7": Permission denied