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

unix下專供root調(diào)用程序的介紹( 四 )


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

推薦閱讀