"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(또는 데비안 버전의 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, 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과 같은 다른 시스템에서는 이 두 명령이 /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

관련 정보