Права дочернего процесса такие же, как и у родительского процесса. Если родительский элемент выполняется как root
, то же самое относится и к дочернему элементу, если только исполняемый процесс сам не является SUID для какого-либо другого пользователя (и группа может измениться, если исполняемый процесс является SGID для другой группы). Это одна из многих причин, по которым root
должен быть осторожен в том, что они выполняют.
В основе вызова system()
вы традиционно находите fork()
и execl()
(или один из его близких родственников) - есть вероятность, что Linux использует различные подробные вызовы (clone()
, или, возможно, posix_spawn()
семейство функций). Основополагающие идеи будут такими же. Разветвленный дочерний процесс имеет те же разрешения, что и родительский процесс. Когда дочерний процесс выполняет другой процесс, он имеет те же разрешения, что и у дочернего процесса, если только исполняемый файл не SUID или SGID. Если подумать, когда root
запускает оболочку и оболочка запускает команды от имени root
, эти команды имеют привилегии root
- обычно. Это ничем не отличается от этого.
Остерегайтесь последствий для безопасности!
Конечно, исполняемая программа может что-то делать с разрешениями, с которыми она работает. См. Также Вызов скрипта из программы setuid root C - скрипт не запускается как root, упомянутый , что другой парень в комментарии .
Обратите внимание, что system()
часто выполняет эквивалент:
/bin/sh -c "the string you passed it with spaces preserved"
Поэтому важно понимать поведение оболочки /bin/sh
. Perl анализирует строку, которую вы передаете ее system
, и избегает вызова оболочки, если в ней нет метасимволов оболочки. Стандартная функция C system()
, вероятно, не такая уж умная.
Если это важно для вас, подумайте о том, чтобы не использовать стандартную функцию system()
. Напишите свой собственный, который вызывает execvp()
или что-либо еще после анализа командной строки. Имейте в виду, что это не просто, потому что такие вещи, как сигналы и группы процессов, усложняют это. Изучите компетентную книгу или исходный код для различных реализаций библиотеки с открытым исходным кодом system()
.