/* First the options that are only allowed for root */ if (getuid() == 0 || geteuid != 0) { ...出處為 Xorg xserver 的 hw/xfree86/common/xf86Init.c 原始程式,最近的版本已經做了安全性修正,所以跟以上列表不同。看起來沒什麼錯誤,順便複習一下 POSIX API,以下是 man page 內容:
DESCRIPTION
getuid() returns the real user ID of the current process.
geteuid() returns the effective user ID of the current process.
X server 會佔據相關的系統資源並確保 UID = 0 以作最大程度的操作,以上兩個 API 即是判斷執行時期的權限。不過,這不是重點,[Coverity Inc.] 指出這是導致安全性缺陷的發生點,為什麼?注意到 geteuid 後面缺了 "()",這導致我們是以 0 去跟 geteuid 的 function pointer 去比較,而非其傳回值,恰好這個缺陷在某些情況下,會引發非預期的表現,在之前的 blog [software validation 小記] 已經引用說明,這裡不再贅述。所以,解決方式就是在 geteuid 多加個 "()",這樣的錯誤果然「呆瓜」,不是嗎?對比 X11 的眾多 Release 程式碼,可以發現這個缺陷存在多年。geteuid != 0 是不是 geteuid() != 0 呢
由 鳥毅 發表於 October 11, 2006 08:55 AM剛才看錯了,請刪除吧
由 鳥毅 發表於 October 11, 2006 08:57 AM感恩你這篇的提醒..
Jserv 兄想要更精進,更開竅..
歡迎來找我們聽課..
雖不是技術課程,卻能得人生智慧喔^^
所謂一竅通竅竅通..