作業五setuid()的使用

267 views
Skip to first unread message

中正資工,系統程式設計

unread,
Apr 8, 2021, 6:49:41 PM4/8/21
to 中正資工,系統程式設計
教授好,我在生成執行檔後,對它下指令chown root preBirthday與chmod +s preBirthday,然後執行程式,它從程式開始到程式結束的euid一直都為0,都可以進入檔案來計算大小,那麼想請問一下setuid()這一個function是要在哪裡使用呢?

鍾天睿

unread,
Apr 8, 2021, 7:05:15 PM4/8/21
to 中正資工,系統程式設計
一進去程式就使用


中正資工,系統程式設計 <ccu_system_...@googlegroups.com> 於 2021年4月9日 週五 上午6:49 寫道:
教授好,我在生成執行檔後,對它下指令chown root preBirthday與chmod +s preBirthday,然後執行程式,它從程式開始到程式結束的euid一直都為0,都可以進入檔案來計算大小,那麼想請問一下setuid()這一個function是要在哪裡使用呢?

--
來源:中正系統程式設計論壇
---
這是 Google 網路論壇針對「中正資工,系統程式設計」群組發送的訂閱通知郵件。
如要取消訂閱這個群組並停止接收來自這個群組的郵件,請傳送電子郵件到 ccu_system_progra...@googlegroups.com
如要在網路上查看這項討論,請造訪 https://groups.google.com/d/msgid/ccu_system_programming/4ef9e526-5994-4b97-afba-986b9fdd8302n%40googlegroups.com

中正資工,系統程式設計

unread,
Apr 8, 2021, 7:38:41 PM4/8/21
to 中正資工,系統程式設計
好的,謝謝。還想請問一下因為一開始進入程式時ruid = 1000, euid = 0, suid = 0,在使用setuid(0)後變成ruid = 0, euid = 0, suid = 0:
(1.)setuid()不是用來改變euid的值嗎?怎麼會讓ruid從1000變成0?
(2.)真正用來判斷權限的不是euid嗎?我的euid一直都為0,那麼使用setuid()的目的是什麼呢?

ray1422 在 2021年4月9日 星期五上午7:05:15 [UTC+8] 的信中寫道:

a0985707420

unread,
Apr 8, 2021, 9:41:06 PM4/8/21
to 中正資工,系統程式設計
我做了小小的試驗,如果單純是用sudo chmod +s  set uid,他只會改變euid,suid,但ruid不會改變(因為ruid在一登入系統就決定了),理由應該是set uid bit本身就是讓程式執行者在"執行程式時"能夠以檔案owner的身分執行,而非"完全變成檔案owner"
關於setuid(uid)為什麼會讓ruid變成uid在老師的投影片也有說明(附上圖),setuid能正確執行的條件也清楚寫在上面,如果今天euid進來是root,他就會把三個id都改成uid,也就是如投影片所說變身為任何人,不論作業內容我認為setuid的用途應該回歸老師上課所說的在程式執行者和程式擁有者身分中切換(像須從本地資料夾複製資料道程式擁有者的資料夾,上課範例),也許是因為作業沒特別用強調這部分才會讓你有這個疑問(我也還沒看作業但剛好在自己玩setuid的東西,剛好可以回覆討論這個問題),小小淺見,如果有錯歡迎告訴我,可以一起討論,謝謝


擷取.PNG
中正資工,系統程式設計 在 2021年4月9日 星期五上午7:38:41 [UTC+8] 的信中寫道:

魯智深

unread,
Apr 8, 2021, 10:15:45 PM4/8/21
to 中正資工,系統程式設計
這個問題很深。。。你的問題剛好是我期中考的上機考選項之一。。。

系統的第一個user mode process是systemd或者是init,前者是比較新的方式,可以平行化的初始化系統,後者的平行化程度較低

重點來了:無論是systemd或者init的執行者都是root
動機:要怎樣實作登入系統呢?
首先以root的權限執行login process(例如:由systemd執行),login process驗證帳號、密碼正確以後,他執行setuid(1000)及setgid(1000)(這裡假設login process查詢/etc/passwd以後,發現使用者的uid和gid都是1000)
UNIX在這個地方用上一個聰明的設計,當root變身為其他使用者以後,effective uid和real uid都變成1000,這樣就可以確保登入系統的使用者不會拿到root的權限

應用:例如設計遊戲伺服器
現在的遊戲伺服器都是使用Linux,因此必須建立一個software server一直聽網路上的封包,這個software類似於login process
當使用者登入以後,就切換成該使用者的權限,這樣即使駭客想要破壞遊戲伺服器,他也得先攻破Linux的保護機制
如果自行設計保護機制當然也可以,但再加上Linux的預設保護機制當然就更好
大家的ftp server也是用類似的方法設計的

a0985707420 在 2021年4月9日 星期五上午9:41:06 [UTC+8] 的信中寫道:

魯智深

unread,
Apr 15, 2021, 8:43:07 PM4/15/21
to 中正資工,系統程式設計
setuid只會改變 euid,不會改變real user id

man setuid
setuid()  sets  the effective user ID of the calling process.

魯智深 在 2021年4月9日 星期五上午10:15:45 [UTC+8] 的信中寫道:
Reply all
Reply to author
Forward
0 new messages