这不完全是一个关于如何运行哈希爆炸的问题脚本。
在这种情况下,存在一个哈希爆炸脚本(不一定)具有该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 "$@"