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