В Unix системе пользователи не являются равноправными, то же верно и для
приложений. Доступ к узлам файловой системы - и соответственно внешним
устройствам машины - зависит от строгого контроля за подлинностью. Некоторым
пользователям резрешено производить весьма чувствительные операции для
поддержания системы в нормальном состоянии. Число, именуемое UID (User
Identifier - идентификатор пользователя) позволяет производить
идентификацию. Чтобы упростить процесс, имя пользователя соответствует этому
числу. Эта связь произведена в файле /etc/passwd.
UID равный 0 с именем по умолчанию root, имеет полный доступ к
системе. Он может создавать, изменять, удалять любой системный узел, он может
также изменять физическую конфигурацию машины, монтировать разделы,
активизировать сетевые интерфейсы и менять их конфигурацию (IP адрес) или делать
системные вызовы такие как mlock() для управления физической
памятью или sched_setscheduler() для изменения механизма
очередности. В одной из следующих статей мы узнаем о возможностях Posix.1e,
которые позволяют ограничивать привилегии приложения, выполняемого как
root, но сейчас будем предполагать, что привилегированный пользователь
может делать все что угодно на машине.
Атаки, о которых мы будем говорить, есть атаки внутренние, то есть
зарегестрированный пользователь на машине пытается получить привилегии, которых
у него нет. С другой стороны, сетевые атаки - есть атаки внешние, их производят
люди пытающиеся подключиться к машине, доступ к которой для них запрещен.
Чтобы пользоваться привилегиями другого пользователя, не имея возможности
войти в систему под ним, нужно как минимум иметь возможность взаимодействовать с
приложением, работающим с UID жертвы. Когда приложение - процесс - работает под
Linux, оно имеет строго определенную индивидуальность. Во-первых программа имеет
атрибут, называемый RUID (Real UID - истинный UID), который
соответствует ID пользователя, запустившего его. Этим атрибутом управляет ядро и
обычно он не может быть изменен. Второй атрибут завершает информацию: поле EUID
(Effective UID - действующий UID) - его принимает во внимание ядро при
управлении правами доступа (открытие файлов, зарезервированные системные
вызовы).
Получить привилегии другого пользователя - значит производить все действия
под его UID, а не под настоящим UID. Естественно, взломщик пытается получить ID
root-а, однако многие другие учетные записи также представляют интерес,
или потому что они дают доступ к системной информации (news,
mail, lp...) или потому что позволяют читать личную информацию
(почту, личные файлы и т.д.) или же они могут использоватся для скрытия
нелегальной деятельности, например, атак на другие сайты.
Чтобы запустить приложение с привилегиями, где действующий UID отличен от
истинного (UID пользователя, который запустил его), выполняемый файл должен
иметь установленным специальный бит, называемый Set-UID. Этот бит находиться в
атрибуте прав доступа файла (также как и биты исполнения, чтения, записи для
пользователя, членов группы и остальных пользователей) и имеет восьмеричное
значение 4000. Бит Set-UID представлен буквой s при отображении
прав с помощью команды ls:
>> ls -l /bin/su
-rwsr-xr-x 1 root root 14124 Aug 18 1999 /bin/su
>>
Команда "find / -type f -perm +4000" отображает
список системных приложений, бит Set-UID у которых установлен в 1. Когда ядро
выполняет программу с установленым битом Set-UID, оно использует UID владельца
программы в качестве EUID процесса. С другой стороны, RUID не изменяется и
соответствует пользователю, запустившему программу. Например, любой пользователь
может иметь доступ к программе /bin/su, но она выполняется с
правами владельца (root) с полными привелегиями в системе. Излишне
говорить, что надо быть осторожным при написании программы с этим атрибутом.
Каждый процесс также имеет действующий ID группы, EGID, и истинный
идентификатор RGID. Бит Set-GID (восьмеричное 2000) в правах доступа
выполняемого файла, говорит ядру, что надо использовать группу владельца файла
как EGID, а не GID пользователя, запустившего программу. Интересная комбинация
возникает иногда при Set-GID установленном в 1, но без бита выполнения для
группы. Фактически это соглашение, не имеющее ничего общего с привилегиями,
относящимися к приложениям, однако указывающее, что файл может быть заблокирован
функцией fcntl(fd, F_SETLK, lock). Обычно приложение не
использует бит Set-GID, однако случается и такое. Например, некоторые игры
используют его для сохранения лучших результатов в системный каталог.