TL;DR 例如 su 或 sudo 如何在沒有 PAM 的情況下作業?
你好,
我想玩 suid 之類的東西,我已經得到了 SUID 部分和 SUID 位之類的東西,但問題是它沒有要求我輸入密碼,因為我希望它詢問密碼并找到 su 和 sudo源代碼混亂我很困惑。
我查看了 setsuid() 和 getuid() 檔案,似乎沒有關于密碼身份驗證的任何內容。
如何在沒有 PAM 的情況下實作密碼身份驗證,我使用沒有 PAM 的 sudo,它作業正常,su 和 pam,兩者都作業正常,我很困惑如何讓它作業
這個 C 代碼就是我現在所擁有的:
// a.cc //
#include <iostream>
#include <unistd.h>
#include <cerrno>
#include <cstring>
int main(int argc, char *argv[]) {
uid_t user = getuid();
if (setuid(0) == -1) {
std::cerr << strerror(errno) << '\n';
return 1;
}
system(argv[1]);
if (setuid(user) == -1) {
std::cerr << errno << '\n';
return 1;
}
return 0;
}
并在使用例如 GCC 和名為 a.cc 的檔案進行編譯后:
$ g a.cc -o a
并賦予它執行和SUID權限并將所有權授予root
$ sudo chown root:root ./a
$ sudo chmod 4555 ./a
它只是作業,但沒有密碼驗證
$ ./a id
uid=0(root) gid=1000(ari) groups=1000(ari),5(tty),10(wheel),27(video),78(kvm),250(portage)
(ari 是我的用戶)
即使在注銷或運行sudo -k以結束 sudo 超時后,它仍然可以在沒有密碼身份驗證的情況下作業。
- 蘇源:https : //github.com/shadow-maint/shadow/blob/master/src/su.c
- 須藤源:https : //github.com/sudo-project/sudo/blob/main/src/sudo.c
感謝您提前回答
uj5u.com熱心網友回復:
首先,基礎知識:每個行程都有一個用戶標識和一個組標識(我將忽略附加屬性,如附加組標識)。
用戶 ID 0 是根用戶。就這樣,故事結束。
當您有一個用戶 ID 為 0 的行程時,它是一個根行程。故事結局。
行程如何獲取其用戶 ID 0 無關緊要。如果一個行程的用戶 ID 為 0,那么它就是一個根行程,僅此而已。
當您完成設定 setuid 行程的動作時,這setuid(0)就是它本身,您就完成了。你是一個根行程。而已。沒有什么可說的了。
setsuid() 和 getuid() 檔案,似乎沒有關于密碼身份驗證的任何內容。
正確的。他們所做的只是調整/更新用戶 ID。而已。沒有什么了。
在su和sudo流程執行以下操作:
- 它們是 setuid 可執行檔案。
$ ls -al /bin/su /bin/sudo
-rwsr-xr-x. 1 root root 57504 Aug 17 04:59 /bin/su
---s--x--x. 1 root root 185440 Aug 7 13:17 /bin/sudo
你覺得這很熟悉嗎?您手工制作的 setuid 程式的權限看起來與此相同,不是嗎?
- 但在他們走得更遠之前,他們會要求您提供可接受的密碼(或以某種形式或方式滿足某些其他標準,可接受的身份驗證標準的確切細節是什么并不重要,在
su's case 中是密碼,還是sudo的配置中可接受的匹配)。如果你不這樣做,他們將終止,不會采取進一步的行動。
所有涉及 PAM 或其他身份驗證框架的密碼驗證邏輯都是由su和sudo行程自己實作的。除非您提供可接受的身份驗證憑據(無論對su或意味著什么sudo),否則它們將終止,不會發生進一步的操作。成功的身份驗證會產生一個 shell 或一個執行的命令,但這是因為su和sudo程式本身使用 setuid(權限位和系統呼叫)來獲取 root 權限,這是首要任務。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/406300.html
標籤:
