我知道我們可能無法對 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
以刪除所有已獲得特權的痕跡。