ATL*_*ief 4 process permissions shebang interpreter
如果当前用户对文件只有执行 (--x) 权限,解释器(由#!/path/to/interpreter
文件开头指定)在哪个用户下运行?
它不可能是当前用户,因为他没有读取文件的权限。它不能是 root,因为这样解释器中包含的任意代码将获得 root 访问权限。
那么,解释器进程作为哪个用户运行?
编辑:我认为我的问题假设该文件已经被读取到足以知道它指定了哪个解释器,而实际上它不会走那么远。解释执行目标文件的命令的当前 shell(通常是 b/a/sh)会尝试读取它,但会失败。
如果用户对可执行脚本没有读取权限,则尝试运行它将失败,除非她有CAP_DAC_OVERRIDE
能力(例如,她是 root):
$ cat > yup; chmod 100 yup
#! /bin/sh
echo yup
^D
$ ./yup
/bin/sh: 0: Can't open ./yup
Run Code Online (Sandbox Code Playgroud)
解释器(无论失败还是成功)将始终以当前用户身份运行,忽略脚本的任何 setuid 位或 setcap 扩展属性。
可执行脚本与二进制文件的不同之处在于,解释器应该能够打开和读取以运行它们。但是,请注意,它们只是作为参数传递给解释器,解释器可能根本不会尝试读取它们,而是做一些完全不同的事情:
$ cat > interp; chmod 755 interp
#! /bin/sh
printf 'you said %s\n' "$1"
^D
$ cat > script; chmod 100 script
#! ./interp
nothing to see here
^D
$ ./script
you said ./script
Run Code Online (Sandbox Code Playgroud)
当然,解释器本身可能是 setuid 或cap_dac_override=ep
-setcap 二进制文件(或将脚本的路径作为参数传递给此类二进制文件),在这种情况下,它将以提升的权限运行,并且可以忽略任何文件权限。
在 Linux 上,您可以使用以下binfmt_misc
模块绕过对可执行脚本的所有限制(并破坏您的系统 ;-)):
作为根:
# echo ':interp-test:M::#! ./interp::./interp:C' \
> /proc/sys/fs/binfmt_misc/register
# cat > /tmp/script <<'EOT'; chmod 4001 /tmp/script # just exec + setuid
#! ./interp
id -u
EOT
Run Code Online (Sandbox Code Playgroud)
作为普通用户:
$ echo 'int main(void){ dup2(getauxval(AT_EXECFD), 0); execl("/bin/sh", "sh", "-p", (void*)0); }' |
cc -include sys/auxv.h -include unistd.h -x c - -o ./interp
$ /tmp/script
0
Run Code Online (Sandbox Code Playgroud)
雅皮士!
更多信息在Documentation/admin-guide/binfmt-misc.rst
内核源代码中。
该-p
选项可能会导致某些 shell 出现错误(可以简单地删除它),但在较新版本的dash
和bash
中需要,以防止它们即使没有要求也删除权限。
归档时间: |
|
查看次数: |
383 次 |
最近记录: |