「awk」や「vim」などのコマンド実行をサポートする一般的なバイナリは、setuidビットに従わないのですか?

「awk」や「vim」などのコマンド実行をサポートする一般的なバイナリは、setuidビットに従わないのですか?

私はLinuxシステムを強化しており、コマンドの実行(など)をサポートする一般的なバイナリを使用してsetuidシェルエスケープをテストしたいと思います。awkvim

しかし、私がテストしたすべてのバイナリは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/shsystem()

Cと同様に、awkはsystem()コマンドを直接解析して実行しませんが、bash(またはDebianバージョンのdashまたはbashからこのバグ機能をコピーするさまざまなシェル)の/bin/sh -c場合、コマンドを引数として渡します。/bin/sh有効なuidを実際のuidにリセットします。

print | "cmd"awkまたは"cmd" | getlineawkにも同じ内容が適用されます。つまり、popen(3)任意の呼び出しで行われます/bin/sh -c。ユーザーのログインシェルや環境変数のシェルではなく、常にシステム/bin/shのシェル(またはAndroidなどのシステムのシェル)であることに注意してください。/system/bin/sh$SHELL[1]

これはperlでは異なります:perlのsystem、、、、など。複数の引数で呼び出された場合、またはコマンドにシェルメタ文字が含まれていない場合、コマンドは直接実行されます。execopen "|-"open2open3

$ 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/NPerlでは動作しません。あなた自身を扱うスクリプト名で指定されている場合(形式のみ/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

関連情報