来自C程序的系统(someprog(调用似乎会以与C程序相同的权限执行someprog二进制文件,但系统((调用的文档没有说明分叉进程的权限。
子进程的权限与父进程的权限相同。如果父进程以root
的身份运行,则子进程也是如此,除非执行的进程本身是某个其他用户的SUID(如果执行的进程是另一个组的SGID,则组可能会更改(。这是root
必须小心执行内容的众多原因之一。
在system()
调用的基础上,传统上可以找到fork()
和execl()
(或其近亲之一(——Linux可能使用不同的详细调用(clone()
,或posix_spawn()
函数家族(。基本的基本思想是一样的。派生的子进程与父进程具有相同的权限。当子进程执行另一个进程时,它具有与子进程相同的权限——除非可执行文件是SUID或SGID。如果您想一想,当root
运行shell并且shell代表root
运行命令时,这些命令通常具有root
的权限。这和那个没什么不同。
小心安全隐患!
当然,执行的程序可能会对其运行的权限做一些事情。另请参阅从setuid根C程序调用脚本-另一个人在评论中提到,脚本不是以root身份运行的。
请注意,system()
通常运行等效的:
/bin/sh -c "the string you passed it with spaces preserved"
因此,了解外壳/bin/sh
的行为非常重要。Perl分析传递给它的system
的字符串,并避免调用shell,除非其中有shell元字符。标准的system()
函数可能没有那么聪明。
如果这对您很重要,请考虑不使用标准的system()
函数。在解析命令字符串后编写自己的调用execvp()
或其他内容的代码。请注意,处理这一问题并非易事,因为信号和进程组之类的事情会使其复杂化。学习一本有能力的书,或者system()
的各种开源库实现的源代码。