再談Unix SUID/SGID程序的安全問題
有時,一個Unix SUID程序與一個系統(tǒng)程序(或庫函數(shù))之間的交互作用會產(chǎn)生連程序的編制者也不知道的安全漏洞。一個典型的例子是/usr/lib/preserve程序。它被vi和ex編輯器使用,當(dāng)用戶在寫出對文件的改變前被意外與系統(tǒng)中斷時,它可以自動制作一個正被編輯的文件的拷貝。
這個保存的(preserve)程序?qū)⒏淖儗懙皆谝粋€專門的目錄內(nèi)的一個臨時文件上,然后利用/bin/mail程序發(fā)送給用戶一個"文件已經(jīng)被存"的通知。
由于人們可能正在編輯一個私人的或一個機(jī)密的文件,被preserve程序(舊版)使用的那個目錄不能被一般用戶訪問。為了使preserve程序可以寫入那個目錄,以及使recover程序可以從那里讀,這些程序被設(shè)置為Unix SUID root。 這個preserve程序有三個特點值得注意:
1. 這個程序被設(shè)置為Unix SUID root。
2. 該程序以root用戶的身份運行/bin/mail程序。
3. 該程序調(diào)用system()函數(shù)調(diào)用mail程序。
由于system()函數(shù)調(diào)用shell對命令字符串進(jìn)行語法分析,而shell則使用IFS變量作為其輸入字段的分割符。早期的shell版本在被調(diào)用是時不將此變量恢復(fù)為普通字符集。如果先將IFS設(shè)置為"/",然后調(diào)用vi程序,繼而調(diào)用preserve程序,就有可能使usr/lib/preserve程序執(zhí)行一個在當(dāng)前目錄下的bin程序(/bin/mail被解析為帶有參數(shù)mail的bin程序)。
如果我們利用前面的演示程序編寫一個簡單的shell script文件命名為bin,它就有可能通過上面的安全漏洞被執(zhí)行:
- # shell script to make an SUID-root
- shell
- #
- chown root parent
- chmod 4755 parent
Unix SUID到這里,我們就告一段落了。
【編輯推薦】