删除特权后的 ptrace suid 二进制文件

删除特权后的 ptrace suid 二进制文件

我知道我们可能无法对 suid 二进制文件执行 ptrace。但是,我想知道为什么在二进制文件将其特权降低到 uid 而不是 euid 之后我们不能执行 ptrace 。

例如,在二进制文件中,suid 二进制文件在执行某些步骤后会删除特权。

 seteuid (euid);
 ret_chdir = chdir (path);
 seteuid (ruid);

 system("whoami");
 printf("Enter any char");
 scanf("%c", &junk);

在我的例子中,当打印“whoami”时,它是进程的用户名,而不是进程的所有者。当程序等待垃圾输入时,我尝试使用 uid 作为用户名附加到正在运行的进程,但即使二进制文件已删除权限,它也失败了。 ptrace Attach 是否有可能使用保存的 uid 状态来确定我不是所有者?

答案1

您的示例代码不会放弃特权!它可以通过调用再次自由提升权限seteuid(euid)。如果你可以 ptrace 它,那么你就可以让它调用seteuid(euid),从而执行特权代码。

您问这个是因为您认为ptrace它是只读的吗?不,它不是:strace这只是你可以用它做的一件事;ptrace允许跟踪器在被跟踪者中执行任意代码,而不仅仅是观察。没有细粒度的访问控制来授予“只读”ptrace 访问权限。

但即使是只读的 ptrace 也是危险的。具有提升权限的应用程序可能正在操纵机密数据。因此,您无法跟踪已获得特权的进程,即使它已放弃特权。该进程必须调用execve以删除所有已获得特权的痕迹。

答案2

这似乎是一个不错的猜测,因为有可能切换后退,这是已知会导致安全问题的区域。

进一步阅读:

相关内容