Приемы профессиональной работы в UNIX

       

ПОТАЙНЫЕ ДВЕРИ


Мы уже отмечали, что люди, которые могут получить суперпользовательский доступ в систему хотя бы на короткое время, могут написать программы, предоставляющие им постоянный суперпользовательский доступ. Напомним, что тот, кто хочет прорвать защиту системы UNIX, первым делом пытается найти способ стать суперпользователем. Как мы уже обсуждали, нарушение физической защиты или плохо оберегаемый корневой пароль могут дать нарушителю возможность запустить процесс как суперпользовательский, что предоставляет доступ к файлам (например, стандартным исполняемым модулям системы UNIX), которые не может изменить обычный пользователь. В результате нарушитель получает для себя "потайную дверь".

Ключевым вопросом является способ хранения в системе UNIX указаний о владельце и привилегиях, связанных с файлом. Помимо хорошо известных прав доступа для владельца, группы и прочих пользователей (эти права устанавливаются командой chmod), имеется два более старших бита, называемых setuid (установка пользовательского идентификатора) и setgid (установка группового идентификатора).

Как правило, процесс, запущенный данным пользователем, имеет только те привилегии на доступ, которые принадлежат этому пользователю. Однако, многие системные команды должны иметь доступ к таким файлам, к которым мы бы не хотели разрешать доступ пользователя, за исключением очень ограниченного набора ситуаций. Ярким примером является команда passwd, позволяющая пользователю сменить свой пароль. Очевидно, что этой команде необходим доступ на запись в файл /etc/passwd, а такой доступ имеет обычно только суперпользователь.

Проблему решает исполняемый файл команды passwd, в котором бит setuid установлен на владельца файла, а владельцем файлов, соответствующих обычным системным командам, является суперпользователь (пользовательский идентификатор 0). Это означает, что ВО ВРЕМЯ РАБОТЫ ПРОЦЕССА, соответствующего данной команде, пользователь имеет корневые привилегии! Когда команда завершается, прекращается и корневой доступ ... если только в данную команду не было какого-то вмешательства или если нарушитель не установил особую программу setuid. В этих случаях остается только войти в потайную дверь.

Потайная дверь - это чаще всего файл, владельцем которого является суперпользователь, но который подвергнут вмешательству несанкционированного пользователя, завладевшего каким-то образом правом доступа на запись в этот файл, обычно путем временного суперпользовательского доступа. Важно понимать, что потайная дверь это просто еще один процесс, порожденный из обычного пользовательского интерпретатора shell, но с одной существенной особенностью: у него другой номер пользовательского идентификатора - как правило, 0, т.е. идентификатор суперпользователя. Поскольку пользовательский идентификатор хранится в самом процессе, он может быть подвергнут вмешательству.

Фактическое проникновение в систему с обретением возможностей суперпользователя происходит тогда, когда работает "дверная" программа. Здесь используется волшебство бита setuid. Когда этот бит взведен, программа устанавливает (или изменяет) пользовательский идентификатор процесса на пользовательский идентификатор владельца данного файла (который оказывается суперпользовательским). Пока этот пользовательский идентификатор временно является суперпользовательским, программа превращается в shell-интерпретатор (обычно путем выполнения системного вызова exec). Такой shell находится по другую сторону двери, в царстве суперпользователя, со всеми принадлежащими ему привилегиями.

Как мы уже отмечали, обсуждая команды su, более изощренные нарушители могут различными способами маскировать свое прониконвение в систему. Один из способ маскировки - иметь "дверную" программу, которая ничего не делает, если только она не вызвана с какой-нибудь незаметной опцией, например -z. Скорее всего, программа потайной двери не выдает сколько-нибудь полезного синтаксического сообщения, если ее вызвать без правильной опции.

Еще одна хитрость заключается в том, что программа потайной двери может изменить свою командную строку (которую можно отобразить при помощи команды "ps -ef", выдающей полное состояние процесса) на какую-нибудь безобидную, запускаемую обычно суперпользователем (например, getty).

Опытный нарушитель вряд ли оставит исходный текст программы потайной двери в системе, поэтому администратор вынужден разглядывать только исполняемый модуль. Для реассемблирования объектного кода можно применить отладчик (adb), но если только вы не имеете безумно близкого знакомства с внутренностями системы UNIX, вам будет весьма трудно представить себе, что происходит. Изощренные программы потайной двери избегают также присутствия легко узнаваемых строк в исполняемых модулях. Вы можете, однако, применить команду strings (если она есть в вашей системе) для поиска символьных строк, которые там могли бы быть.



Содержание раздела