标题几乎说明了一切。我正在尝试调试一个程序,该程序具有为不同组设置的setgid位(让我们将其称为组A)。我正在执行gdb作为B组的成员。为了争论,假设我不能被添加到组A.这些都是非root / sudo组。
当我通过命令行运行程序时,它正确地使用组A的权限执行,但是当我运行gdb时,程序调用getegid,这表明我仍然作为组B运行。有没有改变这个的方法所以我可以将gdb作为A组运行?同样,组A确实设置了setgid位,因此,不应该将gdb作为组A运行吗?
答案 0 :(得分:0)
在大多数系统上,GDB使用ptrace来控制,检查和修改目标进程。
如execve man page中所述,如果正在进行处理,则可执行文件的setuid和setgid位不会产生任何影响:
如果在filename指向的程序文件上设置了set-user-ID位,并且没有安装基础文件系统nosuid(mount(2)的MS_NOSUID标志),并且调用进程是如果没有被删除,则调用进程的有效用户ID将更改为程序文件所有者的有效用户ID。同样,当设置程序文件的set-group-ID位时,调用进程的有效组ID被设置为程序文件的组。
[但这并非完全正确。如果正在调用调用进程并以root身份运行,则将遵循setuid和setgid位。]
这种对ptraced进程不遵守setuid和setgid位的限制长期以来一直是Unix系统的一个属性,作为一种安全措施,可以防止用户使用ptrace来改变特权进程的行为。
如果希望setuid和setgid位在跟踪的进程中生效,通常调试器进程需要以root身份运行或具有CAP_SYS_PTRACE
功能。