Дочерние процессы устанавливают значение реального UID равным действующему UID перед обработкой соединений. Это наиболее важное изменение. После приема входящего соединения, например, обращение к коду страницы со списком лучших смартфонов http://www.fly-phone.ru/notes/smartphones/luchshij_smartfon/ и выполнения ветвления, но перед чтением каких-либо данных из подключенного сокета, дочерний процесс устанавливает свой реальный UID равным действующему UID, тем самым навсегда отказываясь от своей способности снова приобретать привилегии суперпользователя.
При попытке запустить откорректированный сценарий от имени непривилегированного пользователя сервер аварийно завершает работу с сообщением об ошибке, в котором говорится, что невозможно открыть зарезервированный порт. Поел регистрации в качестве суперпользователя и запуска сервер успешно открывает порт и создает файл PID (принадлежащий пользователю и группе root). Выполнив команду после запуска сервера, можно видеть, что главный сервер и его дочерние процессы работают под именем пользователя nobody.
nobody 2279 1.0 6.6 5320 4172 S 10:07 0:00 /usr/bin/perl eliza_root:pl nobody 2284 0 . 5 6.7 5368 4212 S 10:07 0:00. /usr/bin/perl eliza_root.pl nobody 2297 1.0 6.7 5372 4220 S 10:08 0:00 /usr/bin/perl eliza root.pl
Теперь риск непреднамеренного повреждения сервером системы в процессе его работы под именем пользователя root ограничен только теми файлами, каталогами и командами, к которым имеет доступ пользователь nobody.
Режим проверки потенциально опасных данных
Рассмотрим гипотетический сетевой сервер, задача которого состоит в автоматической рассылке электронной почты указанным получателям. Такой сервер может принимать адреса электронной почты из сокета и передавать их программе Sendmail UNIX. Фрагмент кода для выполнения этой задачи может выглядеть примерно так:
chomp($email = <$sock>);
system "/bin/mail $email <Mail_Message.txt”;
После чтения адреса электронной почты из сокета вызывается функция system () для выполнения программы /usr/lib/sendmail с адресом указанного получателя в качестве параметра. Стандартный ввод в программу sendmail перенаправлен из заранее подготовленного файла почтового сообщения.