Использование posix_spawn() с setuid() и setgid()

Похоже, в моей версии glibc 2.13 есть ошибка, которая делает повторные вызовы fork()/execv() опасными, что приводит к сбою и повреждению памяти. Это происходит примерно в 1-2% случаев. Текущий поток кода выглядит следующим образом

  1. родитель разветвляет дочерний процесс
  2. дочерний элемент закрывает все унаследованные файловые дескрипторы, кроме stdin, stdout, stderr
  3. ребенок запускает setgid и setuid, чтобы больше не работать как root
  4. Бинарный файл Execv, который следует запустить

Если я заменю вышеуказанные 4 шага только использованием posix_spawn(), моя программа никогда не выйдет из строя. Кажется, это подтверждает мою гипотезу о том, что в моем текущем glibc есть ошибка с fork/execv.

Проблема с заменой шагов 1-4 на posix_spawn() заключается в том, что он не предоставляет мне механизма для выполнения шагов 2 и 3, которые чрезвычайно важны для управления ресурсами и безопасности. Есть ли какое-либо альтернативное решение или что-то, что я не учел, чтобы получить стабильную версию?


person lufthansa747    schedule 14.01.2020    source источник


Ответы (1)


Если я заменю вышеуказанные 4 шага только использованием posix_spawn(), моя программа никогда не выйдет из строя. Кажется, это подтверждает мою гипотезу о том, что в моем текущем glibc есть ошибка с fork/execv.

glibc 2.13 использует fork и execve в реализации posix_spawn. Вероятно, это другая ошибка в вашем коде. Только в glibc 2.24 и более поздних версиях posix_spawn избегает использования fork по умолчанию (что подразумевает отсутствие запуска обработчиков fork, которые могут быть источником сбоев или зависаний).

Проблема с заменой шагов 1-4 на posix_spawn() заключается в том, что он не предоставляет мне механизма для выполнения шагов 2 и 3, которые чрезвычайно важны для управления ресурсами и безопасности. Есть ли альтернативное решение

Единственный способ сделать это — ввести программу-оболочку, которая закрывает все файловые дескрипторы, переключает идентификаторы, а затем запускает реальную целевую программу.

person Florian Weimer    schedule 19.01.2020