Если программа C, выполняющаяся как root, выполняет другой двоичный файл, вызывая систему (someprog), эта программа также запускается как root? - PullRequest
1 голос
/ 28 марта 2020

Кажется, что системный вызов (someprog) из программы C выполнил бы бинарный файл someprog с теми же разрешениями, что и у программы C, но документы для вызова system () ничего не говорят о разрешения разветвленного процесса.

1 Ответ

2 голосов
/ 28 марта 2020

Права дочернего процесса такие же, как и у родительского процесса. Если родительский элемент выполняется как 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().

...