在 SUID 程序中使用 setuid() 的目的
我想知道像這樣的 SUID 程序
passwd
正在使用setuid()
函式呼叫。為什麼它會放棄root權限?這對哪些類型的攻擊有幫助?緩衝區溢出?
首先,我將討論 setuid 位,它使用 passwd 並且不同於
setuid()
系統呼叫(passwd 不使用)。在這方面,這個問題可能有些混亂。它不是針對緩衝區溢出的保護,它對此類或基本上允許攻擊者將特權程序用於某些邪惡的意外目的的任何東西都是可利用的。這是因為 setuid 位與“刪除權限”相反;它授予root權限,但僅授予程序而不是實際使用者。這包括
passwd
.這種形式的 setuid 需要在執行檔上設置文件系統 setuid 位;
passwd
有這個是因為它需要讀寫權限/etc/passwd
。但是,我們希望 passwd 沒有任何已知的安全漏洞(例如,潛在的溢出利用),這將使不法分子可以讓它做除了讀寫 /etc/passwd 之外的其他事情(以及正確地做這些事情!),因為它確實以root身份執行,因此可以做任何事情——除了它被設計為只做一件特定的事情,讓它做任何其他事情應該(再次,希望)是不可能的。因此**,從這個意義上說,使用 setuid 並不能防止任何事情發生**,但它經常與漏洞有關,因為潛在的漏洞是非常重要的 WRT setuid 執行檔。
但是:setuid 位設置的是euid而不是實際的 uid,因此它實際上與
seteuid()
系統呼叫並行,而不是setuid()
.有一種相反形式的“setuid”是關於刪除權限的,它涉及實際的
setuid()
系統呼叫並且不需要 setuid 位。這是當以 root 身份執行的程序(因為 root 或 sudo 啟動它)將其 uid 更改為特權較低的使用者。如果伺服器和守護程序在啟動時需要 root 權限(例如,打開一個特權埠)但隨後不需要,則通常會這樣做。這樣,如果伺服器隨後被劫持,它就沒有超級使用者權限。您無法呼叫setuid(0)
並獲取 root 權限(但您可以使用 set* e *uid)。