日本免费全黄少妇一区二区三区-高清无码一区二区三区四区-欧美中文字幕日韩在线观看-国产福利诱惑在线网站-国产中文字幕一区在线-亚洲欧美精品日韩一区-久久国产精品国产精品国产-国产精久久久久久一区二区三区-欧美亚洲国产精品久久久久

UNIX常用的系統(tǒng)調(diào)用( 四 )


(2)確保自己要運(yùn)行的任何命令(通過(guò)system(),popen(),execlp(), execvp()運(yùn)行的命令)的確是自己要運(yùn)行的命令,而不是其它什么命 令,尤其是自己的程序?yàn)镾UID或SGID許可時(shí)要小心.
第一方面比較簡(jiǎn)單,在程序開始前調(diào)用umask(077).若要使文件對(duì)其他人可 讀,可再調(diào)chmod(),也可用下述語(yǔ)名建立一個(gè)"不可見"的臨時(shí)文件.
Creat("/tmp/xxx",0);
file=open("/tmp/xxx",O_RDWR);
unlink("/tmp/xxx");
文件/tmp/xxx建立后,打開,然后斷開鏈,但是分配給該文件的存儲(chǔ)器并未刪 除,直到最終指向該文件的文件通道被關(guān)閉時(shí)才被刪除.打開該文件的進(jìn)程 和它的任何子進(jìn)程都可存取這個(gè)臨時(shí)文件,而其它進(jìn)程不能存取該文件,因 為它在/tmp中的目錄項(xiàng)已被unlink()刪除.
第二方面比較復(fù)雜而微妙,由于system(),popen(),execlp(),execvp()執(zhí)行 時(shí),若不給出執(zhí)行命令的全路徑,就能"騙"用戶的程序去執(zhí)行不同的命令.因 為系統(tǒng)子程序是根據(jù)PATH變量確定哪種順序搜索哪些目錄,以尋找指定的命 令,這稱為SUID陷井.最安全的辦法是在調(diào)用system()前將有效UID改變成實(shí) 際UID,另一種比較好的方法是以全路徑名命令作為參數(shù).execl(),execv(), execle(),execve()都要求全路徑名作為參數(shù).有關(guān)SUID陷井的另一方式是 在程序中設(shè)置PATH,由于system()和popen()都啟動(dòng)shell,故可使用shell句 法.
如:
system("PATH=/bin:/usr/bin cd");
這樣允許用戶運(yùn)行系統(tǒng)命令而不必知道要執(zhí)行的命令在哪個(gè)目錄中,但這種 方法不能用于execlp(),execvp()中,因?yàn)樗鼈儾荒軉?dòng)shell執(zhí)行調(diào)用序列 傳遞的命令字符串.
關(guān)于shell解釋傳遞給system()和popen()的命令行的方式,有兩個(gè)其它的問(wèn) 題:
*shell使用IFS shell變量中的字符,將命令行分解成單詞(通常這個(gè) shell變量中是空格,tab,換行),如IFS中是/,字符串/bin/ed被解釋成單詞 bin,接下來(lái)是單詞ed,從而引起命令行的曲解.
再?gòu)?qiáng)調(diào)一次:在通過(guò)自己的程序運(yùn)行另一個(gè)程序前,應(yīng)將有效UID改為實(shí)際的 UID,等另一個(gè)程序退出后,再將有效UID改回原來(lái)的有效UID.
SUID/SGID程序指導(dǎo)準(zhǔn)則
(1)不要寫SUID/SGID程序,大多數(shù)時(shí)候無(wú)此必要.
(2)設(shè)置SGID許可,不要設(shè)置SUID許可.應(yīng)獨(dú)自建立一個(gè)新的小組.
(3)不要用exec()執(zhí)行任何程序.記住exec()也被system()和popen()調(diào)用.
. 若要調(diào)用exec()(或system(),popen()),應(yīng)事先用setgid(getgid()) 將有效GID置加實(shí)際GID. . 若不能用setgid(),則調(diào)用system()或popen()時(shí),應(yīng)設(shè)置IFS: popen("IFS=tn;export IFS;/bin/ls","r");
. 使用要執(zhí)行的命令的全路徑名.
. 若不能使用全路徑名,則應(yīng)在命令前先設(shè)置PATH: popen("IFS=tn;export IFS;PATH=/bin:/usr/bin;/bin/ls","r");
. 不要將用戶規(guī)定的參數(shù)傳給system()或popen();若無(wú)法避免則應(yīng)檢查 變?cè)址惺欠裼刑厥獾膕hell字符.
. 若用戶有個(gè)大程序,調(diào)用exec()執(zhí)行許多其它程序,這種情況下不要將 大程序設(shè)置為SGID許可.可以寫一個(gè)(或多個(gè))更小,更簡(jiǎn)單的SGID程序 執(zhí)行必須具有SGID許可的任務(wù),然后由大程序執(zhí)行這些小SGID程序.
(4)若用戶必須使用SUID而不是SGID,以相同的順序記住(2),(3)項(xiàng)內(nèi)容,并 相應(yīng)調(diào)整.不要設(shè)置root的SUID許可.選一個(gè)其它戶頭.
(5)若用戶想給予其他人執(zhí)行自己的shell程序的許可,但又不想讓他們能 讀該程序,可將程序設(shè)置為僅執(zhí)行許可,并只能通過(guò)自己的shell程序來(lái) 運(yùn)行.
編譯,安裝SUID/SGID程序時(shí)應(yīng)按下面的方法
(1)確保所有的SUID(SGID)程序是對(duì)于小組和其他用戶都是不可寫的,存取 權(quán)限的限制低于4755(2755)將帶來(lái)麻煩.只能更嚴(yán)格.4111(2111)將使 其他人無(wú)法尋找程序中的安全漏洞.
(2)警惕外來(lái)的編碼和make/install方法
. 某些make/install方法不加選擇地建立SUID/SGID程序.
. 檢查違背上述指導(dǎo)原則的SUID/SGID許可的編碼.
. 檢查makefile文件中可能建立SUID/SGID文件的命令.

推薦閱讀