Современные ноутбуки всё чаще оснащаются встроенными сканерами отпечатков пальцев, обеспечивающими быстрый и удобный доступ к устройству. Несмотря на распространённость технологий биометрической аутентификации, многие модели сканеров остаются недоступными для систем Linux из-за отсутствия поддержки драйверов и информации о внутренних протоколах. В 2021 году был опубликован подробный разбор протокола USB-сканера отпечатков пальцев Goodix, используемого в Lenovo Ideapad 5, который проливает свет на процесс установления связи с устройством, обмен данными, механизмы безопасности и способ расшифровки снимков пальца. Анализ основан на реверс-инжиниринге штатного Windows-драйвера, логировании трафика и эксплуатации возможностей отладки пользовательского режима драйверов Windows (UMDF). Устройство подключается по USB и работает через проприетарный протокол, использующий TLS-PSK для шифрования трафика, что значительно осложняет попытки пассивного перехвата и анализа данных.
Автор провел тщательный анализ USB-трафика с использованием Wireshark и usbmon, установив, что передаваемые большие пакеты данных содержат зашифрованное изображение, получить которое без ключа невозможно. Строковые данные, обнаруженные в начале взаимодействия, стали отправной точкой для поиска дополнительной информации о сенсоре и проведению дальнейшего анализа. Особое внимание уделялось возможности использовать стандартные методы расшифровки, однако ввиду работы TLS и шифрования ключей, прямой доступ к изображению оставался недоступным. Для понимания взаимодействия драйвера и устройства был проанализирован пользовательский драйвер Windows, работающий в пространстве пользователя, что упростило задачу отладки и выявления логики. При помощи дизассемблера и отладчика x64dbg удалось получить доступ к подробным логам драйвера, включающим функции и строки исходного кода благодаря вписанным в бинарник именам.
Полученные данные позволили лучше понять последовательность обмена данными, особенно процесс инициализации TLS-сессии. Оказалось, что драйвер устанавливает TLS-соединение с устройством, применяя предварительно разделенный ключ (PSK), который хранится на устройстве и в памяти драйвера. Особенностью реализации является тот факт, что PSK шифруется с использованием системного механизма Windows CryptProtectData, привязанного к учетной записи пользователя, что исключает возможность простого переноса ключа между системами без снижения безопасности. Этот механизм работает по принципу доверия с «первого использования»: при подключении к новому ПК драйвер сгенерирует новый случайный PSK, который будет записан на устройство, заменяя прежний, если дешифровка старого не удалась. Такая схема позволяет избежать недопустимого прослушивания данных, но ставит под угрозу безопасность в случае замены ключа злоумышленником без уведомления пользователя.
Замена PSK с помощью отладки драйвера позволила автору задать фиксированный ключ, обеспечив устойчивую расшифровку потока. Ключевой элемент защиты – использование whitebox-криптографии для реализации шифрования PSK перед записью его в память устройства, что препятствует простой извлекательной атаке на ключ. Тем не менее, белый ящик оказался недостаточно защищённым, что позволило частично или полностью проанализировать и воспроизвести механизм шифрования, открывая путь к дальнейшим модификациям. Помимо разбора протокола, особое внимание было уделено формату передаваемого изображения отпечатка. Расшифрованные данные с низкой энтропией свидетельствовали о корректной работе дешифровки, но первоначально изображение выглядело как «шум».
При помощи инструментов типа GIMP и анализа размеров можно было определить разрешение сканера – 54x176 пикселей при 500 dpi. Пиксели представлены с глубиной 12 бит, что диктовало специфическую упаковку данных в байты – каждые 4 пикселя упаковывались в 6 байт по нестандартной схеме. Это позволило построить алгоритм декодирования, который выдаёт четкое изображение отпечатка без искажений. В завершение работы был создан proof-of-concept драйвер на языке Python. Он устанавливает соединение, задает ключ, инициирует TLS-сессию и способный получать поток изображений с частотой до 16 кадров в секунду.
Для реализации TLS-соединения пришлось обойти ограничение большинства библиотек, ожидающих сокет TCP, и использовать прокси, перенаправляющий USB-трафик через TCP-сервер OpenSSL с поддержкой PSK. Это решение позволило также применять Wireshark для подробного анализа и отладки. Данный проект оказал важное значение для сообщества пользователей Linux, заинтересованных в поддержке недокументированных или новых моделей сканеров Goodix в рамках известной библиотеки libfprint. Он показал, что даже в условиях сложных механизмов безопасности и проприетарного ПО возможно получить исходные данные и наладить доступ к биометрическим сенсорам. Дополнительным плюсом стала публикация Wireshark-дисектора, адаптированного и улучшенного по сравнению с уже существующими, что значительно облегчает анализ USB-трафика для последующих исследований и разработок.
Несмотря на все успехи, ещё предстоит работа по реализации полноценной поддержки отпечатков в Linux, включая алгоритмы распознавания и интеграцию с системными менеджерами пользователей. Активность сообщества и наличие мощного инструмента анализа позволяют надеяться на скорое расширение совместимости с новыми устройствами. Данный опыт реверс-инжиниринга подтверждает, что внимательный анализ пользовательских драйверов и внедрение нестандартных методов тестирования позволяют обойти закрытые протоколы и обеспечить нужный функционал для пользователей открытых систем. Помимо практических навыков, работа с TLS-PSK и whitebox-криптографией открывает интересные перспективы для понимания современных механизмов защиты в встраиваемых системах. В итоге работа демонстрирует, как можно добиться доступа к аппаратуре, не имея официальной поддержки, используя только доступные инструменты отладки, умение анализировать бинарные файлы и настойчивость.