Computerworld, США
Главное условие успеха для хакера — стать незаметным для администратора
Если хакер намерен что-то сделать с вашей информационной системой, например заразить ее вирусом, установить «троянца» или шпионскую программу, он должен получить привилегированный доступ к вашей системе. После этого он может изменить системные настройки, чтобы скрыть свои действия от системного администратора.
Как правило, сначала хакер получает доступ с правами обычного пользователя к компьютеру или сети, либо подбирая или перехватывая пароль, либо воспользовавшись известными изъянами в защите. Затем он находит способ заполучить идентификационную информацию всех пользователей и пароли для доступа к другим компьютерам сети. Когда-то хакерам приходилось делать это, опираясь только на собственные знания и опыт работы с системой, а также на свое умение программировать. Теперь их задача упростилась: в их распоряжении множество программных средств, которые в достаточной мере автоматизируют этот процесс; эту категорию программ обозначают термином rootkit.
Первоначально так называли набор особым образом модифицированных и перекомпилированных команд ОС Unix, предназначенных для сокрытия любых следов присутствия и деятельности хакера. Дэвид О?Брайен проследил происхождение rootkit до начала 90-х годов; в течение предыдущего десятилетия основными целями хакеров были операционные системы Sun Solaris и Linux. Однако сейчас rootkit не ограничиваются исключительно Unix-подобными системами, и создано множество аналогичных инструментов для других операционных систем, в том числе для Microsoft Windows.
Термином rootkit, или программы-невидимки, иногда называют набор утилит для получения привилегированного доступа к системе и сокрытия факта взлома, но это не совсем так. В состав «невидимок» могут входить утилиты для мониторинга трафика, создания скрытого входа в систему, изменения регистрационных файлов и организации атаки на другие машины в сети. Практически во всех случаях сам rootkit не наносит прямого вреда. Его задача состоит в том, чтобы замаскировать присутствие других видов программ, таких как «троянец», перехватчик клавиатуры, следящий за вводом паролей, вирус или червь. Rootkit делают это, фильтруя или удаляя информацию в регистрационных записях и распечатке соответствующих процессов.
Некоторые «невидимки» подменяют откомпилированные библиотеки системных команд их модифицированными версиями, с целью замаскировать деятельность хакера и не дать его вовремя обнаружить. Например, в ОС Linux или Unix подобный rootkit может заменить команду, выдающую список файлов (ls), на ту, которая не показывает файлы, расположенные в определенных каталогах. Или он может заменить утилиту ps, которая выдает перечень процессов, выполняемых в системе, на другую, не выдающую информацию о процессах хакера. Программы, регистрирующие системную активность, также могут быть схожим образом изменены, а потому системный администратор, проверяя регистрационные записи, не увидит отклонений, несмотря на то что в систему проник хакер.
Поиск невидимок
И rootkit, и компьютерные вирусы изменяют базовые программные компоненты, добавляя к системе код, который скрывает их присутствие и выполняет ряд дополнительных функций, называемых «полезной нагрузкой». Основное отличие между ними состоит в том, что вирус пытается тиражировать себя в другие системы, а действия rootkit, как правило, ограничены одной системой.
Rootkit, находящийся в вашей системе, — явное свидетельство того, что ваша система подверглась атаке хакера, и, безусловно, вам следует об этом знать. Одна из основных целей «невидимки» заключается в том, чтобы скрыть само свое существование, но вы можете обнаружить rootkit, который работает с привилегиями пользователя, отслеживая изменения размера, даты или контрольной суммы основных системных файлов; дело в том, что они решают свою задачу при помощи простой замены библиотечных файлов. Rootkit, работающие внутри ядра, найти сложнее, поскольку они используют возможность Unix (или Linux) загружать расширения ядра «на лету». Эти «невидимки» размещаются глубоко внутри операционной системы, перехватывая системные вызовы от легитимных программ и возвращая только те денные, которые отвечают интересам хакера.
Отсутствие доверия
Основная проблема при обнаружении rootkit заключается в том, что вы не можете полностью доверять тем сведениям, которые сообщает операционная система. Единственный способ решить эту проблему — выключить компьютер и проверить содержимое его памяти, загрузившись с альтернативного носителя, в чистоте которого вы уверены, например с компакт-диска, используемого для восстановления, или со специального флэш-модуля, подключаемого через USB-порт. Неработающий rootkit не может скрыть свое присутствие, и большинство антивирусных программы находят «невидимок», сравнивая стандартные вызовы операционной системы (которые, скорее всего, изменила «невидимка») с запросами более низкого уровня, в надежности которых нет повода сомневаться. Если система находит отличие, значит, в ней присутствует rootkit.
Как избавиться от «невидимок»? Их удаление сопряжено с двумя проблемами: удаление самого rootkit, а затем — удаление «полезной нагрузки», которую скрывала «невидимка». Поскольку rootkit меняют операционную систему, вполне возможно, что их удаление приведет к нестабильности системы (особенно на машинах с Windows). Расс Купер, основатель списка почтовой рассылки NTBugtraq, утверждает, что «только некомпетентный человек может попытаться удалить rootkit». В конечном итоге единственный безопасный и защищенный от некорректного использования способ борьбы с «невидимкой» — это переформатирование жесткого диска и установка операционной системы заново.
Простой пример «невидимки»
Важная особенность rootkit-ядра — это его способность скрывать свое присутствие и маскировать то, что реально происходит. Некоторые «невидимки» делают это следующим образом. При установке она меняет определенные системные вызовы и утилиты на свои собственные, тем самым модифицирует системные библиотеки и адреса вызова процедур.
Например, для того чтобы скрыть присутствие файла, rootkit должен перехватывать все системные вызовы, которые могут передавать имя файла в виде аргумента, такие как open(), chdir() и unlink().
Всякий раз, когда происходит вызов этих конкретных системных функций, он перенаправляется на измененную процедуру, которая проверяет передаваемые параметры. Если запрос не содержит или не обнаруживает скрытый файл, то выполняется «нормальный» системный вызов, а результаты возвращаются, как и ожидается.
Однако если в результатах выдачи могут появиться скрываемые данные, вместо вызова обычной функции выполняется вызов, модифицированный «невидимкой», что позволяет утаить любой нежелательный результат.
Если пользователь или система пытается манипулировать скрытым процессом, файлом, сетевым портом и так далее, то модифицированная команда должна сообщить об ошибке точно так же, как это делает нормальная команда в том случае, если объект на самом деле не существует.
Такого рода изменения ядра относительно легко обнаружить, поскольку они модифицируют обычно неизменяемые таблицы ядра для того, чтобы заменить адреса сегментов кода. Существуют и значительно более изощренные методы.