В этой статье будет продемонстрирована возможность модификации стандартного KVM-свитча с целью добавления функции перехвата нажатых клавиш на базе платформы Arduino.
Автор: Ian Payton, Security Advisory EMEAR
Введение
Слишком часто специалисты по безопасности при оценке рисков, связанных с устройствами, подключенными к сетям и системам, рассматривают только уязвимости в программном обеспечении. Когда речь заходит об оценке потенциальных рисков, связанных с подсоединенными устройствами, в том числе связанными с интернетом вещей, профессионал должен рассматривать не только бреши в программах и прошивках этих систем, но и физические уязвимости в аппаратной части.
Один из методов связан с физической модификацией систем, например, с целью добавления вредоносной функциональности для извлечения нужной информации без эксплуатации брешей в программном обеспечении.
В этой статье будет продемонстрирована возможность модификации стандартного KVM-свитча (Keyboard, Video monitor, Mouse; устройство для управления несколькими системами из одного места) с целью добавления функции перехвата нажатых клавиш на базе платформы Arduino. Мы покажем, что подобное можно сделать при помощи стандартных инструментов и компонентов с минимальными знаниями в области электроники и программирования.
KVM-свитчи представляют собой устройства, часто используемые в таких случаях, когда необходимо управлять множеством компьютеров при помощи одной клавиатуры, мыши и монитора.
Эти свитчи подразделяются на несколько категорий:
В этой статье мы будем рассматривать KVM-свитч из второй категории. Ситуация возникла во время одного из проектов, когда клиент обратил внимание на порт RJ45 и попросил провести оценку безопасности устройства.
KVM-свитч Belkin E Series OmniView 2-Port предназначен для домашнего пользования или небольших офисов и позволяет переключаться между управляемыми компьютерами при помощи комбинации горячих клавиш. Эта модель была выбрана в качестве наглядного образца среди устройств данной категории. Соответственно, результаты анализа применимы к схожим моделям от других производителей. На аукционе eBay можно найти экземпляры стоимостью менее 10 фунтов.
Рисунок 1: KVM-свитчBelkin E Series OmniView 2-Port
Внутреннее устройство свитча
Внутри корпуса обнаружились следующие компоненты:
PIC-микроконтроллер (однократного программирования) выпускаемый компанией Microchip Technology. Большая микросхема, распложенная в правой стороне задней части печатной платы рядом с цилиндрическим черным устройством, издающим звуковые сигналы. Как видно на рисунке ниже, микроконтроллер вставлен в двухрядный корпус, что сильно облегчает извлечение с целью последующего реверс-инжиниринга.
Тройные аналоговые сдвоенные мультиплексоры, выпускаемые компанией NXP. Двойной мультиплексор может переключить одиночный вход на один из двух выходов. Эти пять устройств, вероятно, формируют основную логику для переключения клавиатуры и мыши PS/2 между одним из четырех выходных портов.
Рисунок 2: Внутреннее устройство KVM-свитча Belkin E Series OmniView 2-Port
Микроконтроллер PIC16C57C
Модель PIC16C57C принадлежит семейству популярных микроконтроллеров, выпускаемых компанией Microchip Technology, которые также популярны среди радиолюбителей. В сети находится большое количество доступной документации. Даташит на модель PIC16C57C можно найти среди документации на микроконтроллеры того же семейства:
Документация содержит сведения о программировании и протоколе проверки подлинности, что упрощает реверс-инжиниринг.
Анализ прошивки
В спецификации по программированию/верификации микроконтроллера PIC16C57C говорится о том, как выполнить процедуру «быстрой верификации». Требуется следующая последовательность действий:
Рисунок 3: Схема пинов микроконтроллера PIC16C57C
При помощи этой процедуры вначале будет считан специальный конфигурационный регистр, содержащий псевдо-адрес 0xFFF. Как только на пине OSC1 начнут подаваться тактовые импульсы (шаги 6 и 7), будет считывается адрес 0x000, затем 0x001 и т. д.
Создание верификатора
Во время промышленного программирования для чтения содержимого памяти PIC-контроллеров можно использовать процедуру, описанную выше. Есть и другой путь: относительно простой протокол-верификатор на базе Arduino, системы разработки небольших микроконтроллеров (или любой другой похожей системы с достаточным набором входных/выходных пинов общего назначения, например, Raspberry Pi). 13В нужно подводить из внешнего источника, поскольку в системах разработки наподобие Arduino и Raspberry Pi, предусмотрены напряжения размером 5В и ниже.
На рисунке ниже показана плата Arduino Uno, подключенная к ZIF-сокету (Zero insertion force; с нулевым усилием сочленения) с подключенным микроконтроллером PIC16C57C, извлеченным из KVM-свитча. Источник питания для подачи напряжения 13В с целью активации режима программирования также показан. В следствие ограничений платы Arduino Uno, возможно чтение лишь 4 битов с микроконтроллера. Однако можно переконфигурировать устройство так, чтобы считать остальные биты и содержимое PIC16C57C в несколько подходов. Другие платы (например, Arduino Mega) имеют достаточно количество входных/выходных пинов для одновременного считывания всех 12 битов.
Рисунок 4: Верификация микроконтроллера PIC16C57C при помощи Arduino
Защита кода
Первое, что нужно считать с микроконтроллера PIC16C57C, - содержимое конфигурационного регистра, в котором находится информация для системы безопасности и генератора, а также бит, связанный с защитой кода. Если этот бит равен нулю, защита кода включена, и в этом случае невозможно считать содержимое памяти (верификация завершается успешно, но возвращаемое значение не содержит информацию, находящуюся по нужному адресу в памяти).
К сожалению, содержимое конфигурационного бита в PIC16C57C, изъятого из подопытного KVM-свитча, свидетельствовало о том, что защита кода включена и считать память невозможно.
Анализ логики работы микросхемы
После анализа прошивки в предыдущем разделе стало понятно, что считать память микроконтроллера PIC16C57 невозможно. Таким образом, использование KVM-свитча в качестве клавиатурного шпиона можно добиться двумя способами:
Исследование назначения пинов
В микроконтроллере PIC16C57C есть 20 входных/выходных выводов общего назначения. Назначение этих пинов можно исследовать при помощи мультиметра, осциллографа или логического анализатора, подсоединенных к нужным выводам. Во время подключения к пину KVM-свитч выполняет определенные функции и одновременно отслеживается сигнал на выводе с целью сопоставления выполняемой функции и измеряемого сигнала. Перепады напряжений на пинах могут быть медленными (например, когда включается/выключается LED-подсветка) или быстрыми (например, на информационной шине или шине, связанной с таковыми сигналами). Быстрые перепады можно отследить лишь при помощи осциллографа или логического анализатора.
Каждый пин должен быть исследован во время выполнения различных функций в KVM-свитче:
На рисунке ниже показан подключенный осциллограф, который использовался для исследования функционального пинов во время нажатий на клавиатуре.
Рисунок 5: Схема подключения осциллографа для исследования функциональности пинов
Последующий анализ печатной платы можно сделать при помощи мультиметра в режиме измерения сопротивления, чтобы определить, какие из пинов подсоединены к остальным компонентам. В случае с KVM-свитчем модели Belkin исследование значительно облегчается, поскольку микроконтроллер PIC16C57C вставлен в разъем, и мы можем просто извлечь микросхему и измерить сопротивление между пинами и остальными компонентами.
Некоторые пины микроконтроллера PIC16C57C имеют неизменную функциональность (см. диаграмму выходного сигнала выше). Для нас особый интерес представляют входные/выходные пины под номерами 6-25. Исследование при помощи осциллографа и мультиметра выявило следующее:
Пины 6-14:
Пины 15-25
Назначение пинов 10-11: Изоляция выходов
Как было отмечено выше, на пинах 10-11 во время переключения появляется низкий уровень. Кроме того, во время переключения была замечена активность на информационных и тактовых пинах, связанных с разъемами PS/2 (20-23). Скорее всего, KVM-свитч временно отключает выходы разъема PS/2 и посылает сигналы сброса для мыши и клавиатуры, которые участвуют в процессе переключения. Протокол, используемый разъемами PS/2, является двунаправленным, позволяя хосту управлять функциями подключенного устройства. Например, можно устанавливать индикаторы состояния клавиш Caps lock, Num lock и т. д. KVM-свитчу нужно следить за этими настройками для каждого устройства (клавиатуры и мыши) в разрезе по хосту/порту. При переключении между портами необходимо восстанавливать последнее сохраненное состояние для каждого хоста. Чтобы решить эту задачу во время переключения, KVM-свитч выставляет на пине 10 или 11 низкий уровень для отключения соответствующего выходного порта. Затем происходит отсылка сигналов по шине PS/2 к подключенной мыши или клавиатуры для обнуления состояния. Выставление низкого уровня на пине 10 или 11 необходимо для того, чтобы хост, подключенный к выходному порту, не мог отслеживать сигнал между KVM-свитчем и мышью/клавиатурой.
Кроме того, KVM-свитч поддерживает переключение при помощи горячих клавиш. Вход в этот режим осуществляется после двойного нажатия клавиши «Scroll Lock». Затем появляется звуковой сигнал, сигнализирующий, что устройство перешло в состояние для считывания горячих клавиш, и свитч ожидает нажатия дополнительных клавиш в течение 1 секунды. Любое нажатие в течение этого времени интерпретируется KVM-свитчем и не отсылается подсоединенному компьютеру. Этот функционал требует, чтобы выходные порты, подключенные к шине PS/2, были отключены в то время, пока свитч ожидает нажатия горячих клавиш, что достигается посредством выставления на пине 10 или 11 низкого уровня.
Неполный анализ
Анализ, проведенный выше, выявил много нового относительно функциональности KVM-свитча. Однако остались некоторые невыясненные моменты. На нескольких пинах (12-19) не было замечено никакой активности во время работы с KVM-свитчем. Если бы на этих пинах всегда был высокий уровень, означающий обычно стандартное или неактивное состояние, можно было бы сделать предположение, что эти выводы не используются. Однако тот факт, что на некоторых пинах был низкий уровень, намекает на то, что возможно данные выводы используются. Исследование дорожек на печатной плате показало, что подсоединен только Пин 14, но пока с непонятным предназначением.
Поскольку анализ является неполным, восстановление рабочей прошивки с нуля, может стать непростой задачей. Значит, для внедрения клавиатурного шпиона у нас остается второй вариант, связанный с подключением второго микроконтроллера.
Интерфейс PS/2
Чтобы получить доступ к информации, вводимой с клавиатуры, в интерфейсах PS/2, используемых на KVM-свитче, необходимо понимать, как устроен этот протокол. С описанием протокола PS/2 можно ознакомиться по следующей ссылке:
Интерфейс PS/2 может управлять либо хостом, либо устройством, подключенным к выходному порту. Электрические характеристики этого интерфейса подразумевают, что возможно внедрить данные в шину PS/2 даже, когда к ней подключены одновременно и хост и устройство. Этот факт полезно принять во внимание при внедрении дополнительного контроллера в KVM-свитч.
Реализация клавиатурного шпиона
Учитывая рассуждения выше, мы можем подключить второй микроконтроллер к PIC16C57C для реализации клавиатурного шпиона. В идеале должны использоваться только сигналы на пинах микроконтроллера PIC16C57C, что позволит реализовать схожую функциональность в прошивке дополнительного контроллера.
Съем собранной информации следует реализовывать на базе уже существующих интерфейсов KVM-свитча. Впоследствии злоумышленнику понадобится лишь физический доступ к KVM-свитчу для извлечения собранной информации. На втором микроконтроллере нужно реализовать дополнительную последовательность нажатых клавиш, при активации которой будет происходить выгрузка записанных нажатий в систему, подключенную к KVM-свитчу. Затем злоумышленник может открыть текстовый редактор на целевой системе и нажать комбинацию горячих клавиш для выгрузки записанной информации в текстовый файл.
Ограничения по электрическим характеристикам
Существует серьезное ограничение при подключении второго микроконтроллера к PIC16C57C, которое заключается в том, что сигнал любого пина, сконфигурированного как выходного в PIC16C57C, не может быть переключен в другое состояние дополнительным микроконтроллером. Выдержка из даташита на микроконтроллер PIC16C57C (раздел 7.6.1):
«Пин, выдающий высокий или низкий уровень не должен одновременно управляться внешним устройством для изменения уровня сигнала на этом выводе (при помощи элементов «Логическое Или», «Логическое И»). Результирующие выходные токи могут испортить чип».
Сей факт означает, что реализация клавиатурного шпиона и выгрузка собранной информации должна быть на базе пинов микроконтроллера PIC16C57C, которые сконфигурированы как входные.
Совместное использование шины PS/2
Один из вариантов для извлечения информации из клавиатурного шпиона – отправка данных как серии нажатых клавиш на подсоединенный хост. Чтобы решить эту задачу, KVM-свитч должен взять на себя роль периферического устройства (клавиатуры) на шине PS/2 и наладить коммуникацию с хостом от имени «поддельной» клавиатуры. Однако в то же время шина PS/2 будет подсоединена к настоящей клавиатуре. Здесь возникает закономерный вопрос, возможно ли извлечение информации в при таких обстоятельствах.
Шина PS/2 спроектирована для прямого соединения между хостом и периферическим устройством. Это простой двухканальный протокол (тактовые импульсы и информационная шина), который поддерживает двухстороннюю коммуникацию. Этот функционал основан на интерфейсе с открытым коллектором для тактового и информационного пинов (см. раздел "The Electrical Interface"), позволяя либо хосту, либо периферическому устройству устанавливать низкий уровень на любом из пинов.
Таким образом, чисто с позиции электрических характеристик второе периферическое устройство (KVM-свитч) может управлять тактовым и информационным пинами интерфейса PS/2. С точки зрения хоста, периферические устройства (настоящая клавиатура или KVM-свитч, работающий в качестве «поддельной» клавиатуры) будут неразличимы. Однако здесь возникает вопрос, будет ли провоцировать активность «поддельной» клавиатуры неожиданное поведение настоящей клавиатуры.
В протоколе PS/2 большая часть коммуникаций происходит между периферическим устройством и хостом. Тактовые импульсы и информацию большую часть времени генерирует периферическое устройство. Если хосту нужно отправить информацию периферическому устройству, например, установить состояние LED-индикации для клавиши Caps Lock), то вначале хост оповещает периферическое устройство о том, что планируется пересылка информации, посредством удерживания низкого уровня более 100 мкс как части сигнала для «запроса на отправку». Таким образом, сложность заключается в том, что активность на шине PS/2 со стороны KVM-свитча, функционирующего в качестве «поддельной» клавиатуры, может быть интерпретировано настоящей клавиатуры как «запрос на отправку» от хоста.
При отсылке сигналов по шине PS/2 периферическое устройство генерирует тактовые импульсы в диапазоне 10-16.7 КГц, и длительность импульса 100 мкс будет соответствовать самой низкой тактовой частоте (10 кГц). Таким образом, чтобы активность поддельной клавиатурой не интерпретировалась как «запрос на отправку», нужно понижать уровень максимум на 50 мкс. В этом случае общее использование шины PS/2 становится возможным.
Детектирования нажатия последовательности горячих клавиш
Выгрузка снятой информации будет активироваться при помощи дополнительного нажатия последовательности горячих клавиш. Вначале нужно дважды нажать клавишу «Scroll Lock» в течение определенного времени. Затем PIC16C57C выставляет низкий уровень на соответствующем пине (10 или 11), связанным с подключением выходных портов, в течение около 1 секунды для предотвращения отсылки нажатых клавиш хосту. В течение этого времени ожидается нажатие последовательности нажатых клавиш. Например, нажатие клавиши «1» или «2» приведет к переключению на выходной порт 1 или 2 соответственно.
Существует два пути для реализации нажатия клавиш с целью извлечения сохраненной информации:
При независимом детектировании двойного нажатия «Scroll Lock» есть риск, что PIC16C57C и второй микроконтроллер не смогут обнаружить этот факт в одно и то же время. Соответственно, нужно использоваться второй способ, связанный с состоянием пинов, подключающих выходные порты, поскольку этот метод более надежен для определения того, что KVM-свитч ожидает нажатия горячих клавиш.
Экспериментальное оборудование
При изготовлении экспериментальной версии клавиатурного шпиона использовалась плата Arduino Uno. На этой плате есть входные/выходные пины и среда программирования на базе языка С, при помощи которой можно получать доступ к выводам с целью установки прототипов.
Рисунок 6: Экспериментальная версия клавиатурного шпиона на базе платы Arduino Uno
На рисунке выше показана плата, подключенная к микроконтроллеру PIC16C57C, используемого KVM-свитчем.
В экспериментальных целях используется только шина, включающая Порт 2.
Программное обеспечение для клавиатурного шпиона
Алгоритм работы
В целом программа на платформе Arduino будет находиться в трех состояниях:
Если опознана последовательность горячих клавиш, необходимо дождаться, когда сигнал, связанный с подключение выходного порта, вновь станет высокого уровня. Иначе любые данные, связанные с нажатием и добавляемые в шину PS/2 не увидит хост. В экспериментальной версии используется последовательность нажатых клавиш QQ (от слова «Query»). Два наатия сделано для того, чтобы настоящий пользователь KVM-свитча случайно не ввел эту комбинацию.
Запись нажатых клавиш
Преимущество разработки на базе Arduino заключается в том, что имеется большое количество библиотек. Для нашего случая использовалась библиотека «PS2Keyboard», доступная под лицензией LGPL. В этой библиотеке реализовано чтение нажатых клавиш с клавиатуры PS/2, управляемой прерываниями, а также автоматическая конвертация скан-кодов в ASCII символы с учетом состоянии регистра. В итоге в приложение попадает информация в формате ASCII.
Из-за того каким способом плата Arduino подсоединена к микроконтроллеру PIC16C57C, необходимо использовать те же самые пины для чтения данных с клавиатуры во время считывания нажатий и записи информации от имени клавиатуры. PS2Keyboard поддерживает только чтение данных, а для отсылки нужна отдельная библиотека. Чтобы добавить эту возможность, необходимы небольшие изменения в дополнении к методу end(), связанные с разблокировкой прерывания, используемого при чтении информации. Без этого дополнения библиотека PS2Keyboard будет считывать информацию и во время нажатия.
Во время записи нажатий, информация, получаемая из библиотеки, хранится в кольцевом буфере и готова к выгрузке. Кроме того, не следует забывать, что эти данные в формате ASCII, а не скан-коды протокола PS/2. Этот факт следует учитывать во время передачи информации.
Выгрузка собранной информации
Чтобы выгрузить собранную информацию о нажатии клавиш через интерфейс клавиатуры PS/2 необходима другая библиотека. Поскольку среди уже существующих бесплатных нужная отсутствует, необходимо писать решение с нуля.
Протокол PS/2 использует тактовую частоту в диапазоне 10-16.7 кГц и отсылает последовательные данные со следующими характеристиками:
Информация считывается хостом на спадающем фронте тактового импульса (во время перепада от высокого уровня к низкому). Подобный формат передачи данных не соответствует ни одному встроенному протоколу, используемому в Arduino. Соответственно, нужно писать новый драйвер. Чтобы реализовать протокол PS/2, можно использовать драйвер, генерирующий программные прерывания на частоте, которая в два раза больше диапазона 10-16.7 кГц (чтобы генерировать и нарастающие и спадающие фронты тактового импульса). Плата Arduino Uno поддерживает 3 аппаратных таймера, способных генерировать программные прерывания. В нашей экспериментальной версии был выбран Timer 2 (Timer 1 используется некоторыми стандартными библиотеками Arduino и является непригодным).
Был написан драйвер, который вручную устанавливает тактовые импульсы протокола PS/2, а также информационные пины с использованием таймера Timer 2 на плате Arduino, генерирующего прерывания на частоте 25 кГц. При каждом прерывании на тактовом пине постепенно устанавливается низкий/высокий уровень и на информационном пине – стартовый бит, биты данных, бит четности и стоповый бит, как того требует спецификация.
Когда стартует процесс выемки записанной информации при помощи последовательности клавиш, необходимо передать данные из кольцевого буфера. Поскольку в буфере находятся шестнадцатеричные ASCII символы перед отправкой требуется обратное преобразование в скан-коды, которые допустимы для передачи по протоколу PS/2. Чтобы облегчить конвертацию информация извлекалась в формате, совместимом с утилитой 'xxd', которая используется в Linux и других схожих системах, подобно тому, как показано ниже:
7373682074617267657473797374656d
0a726f6f740a50617373773072643132
330a
Для каждого выходного шестнадцатеричного символа драйвер протокола PS/2 генерирует скан-код нажатой клавиши, соответствующий шестнадцатеричному символу, а затем скан-код той же самой отпущенной клавиши. Весь процесс продолжается до тех пор, пока не будет обработано содержимое всего буфера.
Конечный результат процесса выгрузки – на подключенном хосте появляется последовательность сохраненных нажатий в шестнадцатеричном представлении. Злоумышленнику нужно открыть текстовый редактор на целевой системе, активировать выгрузку и наблюдать, как будет появляться информация в редакторе.
Исходный код
Исходный текст экспериментального клавиатурного шпиона можно найти здесь:
Заключение
Модификация аппаратной части является реальной угрозой для организаций. При помощи относительно простого оборудования и минимальных технических знаний можно сделать систему для тайного сбора и выгрузки информации. Компаниям следует не забывать об этой угрозе и предпринимать соответствующие меры безопасности хотя бы в части устройств, имеющих отношение к конфиденциальным данным.
Понимание, чем отличается «обычный» трафик от необычной сетевой активности, как, например, неожиданное подключение нового устройство к внешнему источнику, может помочь организациям вовремя обнаружить и заблокировать утечку информации. В критически важных средах компаниям следует отслеживать любое новое устройство, которое подключается к ключевым системам, включая даже простое периферийное оборудование. В некоторых случаях необходим физический осмотр оборудования с целью обнаружения незаконных проникновений и модификаций.
Большой взрыв знаний каждый день в вашем телефоне