[问题] 关于外部执行的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