代码之家  ›  专栏  ›  技术社区  ›  Dean Schulze

如果以root身份执行的C程序通过调用system(someprog)来执行另一个二进制文件,那么该程序是否也以root身份运行?

  •  0
  • Dean Schulze  · 技术社区  · 4 年前

    似乎来自C程序的system(someprog)调用将以与C程序相同的权限执行someprog二进制文件,但是system()调用的文档没有说明forked进程的权限。

    0 回复  |  直到 4 年前
        1
  •  2
  •   Jonathan Leffler Toon Krijthe    4 年前

    子进程的权限与父进程的权限相同。如果父级作为 root ,子进程也是如此,除非执行的进程本身是其他用户的SUID(如果执行的进程是另一个组的SGID,则组可能会更改)。这是原因之一 必须小心他们的行动。

    潜在的 system() fork() execl() (或者它的近亲之一)Linux有可能使用不同的详细调用( clone() ,或者 posix_spawn() 函数族)。基本的基本思想是相同的。分叉子进程具有与父进程相同的权限。当子进程执行另一个进程时,它拥有与子进程相同的权限,除非可执行文件是SUID或SGID。如果你想想,什么时候 运行shell,shell代表 ,这些命令具有 正常情况下。这和那没什么区别。

    小心安全隐患!

    当然,执行的程序可能会对其运行时所使用的权限进行更改。另请参见 Calling a script from a setuid root C program - script does not run as root ,提到者 that other guy comment .

    请注意 系统()

    /bin/sh -c "the string you passed it with spaces preserved"
    

    因此,了解壳的行为非常重要 /bin/sh . Perl分析传递给它的字符串 system 功能可能没那么聪明。

    系统() 功能。写下你自己的 execvp() 系统() .