私はLinuxシステムを強化しており、コマンドの実行(など)をサポートする一般的なバイナリを使用してsetuid
シェルエスケープをテストしたいと思います。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
答え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)
あなたの例では、権限を削除したり「setuidビットを尊重」したりするのではなく、awkが機能を達成するために使用するコマンドについてawk
です。/bin/sh
system()
Cと同様に、awkはsystem()
コマンドを直接解析して実行しませんが、bash(またはDebianバージョンのdashまたはbashからこのバグ機能をコピーするさまざまなシェル)の/bin/sh -c
場合、コマンドを引数として渡します。/bin/sh
有効なuidを実際のuidにリセットします。
print | "cmd"
awkまたは"cmd" | getline
awkにも同じ内容が適用されます。つまり、popen(3)
任意の呼び出しで行われます/bin/sh -c
。ユーザーのログインシェルや環境変数のシェルではなく、常にシステム/bin/sh
のシェル(またはAndroidなどのシステムのシェル)であることに注意してください。/system/bin/sh
$SHELL
[1]
これはperlでは異なります:perlのsystem
、、、、など。複数の引数で呼び出された場合、またはコマンドにシェルメタ文字が含まれていない場合、コマンドは直接実行されます。exec
open "|-"
open2
open3
$ 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などの他のシステムでは、これら2つのコマンドは/bin/sh
権限を削除しないため、同じ内容を印刷します。[2]
メモ:
[1]vim
などの他のプログラムは環境変数をless
使用するため、$SHELL
いくつかのラッパーを指定して簡単に「修正」できます。同様のコマンドに対してシェルにオプションを渡すためにも使用できますvim
。:set shcf=-pc
-p
:!
[2]Perlの例はenv - /tmp/perl 'script'
。echo 'script' | /tmp/perl /dev/fd/0
OpenBSDのPerlはこの引数を拒否し、setuidモードで実行されるとstdinでスクリプトを読み取ることを拒否します-e
(参照これ終了ここ-- OpenBSDにはセキュアなsetuidスクリプトがあると言われています。
しかし、これは/dev/fd/N
Perlでは動作しません。あなた自身を扱うスクリプト名で指定されている場合(形式のみ/dev/fd/N
、/dev/stdin
または以外/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