[問題] 關於外部執行的API

作者: gn00618777 (非常念舊)   2018-09-19 22:35:31
Linux 提供的外部執行的 API 有
system()
exec 系列
但有人說 system()少用,盡量用 fork()+exec,但我不解的是 system() 定義也是
fork+exec+wait
到底是為何要少用? 網路上所有的部落格都是複製這句話
"在編寫具有SUID/SGID許可權的程式時請勿使用system(),system()會繼承環境變
數,通過環境變數可能會造成系統安全的問題"
1 繼承環境變數?這是啥意思?有沒有範例證明他會繼承?
2 就算繼承了環境變數,有SUID權限的程式呼叫了 system() 又為何不安全了?
請多指教,謝謝。
作者: dododavid006 (朔雪)   2018-09-19 22:48:00
1 你可以試試執行 env 它會印出目前的環境變數 但是exec 系列除了 e 結尾的還是會繼承環境變數2 是說如果你的環境變數被修改 比如 PATH 那 system就可能執行到非預期的程式 這也會發生在 p 結尾的exec 系列上還有一些情況是你需要傳入某些從外部輸入的東西給你呼叫的程式 用 system 你可能會用 sprintf 去組指令但是 system 執行的是 sh 也就是 sh 能做的事system 也做的到 比如輸入裡有 ; 之類的
作者: holishing   2018-09-20 00:05:00
想到也有 LinuxDev 板?
作者: kdjf (我抓得到什麼呢?)   2018-09-20 12:15:00
使用者執行你的suid程式代表你接下來執行的外部程式也有suid的權限,除非你很清楚下一個程式的所有細節,不然天知道傳進去的環境變數會做出什麼事,甚至是Arbitrary code executionexploit, bash還是哪個shell就有幹過這種事
作者: Bencrie   2018-09-20 16:32:00
bash 吧,當初還有命令可以直接測有沒有中
作者: lantw44 (#######################)   2018-09-20 21:00:00
如果你的 /bin/sh 是 bash,可以試試看執行這個:env SHELLOPTS='xtrace' PS4='$(id)' ./your_program這不只是 bash,像是 python 也有 PYTHONPATH 這種東西

Links booklink

Contact Us: admin [ a t ] ucptt.com