如果一个以root身份执行的C程序通过调用系统(someprog)执行另一个二进制程序,该程序是否也以root身份运行



来自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()的各种开源库实现的源代码。

最新更新