Использование posix_spawn () с setuid () и setgid () - PullRequest
0 голосов
/ 14 января 2020

В моей версии glib c 2.13, похоже, есть ошибка, которая делает повторные вызовы fork () / execv () опасными, что приводит к cra sh и повреждению памяти. Кажется, это происходит примерно в 1-2% случаев. Текущий поток кода выглядит следующим образом:

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

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

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

1 Ответ

0 голосов
/ 19 января 2020

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

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

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

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

...