Setuid

支持命令執行的常見二進製文件,如 awkvim,不尊重 setuid 位?

  • March 26, 2020

我正在強化 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/shawk 用於實現其system()功能的命令。

就像它的 C 對應物一樣,awksystem()不會直接解析和執行命令,而是將其作為參數傳遞給/bin/sh -c. 如果/bin/sh是 bash(或 dash 的 Debian 版本,或其他幾個從 bash 複製此錯誤功能的 shell),它會將其有效 uid 重置為真實的。

同樣的事情適用於 awkprint | "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/Nperl 正在處理自己/dev/fd/N(僅形式,而不是/dev/stdinor /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

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