我有一個名為的專案kos,它是一個簡單的 SUID 工具,最近很多人私下里一直在問我我添加了身份驗證存盤/記憶,但它不是那么好
所以基本上發生的事情是:
- 驗證用戶是否輸入了正確的密碼
- 如果密碼正確,則將
temp_validate_user變數設定為true經過temp_validate_user_id身份驗證的用戶 ID(例如1000) - 在
run_command函式中,設定適當的 ID(uid、euid、gid 和 egid)后,執行以下操作:- 如果
last modified時間戳小于設定的最大數量,則洗掉/var/kos/<user id> - 否則,如果
temp_validate_user仍然設定,請確保/var/kos存在,如果不設定,則創建一個名為/var/kos/<user id>(例如/var/kos/1000)的檔案
- 如果
簡單地說,我們只存盤一個名為的檔案/var/kos/<user id>,然后檢查其最后修改的時間戳是否小于最大數量
但是我們遇到了問題
即使 dir 是僅使用 kos 的 root 用戶,您也可以獲得 root 用戶,并且如果您驗證一次就可以執行此操作:
while true; do echo | kos touch "/var/kos/$(id -u)"; done
并且當用戶進行身份驗證時,檔案將一直更新,這意味著您可以無限繞過 root
所以問題是,有沒有更好的方法來做到這一點,我真的需要找到更好的方法,因為隨著時間的推移,我越來越擔心它,我想不出什么
哦,如果還不清楚,我不想使用 PAM 或純 C 或 C 以外的任何其他東西
相關的提交和代碼行:
- https://github.com/TruncatedDinosour/kos/commit/cbcc1346d76b0c47bb4658a1b650de11f74a2727
- https://github.com/TruncatedDinosour/kos/blob/main/src/config.h#L62
- https://github.com/TruncatedDinosour/kos/blob/main/src/macros.hpp#L40
- https://github.com/TruncatedDinosour/kos/blob/main/src/main.cpp#L37
- https://github.com/TruncatedDinosour/kos/blob/main/src/main.cpp#L46
- https://github.com/TruncatedDinosour/kos/blob/main/src/main.cpp#L23
- https://github.com/TruncatedDinosour/kos/blob/main/src/main.cpp#L175
- https://github.com/TruncatedDinosour/kos/blob/main/src/main.cpp#L185
- https://github.com/TruncatedDinosour/kos/commit/f8c4e79e798c0ffaa15df9d1d77fb91b54e61599
- https://github.com/TruncatedDinosour/kos/commit/9ee54bbd01281016d1170c37b0a6cd23433b1227
提前感謝您的回答:)
問題和解答
- 你的目標是什么?
存盤用戶已登錄 x 秒,然后如果 x 秒已過去,則將其無效,但直到 x 秒尚未過去,請勿要求特定登錄用戶輸入密碼
uj5u.com熱心網友回復:
由于@ThomasWeller sudo 做同樣的事情,這意味著它足夠安全,我將目錄上的條款從 744 洗掉到 711,并將檔案權限從 744 洗掉到 600
再次感謝@ThomasWeller
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/519784.html
上一篇:如何處理模型的過度擬合?
