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

看板Linux作者 (非常念舊)時間7年前 (2018/09/19 22:35), 編輯推噓2(2016)
留言18則, 5人參與, 7年前最新討論串1/1
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

09/19 22:48, 7年前 , 1F
1 你可以試試執行 env 它會印出目前的環境變數 但是
09/19 22:48, 1F

09/19 22:49, 7年前 , 2F
exec 系列除了 e 結尾的還是會繼承環境變數
09/19 22:49, 2F

09/19 22:50, 7年前 , 3F
2 是說如果你的環境變數被修改 比如 PATH 那 system
09/19 22:50, 3F

09/19 22:50, 7年前 , 4F
就可能執行到非預期的程式 這也會發生在 p 結尾的
09/19 22:50, 4F

09/19 22:51, 7年前 , 5F
exec 系列上
09/19 22:51, 5F

09/19 22:53, 7年前 , 6F
還有一些情況是你需要傳入某些從外部輸入的東西給你
09/19 22:53, 6F

09/19 22:53, 7年前 , 7F
呼叫的程式 用 system 你可能會用 sprintf 去組指令
09/19 22:53, 7F

09/19 22:54, 7年前 , 8F
但是 system 執行的是 sh 也就是 sh 能做的事
09/19 22:54, 8F

09/19 22:54, 7年前 , 9F
system 也做的到 比如輸入裡有 ; 之類的
09/19 22:54, 9F

09/20 00:05, 7年前 , 10F
想到也有 LinuxDev 板?
09/20 00:05, 10F

09/20 12:15, 7年前 , 11F
使用者執行你的suid程式代表你接下來執行的外部程式也有suid
09/20 12:15, 11F

09/20 12:17, 7年前 , 12F
的權限,除非你很清楚下一個程式的所有細節,不然天知道傳進去
09/20 12:17, 12F

09/20 12:19, 7年前 , 13F
的環境變數會做出什麼事,甚至是Arbitrary code execution
09/20 12:19, 13F

09/20 12:19, 7年前 , 14F
exploit, bash還是哪個shell就有幹過這種事
09/20 12:19, 14F

09/20 16:32, 7年前 , 15F
bash 吧,當初還有命令可以直接測有沒有中
09/20 16:32, 15F

09/20 21:00, 7年前 , 16F
如果你的 /bin/sh 是 bash,可以試試看執行這個:
09/20 21:00, 16F

09/20 21:00, 7年前 , 17F
env SHELLOPTS='xtrace' PS4='$(id)' ./your_program
09/20 21:00, 17F

09/20 21:17, 7年前 , 18F
這不只是 bash,像是 python 也有 PYTHONPATH 這種東西
09/20 21:17, 18F
文章代碼(AID): #1RebwuWZ (Linux)
文章代碼(AID): #1RebwuWZ (Linux)