Linux глазами хакера - Михаил Флёнов
Шрифт:
Интервал:
Закладка:
Кто хорошо работает, тот должен обязательно отдыхать. Но только надо помнить, что деятельность специалиста по безопасности заключается не только в решении текущих задач, но и в повышении квалификации.
14.2. Переполнение буфера
Это одна из самых популярных и в то же время наиболее сложная в использовании уязвимость. Для начала определимся, почему программисты допускают такие ошибки, при которых возможно выполнить переполнение буфера?
В таких языках, как С++, для работы с данными, которые вводит пользователь, выделяется память определенного размера. Информация заносится в этот буфер простым копированием. Большинство программистов рассчитывают максимальный объем данных, который может передать пользователь, и выделяют именно столько памяти (возможен небольшой запас). При этом во время копирования не происходит никаких проверок размера полученных данных. Злоумышленник может воспользоваться этим недостатком и ввести в программу столько информации, что она просто не поместится в памяти и произойдет сбой.
Откуда берется ошибка? Не буду вас загружать программированием и машинными кодами, а попробуем рассмотреть простейший случай переполнения. Структура программы может выглядеть примерно следующим образом:
Код
Код
Буфер данных 50 байт
Код
Код
Буфер для хранения данных находится внутри кода. В данном случае будем считать, что программист выделил под него 50 байт. А что будет, если пользователь передаст в программу 70 байт? Если при приеме информации программа не проверит размер блока, то при записи данных в буфер они выйдут за его пределы и запишутся поверх кода. Это значит, что программа будет испорчена и не сможет выполнять каких-либо действий, и, скорее всего, произойдет зависание.
В старых версиях Windows некоторые ошибки переполнения буфера могли нарушить работу всей ОС. Windows 2000/XP и Linux более защищены, их вывести из строя уже намного сложнее, и при подобных ошибках перестает функционировать только сама программа.
Но это еще полбеды. Наиболее опытные взломщики могут передать такие данные, в которых будет 50 байт мусора, а потом пойдет корректно исполняемый код, но только написанный злоумышленником. Тогда структура программы будет выглядеть примерно таким образом:
Код
Код
Буфер данных 50 байт.
Код хакера
Код хакера
В этом случае код хакера может натворить уже много серьезных дел. Если программа с внедренным кодом работает под правами root, то взломщик может прочитать пароли, открыть какую-либо дверь в системе или просто уничтожить все данные на сервере.
В последнее время ошибок с переполнением буфера становится все меньше, потому что появились средства автоматической проверки кода, но все же их достаточное количество. К тому же, в мире существует не так много хакеров, способных через ошибку переполнения буфера подставить свой собственный код. Но остается возможность написать программку, которая использует ошибку и будет простой в применении. В этом случае любой студент сможет ею воспользоваться для взлома вашего сервера, и это уже будет настоящей угрозой.
Помимо нарушения стека через переполнение буфера хакер может испортить код программы, используя неверное форматирование. Некоторые функции в программировании могут оказаться небезопасными при определенном использовании. Взломщик имеет возможность ввести такую информацию, которая при обработке программой изменит ее код. Принцип борьбы с такими ошибками схож с переполнением буфера, поэтому я не буду заострять на этой проблеме внимание, тем более что нас как пользователей и администраторов не волнуют тонкости создания машинного кода программы.
Если вы узнали о том, что один из сервисов подвержен атаке переполнения буфера, и можете временно обойтись без него, то его следует отключить. Если сервис не нужен, то, не задумываясь ни на одну секунду, удалите его с компьютера.
Если сервис необходим в вашей работе, то первым делом обратитесь на сайт разработчика. Там могут оказаться рекомендации по устранению ошибки, выполните их. Бывает, что разработчики предлагают всего лишь подправить какие-либо конфигурационные файлы, а иногда приходится скачивать последнее обновление программы.
Не устану напоминать, что своевременное обновление программ позволяет значительно повысить надежность сервера. В 90% случаев ошибки переполнения буфера устраняются именно таким образом, потому что связаны с неверной работой кода, и для их исправления требуется вмешательство в логику программы (и перекомпиляция) со стороны разработчика.
При отсутствии рекомендаций по устранению ошибки примите все меры для ограничения прав программы. Если она принадлежит пользователю root и установлен бит SUID или SGID, т.е. программа работает от имени владельца root, даже если ее запустил гость, то необходимо сбросить этот бит.
В качестве самостоятельной защиты от ошибок работы с буфером могу посоветовать воспользоваться утилитой Libsafe (www.research.avayalabs.com/project/libsafe). Это библиотека создает промежуточный уровень между программой и ОС, перехватывая опасные системные функции, вызываемые кодом взломщика, заменяя их своими аналогами.
У библиотеки один недостаток — происходит небольшая потеря производительности. Но это ничто по сравнению с преимуществами. Утилита не занимается защитой определенной программы или конкретной ошибки. Она направлена на решение большинства потенциальных проблем. От всего защититься невозможно, потому что хакеры всегда придумывают что-то новое. Но даже если обезопасить систему от части возможных ошибок, то система сможет работать безотказно продолжительное время.
14.3. Rootkit
Проникнув в систему, хакер стремится укрепиться в ней и получить максимальные возможности. Например, он уже может выполнять на сервере команды от имени простого пользователя. Этого ему будет мало, поэтому следующая цель — получение максимальных прав root со всеми вытекающими отсюда последствиями.
Для решения этой задачи взломщик должен получить возможность закачивать файлы и установить в системе одну из специализированных программ, повышающих права до администратора, — называются rootkit (набор администратора). После этого взломщик выполняет команды следующим образом:
□ от имени простого пользователя, правами которого обладает хакер, директивы посылаются программе rootkit;
□ программа rootkit выполняет полученные команды от имени администратора.
А как же rootkit получает возможность исполнять переданные ей команды с правами root? В этом помогает злополучный SGID-бит. Если он установлен, то программа будет выполняться в системе с максимальными правами администратора.
Но не все так просто. Для rootkit нужно установить SGlD-бит и владельцем определить пользователя root. Тут есть два пути:
□ Если есть возможность выполнять команды chown и chmod, то хакер сможет без проблем реализовать все необходимые действия.
□ Можно подменить программу, которая уже имеет установленный SUID- или SGID-бит.
Вот почему в разд. 12.2 мы так усердно вычищали все SUID- и SGID-программы, каждая из них — это дыра в безопасности, но иногда без этой прорехи жить невозможно. Вам необходимо регулярно следить за такими программами, и в случае появления удалять из системы. Вы также должны держать под контролем все изменения, которые происходят с уже установленными SUID- и SGID-программами. Если их размер изменился, то следует бить тревогу и восстанавливать исходное состояние программы.
Вы должны быть внимательны, когда проверяете SGID-программы. Хакеры знают, что администраторы стараются свести количество таких программ к минимуму, поэтому идут на разные уловки. Например, они могут создать файл /mnt/mount с SUID-битом. Программа mount действительно требует этого бита, но должна находиться в директории /bin. Если вы просматриваете список найденных SUID-программ бегло, то можете не заметить отличие в пути или вообще не обратить на это внимания.
Помимо этого, в названиях программ может идти игра букв. Например, /bin/login не требует такого бита. Хакер может создать файл /bin/1ogin (первая буква заменена на цифру 1), и визуально программа действительно должна быть в системе, хотя и без SUID- и SGID-бита, но вы не заподозрите ее в злодеянии.
Пакеты rootkit не ограничиваются только предоставлением доступа к выполнению команд от имени пользователя root. Они могут включать еще и различные вспомогательные утилиты, такие как анализаторы сетевого трафика (sniffer), программы управления файлами журналов, позволяющие чистить следы пребывания хакера в системе, и другие полезные взломщику средства.