Darwin 在 hash bang 执行中从解释器中删除 setuid

Darwin 在 hash bang 执行中从解释器中删除 setuid

这不完全是一个关于如何运行哈希爆炸的问题脚本

在这种情况下,存在一个哈希爆炸脚本(不一定)具有该u+s权限。相反,解释器具有u+s,并且脚本指定该解释器:#!/path/to/interpreter

在 Mac OS 上,在这种情况下,指定的解释器本身未授予其隐含的 setuid自己的权限位,就像直接执行一样。其真实有效的用户ID就是运行hash bang脚本的用户的ID。

有解决方法吗不涉及解释器重新执行自身?

重新执行作品:

Kazs-Mac-Pro:txr kaz$ uname -a
Darwin Kazs-Mac-Pro.local 11.0.0 Darwin 内核版本 11.0.0:2011 年 4 月 8 日星期五 20:29:42 PDT;根:xnu-1699.22.36~1/RELEASE_X86_64 x86_64
Kazs-Mac-Pro:txr kaz$ cat setuid.tl
#!./txr --reexec
(输入行`gids:@(getegid)@(getgid)`)
(输入行`uids:@(geteuid)@(getuid)`)
(输入行 `groups: @(getgroups)`)
(seteuid 0) ;;如果不能则抛出
Kazs-Mac-Pro:txr kaz$ ls -l txr setuid.tl
-rwsr-xr-x 1根轮163 5月5日15:18 setuid.tl
-rwsr-xr-x 1 根轮 1334500 5 月 5 日 15:17 txr
Kazs-Mac-Pro:txr kaz$ ./setuid.tl
行数:20 20
uid:0 501
组: 20 402 401 12 33 61 79 80 81 98 100 204

所做--reexec的只是调用execvp程序的路径名以及--reexec.噗,setuid 权限又回来了。但这很丑陋。

如果我们没有--rexec,则行为如下:

Kazs-Mac-Pro:txr kaz$ ./setuid.tl
行数:20 20
用户ID:501 501
组: 20 402 401 12 33 61 79 80 81 98 100 204
./txr:未处理的系统错误类型异常:
./txr: seteuid 失败: 1/"不允许操作"
./txr:在 ./setuid.tl:4 形式的评估期间 (seteuid 0)

u+s从系统角度来看,脚本上的 是无关紧要的;解释器使用它以及脚本的所有权来决定是否运行脚本 setuid,或者是否永久删除权限然后运行它。当然,我们不会'不想使用不知道 setuid 操作的解释器执行此类操作,并盲目地将其提升的特权授予要求执行的任何代码段。)

答案1

出于安全原因,大多数 Unix 变体都会在脚本上禁用 setuid。有关更多信息,请参阅允许在 shell 脚本上设置 setuid

早期版本的 OS X 有一个设置允许 setuid 脚本:sysctl kernl.sugid_scripts=1,但是我没有在 10.9 上看到它的记录。我不知道它是否仍然存在,但没有记录,如果它仍然存在,我不知道它是否安全。

运行 setuid 脚本的常用方法是通过sudo,它可以解决 setuid 脚本的一些安全问题,特别是清理环境。添加 sudo 规则(运行visudo编辑 sudo 配置):

ALL ALL = (target_user : target_group) /path/to/script

这允许任何人运行sudo -u target_user -g target_group /path/to/script …(带有任何参数)。将第一个替换ALL%original_group仅允许 的成员origininal_group执行此操作。

如果您希望这是透明的,请编写一个sudo根据需要调用的包装器脚本:

#!/bin/sh
exec sudo -u target_user -g target_group /path/to/script "$@"

相关内容