Современные клавиатурные шпионы
Клавиатурный шпион на базе руткит-технологии в UserMode
Клавиатурный шпион на базе руткит-технологии в KernelMode
Аппаратные клавиатурные шпионы
1. Аппаратная закладка внутри клавиатуры
2. Считывание данных с кабеля клавиатуры бесконтактным методом
3. Включение устройства в разрыв кабеля
4. Аппаратная закладка внутри системного блока
5. Съем информации на основании анализа акустических и электромагнитных излучений
Чуть более года назад в нашем журнале уже рассматривались основные принципы работы клавиатурных шпионов, работающих по традиционным схемам в пользовательском режиме (UserMode). Однако существует ряд альтернативных методик для построения весьма эффективных шпионских программ, следящих за клавиатурным вводом и буфером обмена.
Драйвер-фильтр
Работа кейлоггеров данного типа основана на установке драйвера, подключаемого к драйверу клавиатуры в качестве фильтра. Пример реализации фильтра клавиатуры приведен в DDK, и данный шпион является одним из самых простых в плане как реализации, так и обнаружения.
Клавиатурный шпион этого типа может быть построен по одной из двух схем:
- драйвер-фильтр в сочетании с управляющим приложением, которое выполняет установку, загрузку и настройку драйвера. Драйвер передает информацию о нажимаемых клавишах управляющему приложению, которое производит обработку и протоколирование полученных данных;
- полностью автономный драйвер самостоятельно ведет запись событий. В данном случае требуется только произвести первичную установку драйвера в систему, после чего установившее драйвер приложение может самоуничтожиться. Возможно решение и без приложения-инсталлятора — в этом случае драйвер устанавливается при помощи INF-файла.
В момент загрузки драйвер должен подключиться к стеку клавиатурного драйвера посредством функций IoCreateDevice и IoAttachDevice. В большинстве известных реализаций фильтр подключается к стеку устройства «\\Device\\KeyboardClass0», являющегося драйвером класса и реализующего общую функциональность для клавиатур различных типов (рис. 1).
Рис. 1
Для клавиатурного шпиона будут представлять интерес только прерывания типа IRP_MJ_READ, поскольку на основе их анализа можно получить коды клавиш. Источником этих IRP-запросов является процесс csrss.exe, а точнее — принадлежащий этому процессу поток необработанного ввода RawInputThread. Посылаемое этим потоком прерывание сначала попадает к драйверу-фильтру шпиона (шаг 1), который устанавливает свой обработчик завершения при помощи функции IoSetCompletionRoutine и передает IRP драйверу Kbdclass (шаг 2). Тот, в свою очередь, помечает IRP как ожидающий завершения и ставит в очередь. При возникновении клавиатурных событий Kbdclass извлекает из очереди ожидающий завершения IRP, вносит в его буфер информацию о нажатых клавишах и завершает IRP. А поскольку в IRP установлен адрес обработчика завершения, то будет произведен вызов этого обработчика (шаг 3). Обработчик может проанализировать содержимое буфера и передать содержащуюся там информацию системе протоколирования (шаг 4). Далее IRP возвращается в поток RawInputThread, а затем весь процесс повторяется. Естественно, что наличие корректно написанного драйвера-фильтра никак не сказывается на работе приложений и обеспечивает глобальный перехват клавиатурного ввода.
Обнаружение описанного шпиона не представляет особой сложности, — для его поиска достаточно изучить стек клавиатурного драйвера на предмет наличия неопознанных драйверов-фильтров.
Подмена драйвера клавиатуры
Данный метод в действительности основан на подмене драйвера Kbdclass или одного из низкоуровневых драйверов клавиатуры драйвером собственной разработки. Сложность реализации указанного метода состоит в том, что заранее неизвестен тип применяемой пользователем клавиатуры, а потому подмену драйвера сравнительно просто обнаружить. Вследствие этого подобный метод практически не встречается.
Клавиатурный шпион на базе руткит-технологии в UserMode
Принцип действия такого клавиатурного шпиона основан на перехвате ряда функций USER32.DLL для мониторинга их вызовов. Данные вредоносные программы пока не получили особого распространения, но это только вопрос времени. Опасность применения руткит-технологии в клавиатурном шпионе объясняется тем, что, во-первых, многие антикейлоггеры не рассчитаны на поиск шпионов такого типа и не способны им противодействовать, а во-вторых, антируткиты часто не проверяют перехваты функций библиотеки user32.dll.
Принцип работы шпиона достаточно прост: при помощи любой из известных руткит-технологий производится перехват одной или нескольких функций, позволяющих получить контроль над вводимой с клавиатуры информацией. Самым простым является перехват функций GetMessage и PeekMessage (рис. 2).
Рис. 2
Работа шпиона организована следующим образом. Приложение вызывает функцию PeekMessage для того, чтобы узнать, есть ли в очереди сообщения указанного типа. Этот вызов перехватывается по руткит-принципу (методика в данном случае не имеет значения). Затем перехватчик вызывает реальную функцию PeekMessage из user32.dll и анализирует возвращаемые результаты. Если функция возвращает true, это означает, что сообщение было в очереди и что оно извлечено в тот буфер, указатель на который передается в качестве первого параметра функции. В этом случае перехватчик проверяет сообщения в буфере на предмет обнаружения сообщений типа WM_KEYDOWN (нажатие клавиши), WM_KEYUP (отпускание клавиши), WM_CHAR (посылается окну после обработки WM_KEYDOWN при помощи TranslateMessage). При выявлении подобного сообщения можно узнать код нажимаемой клавиши и передать его системе протоколирования и анализа (шаг 4). Далее управление возвращается приложению (шаг 5), которое не знает о наличии перехватчика.
Подобный клавиатурный шпион очень опасен, так как:
- он не обнаруживается стандартными методиками поиска клавиатурных шпионов;
- возможно внедрение перехватчика по определенным условиям, в результате чего он внедряется не во все GUI-процессы, а в строго определенные (например, в процессы браузера или в приложение типа WebMoney);
- против него бесполезны экранные клавиатуры и прочие средства борьбы с клавиатурными шпионами;
- кроме перехвата функций PeekMessage и GetMessage, могут быть перехвачены функции копирования информации при работе с буфером обмена (OpenClipboard, CloseClipboard, GetClipboardData, SetClipboardData), опроса состояния клавиатуры (GetKeyState, GetAsyncKeyState, GetKeyboardState) и другие функции user32.dll, что усиливает опасность шпиона, а перехват функций типа CreateWindow позволяет отслеживать создание окон.
Клавиатурный шпион на базе руткит-технологии в KernelMode
Принцип действия шпиона данного типа аналогичен UserMode, но в данном случае производится перехват одной или нескольких функций win32k.sys. Как и в случае с UserMode, наибольший интерес для перехватчика представляет функция PeekMessage и ее аналоги, поскольку это позволяет производить мониторинг и модификацию абсолютно всех получаемых программой сообщений без установки ловушки или фильтра.
На рис. 3 перехватчик показан условно, поскольку для его установки существуют разные методики, в частности:
- перехват SYSCALL и INT 2E;
- перехват функции с подменой адреса в соответствующей ячейке таблицы KeServiceDescriptorTableShadow. Единственной сложностью для создателя подобного шпиона является поиск этой таблицы, которая не экспортируется ядром и не документирована. Однако известны пути преодоления этой проблемы, а средства для этого можно найти в Интернете;
- модификация машинного кода win32k.sys. Для этого тоже необходим поиск таблицы KeServiceDescriptorTableShadow. При этом возможна интересная ситуация: функция может быть уже перехвачена (например, антикейлоггером), и тогда будет произведена модификация машинного кода перехватчика, что еще больше усложнит обнаружение шпиона.
Рис. 3
Алгоритм работы шпиона весьма прост. Приложение вызывает функцию библиотеки user32.dll (шаг 1; в качестве примера рассмотрим вызов PeekMessage). Функция PeekMessage в user32.dll по своей сути является переходником, а в конечном счете при помощи SYSCALL в Windows XP или INT 2E в Windows NT и Windows 2000 будет произведен вызов функции ядра (шаг 2). Этот вызов будет перехвачен шпионом (местоположение перехватчика зависит от методики перехвата). Перехватчик, в свою очередь, вызовет реальную функцию (шаг 3) и проанализирует возвращенные ей результаты. В случае успешного извлечения из очереди сообщения нужного шпиону типа он произведет его анализ и за-протоколирует результаты (шаг 4). Работа шпиона абсолютно незаметна для всех приложений, и обнаружить его можно только специальными программами, производящими поиск перехватов и модификации машинного кода модулей ядра.
***
Итак, мы рассмотрели несколько эффективных методик, которые могут применяться при построении клавиатурных шпионов. На основании вышеизложенного можем дать следующие рекомендации:
- следует акцентировать внимание на перехватах функций user32.dll;
- необходим контроль штатных драйверов по каталогу Microsoft для своевременного обнаружения подмены драйвера;
- нужно производить анализ на предмет наличия KernelMode-перехватов и модификации машинного кода win32k.sys при помощи антируткитов;
- вследствие того что практически любой клавиатурный шпион сохраняет протоколы, мониторинг файловых операций в процессе активного ввода информации с клавиатуры позволяет обнаружить кейлоггер почти любого типа. Исключение составляют специализированные программы, протоколирующие ввод только в определенных приложениях или в заданных окнах, например в окне ввода пароля.
Аппаратные клавиатурные шпионы
Для поиска клавиатурных шпионов на домашнем компьютере вполне достаточно удостовериться в отсутствии программ-кейлоггеров. Но в корпоративной среде, в частности на компьютерах, применяемых для выполнения банковских операций, для проведения электронных торгов или для решения задач, связанных с обработкой секретных документов, имеется опасность применения аппаратных средств, предназначенных для регистрации вводимой с клавиатуры информации. Рассмотрим основные каналы утечки информации с точки зрения применения аппаратных средств.
1. Аппаратная закладка внутри клавиатуры
В любой клавиатуре обычно бывает много полостей, размер которых достаточен для размещения небольшой платы. Питание устройства и съем информации может производиться путем непосредственного подключения к печатной плате контроллера клавиатуры. Аппаратная закладка может быть установлена вручную или промышленным способом. Например, на сайте http://www.keyghost.com можно увидеть рекламу клавиатур со встроенным аппаратным кейлоггером.
Методика противодействия: вскрытие клавиатуры и ее проверка на предмет наличия посторонних электронных узлов с последующим пломбированием корпуса клавиатуры при помощи пломбира или стикера.
2. Считывание данных с кабеля клавиатуры бесконтактным методом
Данная методика предполагает считывание информации посредством бесконтактного датчика. Для установки такого устройства не требуется ни вскрытия клавиатуры, ни включения каких-либо устройств в разрыв кабеля. Бесконтактный аппаратный кейлоггер должен иметь автономное питание, а его устройство значительно сложнее, чем в случае непосредственного подключения. По внешнему виду подобное устройство может выглядеть как съемный фильтр помех, надеваемый на кабель.
Методика противодействия: бесконтактное считывание наиболее эффективно в случае размещения датчика в непосредственной близости от кабеля клавиатуры (а еще лучше — вокруг этого кабеля), а потому при проверке рабочих мест необходимо убедиться в отсутствии посторонних предметов неизвестного назначения вблизи кабеля клавиатуры или непосредственно на нем.
3. Включение устройства в разрыв кабеля
Клавиатурные шпионы данного типа являются самыми распространенными и их легко как установить, так и обнаружить. Аппаратный кейлоггер выполняется в виде небольшого устройства, которое включается в PS/2- или USB-разъем компьютера, а клавиатура включается в разъем на корпусе кейлоггера. Для выполнения подобной операции не требуется никакой квалификации, причем подключение кейлоггера к USB-клавиатуре может производиться без выключения компьютера. Известен ряд серийно выпускаемых устройств, например KEYKatcher Hardware Keyloggers (http://www.keykatcher.com), который выпускается в двух видах — для PS/2- и USB-клавиатур. Другой пример — KeyGhost (http://www.keyghost.com).
Компьютер с установленным аппаратным кейлоггером KeyGhost
Аппаратный кейлоггер может выглядеть как фильтр помех или переходник. Устройство состоит из входных цепей, предназначенных для фильтрации помех и защиты устройства от перенапряжения, микроконтроллера с малым потреблением электроэнергии и Flash-памяти, предназначенной для хранения собираемой информации. Объем Flash-памяти варьируется от 32 Кбайт до десятков мегабайт; типичный объем — от 128 Кбайт до 2 Мбайт.
Функциональная схема аппаратного кейлоггера
Методика противодействия: периодический осмотр рабочего места на предмет наличия посторонних устройств, включенных в разрыв кабеля клавиатуры. Штекер клавиатуры довольно просто защитить стикером, нарушаемым при извлечении штекера из разъема.
4. Аппаратная закладка внутри системного блока
Этот шпион не отличается по принципу действия от устройств типов 1 и 3, но размещается внутри системного блока. Установить его может только специалист, причем для этого потребуется вскрытие корпуса.
Методика противодействия: пломбирование системного корпуса при помощи стикеров. Перед пломбировкой необходимо исследовать содержимое системного блока и убедиться в отсутствии посторонних устройств (типовое место подключения — материнская плата; подключение производится параллельно разъему клавиатуры).
5. Съем информации на основании анализа акустических и электромагнитных излучений
Уловить электромагнитное излучение клавиатуры на расстоянии весьма сложно (хотя теоретически и возможно), но уловить акустические шумы — на порядок проще. Даже при разговоре по телефону иногда можно отчетливо услышать, как собеседник вводит информацию на клавиатуре. Исследования специалистов в области безопасности показывают, что каждая клавиша при нажатии производит специфический звук, позволяющий идентифицировать нажимаемые клавиши. Наиболее известная работа в этом направлении проведена учеными Калифорнийского университета в Беркли (подробнее см. http://zdnet.ru/?ID=498415), которые пришли к выводу, что по обычной звукозаписи можно распознавать от 60 до 96% вводимых символов. Без применения специализированных программ для анализа можно достаточно просто установить количество символов в набираемом пароле и наличие повторяющихся символов.
Методика противодействия: основной способ защиты от утечки информации путем анализа акустических сигналов — постоянный и планомерный инструктаж персонала.
Выводы
Известно, что сегодня существует универсальная и надежная методика, позволяющая обойти аппаратный клавиатурный шпион, — это использование экранной клавиатуры и иных способов ввода информации без применения клавиатуры. Следует отметить, что большинство современных антикейлоггеров специально для этих целей содержат собственную встроенную экранную клавиатуру.
Поиск аппаратных кейлоггеров непременно следует включить в должностные обязанности сотрудников службы информационной безопасности. При этом, естественно, необходимо иметь в виду, что вероятность установки аппаратного кейлоггера прямо пропорциональна ценности информации, вводимой на рабочем месте.