我知道我们可能无法对 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
这似乎是一个不错的猜测,因为有可能切换后退,这是已知会导致安全问题的区域。
进一步阅读: