8.7. Причины существования уязвимостей в UNIX-системах
Рассмотрев выше достаточно много фактического
материала, мы коснемся причин, по которым
описанные нарушения безопасности UNIX имели место,
и попытаемся их классифицировать. Сразу
оговоримся, что эта классификация ни в коей мере
не претендует на новизну или полноту - кому
интересна эта тема, предлагаем обратиться к
более серьезным научным работам [9, 23]. Здесь же мы
опишем вполне понятные читателю причины, по
которым, тем не менее, происходит до 90% всех
случаев вскрытия UNIX-хостов.
- Наличие демонов.
- Механизм SUID/SGID-процессов.
Эти механизмы, являющиеся неотъемлемой частью
идеологии UNIX, были и будут лакомым кусочком для
хакеров, т. к. в этом случае пользователь всегда
взаимодействует с процессом, имеющим большие
привилегии, чем у него самого, и поэтому любая
ошибка или недоработка в нем автоматически ведет
к возможности использования этих привилегий.
- Излишнее доверие.
Об этом уже достаточно говорилось выше.
Повторим, что в UNIX достаточно много служб,
использующих доверие, и они могут тем или иным
способом быть обмануты.
К этим трем причинам нельзя не добавить
следующую:
- Человеческий фактор с весьма разнообразными
способами его проявления - от легко
вскрываемых паролей у обычных пользователей до
ошибок у квалифицированных системных
администраторов, многие из которых как раз и
открывают путь для использования механизмов
доверия.
Рис. 8.2. Причины уязвимости UNIX
при атаках на телекоммуникационные службы.
Рассмотрим теперь более подробно причины, по
которым оказываются уязвимы демоны и SUID/SGID-процессы:
- возможность возникновения непредусмотренных
ситуаций, связанных с ошибками или недоработками
в программировании;
- наличие скрытых путей взаимодействия с
программой, называемых "люками" ;
- возможность подмены субъектов и объектов
различным образом.
К первым можно отнести классическую ситуацию с
переполнением буфера или размерности массива
(примеры см. п. 8.4.1.2 и 8.6.2), ведущую к затиранию
области стека и записи туда специальных команд,
которые будут затем исполнены. Заметим сразу, что
этот способ, несмотря на свою популярность,
всегда будет системозависимым и ориентирован
только на конкретную платформу и версию UNIX.
Хорошим примером непредусмотренной ситуации в
многозадачной операционной системе является
неправильная обработка некоторого специального
сигнала или прерывания. Часто хакер имеет
возможность смоделировать ситуацию, в которой
этот сигнал или прерывание будет послано (в UNIX'е
посылка сигнала решается очень просто - командой
kill - см. пример 8.6.2).
Наконец, одна из самых распространенных
программистских ошибок - является неправильная
обработка входных данных (это является некоторым
обобщением случая переполнения буфера.) По
свидетельству [24], ими в 1990 и 1995 годах были
подвергнуты автоматизированному тестированию
около 80 программ на 9 различных платформах UNIX -
специальная программа подавала на вход строки
длиной до 100000 символов. Результатом явилось то,
что 25- 33% в 1990 г. и 18- 23% в 1995 г. работали
некорректно - зависали, сбрасывали аварийный
дамп и т. п. (Интересно, что в коммерческих версиях
UNIX этот процент доходил до 43, тогда как в свободно
распространяемых он был меньше 10.) Впрочем,
справедливости ради надо отметить, что только 2
программы-демона вели себя таким образом в 1990 г.,
а через 5 лет эти ошибки были исправлены. Ну, а
если программа неправильно обрабатывает
случайные входные данные, то очевидно, что можно
подобрать такой набор специфических входных
данных, которые приведут к желаемым для хакера
последствиям. Примером этого может служить innd
(8.6.4).
Люком, или "черным входом" (backdoor) часто
называют оставленную разработчиком
недокументированную возможность взаимодействия
(чаще всего входа в систему), например, известный
только разработчику универсальный "пароль"
. Люки оставляют в конечных программах
вследствие ошибки, не убрав отладочный код или
вследствие необходимости продолжения отладки
уже в реальной системе в связи с ее высокой
сложностью или же их корыстных интересов. Люки -
это любимый путь входа в удаленную систему не
только у хакеров, но и у журналистов и режиссеров
вкупе с подбором "главного" пароля
перебором за минуту до взрыва, но в отличие от
последнего способа, люки реально существуют.
Классический пример люка - это, конечно,
отладочный режим в sendmail.
Наконец, вследствие многих особенностей UNIX,
таких как асинхронное выполнение процессов,
развитый командный язык и файловая система,
злоумышленниками могут быть использованы
механизмы подмены одного субъекта или объекта
другим. Например, в рассмотренных выше примерах
часто применялась замена имени файла, имени
получателя и т. п. именем программы
(см. 8.5.2.3 и 8.5.2.4.3). Аналогично может быть выполнена
подмена некоторых специальных переменных. Так,
для некоторых версий UNIX существует атака,
связанная с подменой символа разделителя команд
или опций на символ "/" . Это приводит к тому,
что когда программа вызывает /bin/sh, вместо него
вызывается файл bin с параметром sh в текущем
каталоге. Похожая ситуация возникает при атаке
на telnetd (см. 8.6.1). Наконец, очень популярным в UNIX
видом подмены является создание ссылки (link)
на критичный файл. После этого файл-ссылка
некоторым образом получает дополнительные права
доступа, и тем самым осуществляется
несанкционированный доступ к исходному файлу.
Аналогичная ситуация с подменой файла возникает,
если путь к файлу определен не как абсолютный
(/bin/sh), а относительный (../bin/sh или $(BIN)/sh). Такая
ситуация имела место в рассмотренной уязвимости
telnetd.
И последнее - нельзя приуменьшать роль человека
при обеспечении безопасности любой системы.
Возможно, он даже является слабейшим звеном. Про
необходимость выбора надежных паролей уже
говорилось. Неправильное администрирование -
такая же актуальная проблема, а для UNIX она
особенно остра, т. к. сложность администрирования
UNIX-систем давно уже стала притчей во языцех и
часто именно на это упирают конкуренты. Но за все
надо платить, и это обратная сторона
переносимости и гибкости UNIX. Более того, если
говорить о слабости человека, защищенные системы
обычно отказываются и еще от одной из основных
идей UNIX - наличия суперпользователя, имеющего
доступ ко всей информации и никому не
подконтрольного. Его права могут быть
распределены среди нескольких людей:
администратора персонала, администратора
безопасности, администратора сети и т. п., а сам он
может быть удален из системы после ее
инсталляции. В результате вербовка одного из
администраторов не приводит к таким
катастрофическим последствиям, как вербовка
суперпользователя.
Настройки некоторых приложений, того же sendmail,
настолько сложны, что для поддержания
работоспособности системы требуется
специальный человек - системный администратор, -
но даже он, мы уверены, не всегда знает о всех
возможностях того или иного приложения и о том,
как правильно их настроить. И если хакеры смогли
проникнуть в систему, то это не всегда говорит о
халатности администратора, а, зачастую, о его
ограниченном знании того или иного продукта.
8.8. Как же защитить свой хост
8.9. Средства автоматизированного контроля безопасности
Содержание
|