将posix_spawn()与setuid()和setgid()一起使用

问题描述 投票:0回答:1

我的glibc 2.13版本中似乎存在一个错误,使得重复调用fork()/ execv()十分危险,从而导致崩溃和内存损坏。这似乎发生大约1-2%的时间。当前代码流如下

  1. 父叉子进程
  2. 子项关闭所有继承的文件描述符,但stdin,stdout和stderr除外
  3. 子级运行setgid和setuid不再以root身份运行
  4. 应运行的Execv二进制文件

如果仅使用posix_spawn()替换上述4个步骤,则程序永不崩溃。这似乎证实了我的假设,即我当前的glibc中的fork / execv有一个错误。

用posix_spawn()替换第1-4步的问题是,它没有为我提供完成第2步和第3步的机制,这对资源管理和安全性至关重要。是否有任何其他解决方案或我为了使稳定版本能够正常工作而未考虑的事项?

fork posix glibc spawn execv
1个回答
0
投票
如果仅使用posix_spawn()替换上述4个步骤,则程序永不崩溃。这似乎证实了我的假设,即我当前的glibc中的fork / execv有一个错误。
glibc 2.13在fork的实现中使用execveposix_spawn。这可能是您代码中的另一个错误。仅在glibc 2.24和更高版本中,posix_spawn默认避免使用fork(这意味着根本不运行fork处理程序,并且这些处理程序可能导致崩溃或挂起)。

用posix_spawn()替换第1-4步的问题是,它没有为我提供完成第2步和第3步的机制,这对资源管理和安全性至关重要。有没有其他解决方案

唯一的方法是引入一个包装程序,该程序关闭所有文件描述符,切换ID,然后启动实际的目标程序。
© www.soinside.com 2019 - 2024. All rights reserved.