Допустим, следующая программа выполняется из двоичного файла setuid- root пользователем, не являющимся root:
int main()
{
if (fork()) {
/* Parent process */
int wstatus; wait(&wstatus);
if (WEXITSTATUS(wstatus) == 0) {
/* Child process exited with return code indicating success */
do_something_potentially_dangerous();
return 0;
} else {
/* Child process exited with return code indicating failure */
puts("Access denied");
return 1;
}
} else {
/* Child process */
setuid(getuid());
/*
...
*/
return do_critical_security_check(); /* let's say this returns 0 if it's safe */
}
}
Программа setuid обычно запускается с дополнительными мерами безопасности, которые не позволяют пользователю кто начал это с фальсификации его (привилегированного) выполнения. Я могу только предположить, что этот статус сохраняется, когда он разветвляется на дочерний процесс.
Но когда дочерний процесс удаляет привилегии root, он также удаляет какую-либо из этих защит? Запретив уязвимость в коде дочернего процесса, сможет ли непривилегированный пользователь вмешаться в do_critical_security_check()
или иным образом заставить дочерний процесс вернуть 0, если не должен? (Предположим, kernel.yama.ptrace_scope
установлен на 0.)