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