Карты, шлейфы, два чипа, или Аппаратный менеджер паролей для особых случаев

Сгенерировано нейросетью «Шедеврум»

Сгенерировано нейросетью «Шедеврум»

Менеджер паролей — штука удобная, а иногда и незаменимая, ведь количество комбинаций, которые приходится помнить среднестатистическому ИТ-специалисту, не позволяет ему рассчитывать только на собственную память. Подобные менеджеры давно научились генерировать не только пароли требуемой сложности, но и автоматически вводить их в типовые экранные формы. Наиболее продвинутые решения умеют входить в аккаунт в сложных, заранее настроенных сценариях. Вот только в ситуациях, когда парольный менеджер недоступен (например, при локальном входе в систему), пароль приходится вводить «по старинке». Кроме того, существуют специфические риски: при компрометации мастер-пароля (что нередко происходит при взломе пользовательского устройства) все пароли пользователя считаются украденными. Это значительный риск, в особенности для ИТ-администраторов.

Пароли уже давно должны были уйти в историю, но им не находится подходящей замены. Даже такие технологии, как PassKey, все еще не получили широкого распространения, поскольку их внедрение требует доработки существующих приложений. С биометрией все еще сложнее: отрасль значительно зарегулирована, что существенно ограничивает сценарии применения. Поэтому с паролями нам точно придется жить еще какое-то время.

Если пароли администратора не могут храниться в программном менеджере паролей, то, возможно, проблему решит программно-аппаратное устройство, подключаемое к нужному хосту лишь на время использования. Такое устройство обладало бы основными возможностями обычных программных менеджеров паролей, но при этом было бы более устойчивым к атакам. Энтузиасты уже создали множество подобных решений для личного использования, и было бы странно создавать еще одно. Однако у всех них наблюдаются проблемы с безопасностью, от которых я решил попробовать избавиться. Тем более что это техническое творчество помогло мне скоротать несколько холодных вечеров :) Рассказываю, что из этого получилось.

P.S. Однажды автору этих строк понадобилось создать с десяток надежных административных паролей, которые нельзя было хранить даже в менеджере паролей. Нужно ли говорить, с какими неудобствами приходилось сталкиваться при каждом их использовании.

Концепт решения

Сделаем оговорку о принципе работы разрабатываемого устройства. В двух словах: оно эмулирует ввод с клавиатуры. В среде специалистов по информационной безопасности хорошо известна техника BadUSB, суть которой заключается в эмуляции класса USB-устройств пользовательского ввода под общим названием Human Interface Device (HID). К этому классу относятся, в частности, мыши с клавиатурами. Компьютер, к которому подключается такое USB-устройство, обычно слепо доверяет информации, которую оно о себе сообщает (привет, Plug&Play). А чтобы обмануть доверчивого пользователя и заставить его подключить такое устройство, достаточно замаскировать его под узнаваемую форму USB-флешки. Как только он подсоединит такую «флешку», устройство объявит себя клавиатурой, запустит командную оболочку и введет заложенные злоумышленником команды. В общем, не доверяйте незнакомым флешкам :)

Рис. 1. Эмулятор клавиатуры на базе ATmega32U4

Рис. 1. Эмулятор клавиатуры на базе ATmega32U4

Эмуляция физической клавиатуры — только часть дела. Работой программно-аппаратного менеджера паролей нужно как-то управлять, и тут могут быть нюансы. Устройство должно выполнять две основные функции:

  1. генерировать и сохранять во встроенной памяти новые пароли;

  2. вводить их в режиме эмуляции USB-клавиатуры.

Каждому создаваемому паролю должен быть присвоен идентификатор, чтобы пользователь мог указать, какой пароль ему необходим в данный момент. Необходимо также позаботиться о том, чтобы сохраненными паролями не мог воспользоваться злоумышленник, даже получив физический доступ к устройству. Решение здесь может быть только одно: пароли должны храниться в зашифрованном виде, а симметричный ключ шифрования должен восстанавливаться из нескольких компонентов при каждом использовании паролей.

Дизайн

Программно-аппаратный менеджер паролей был реализован на базе Arduino-совместимой платы Pro Micro стоимостью около $3, построенной на микроконтроллере ATmega32U4. Особенностью этого чипа является наличие встроенного USB-интерфейса, работой которого разрешено управлять пользователю. Также плата имеет SPI-интерфейс для сопряжения с необходимыми периферийными устройствами.

Рис. 2. Отладочная плата ProMicro с разъемом Micro USB

Рис. 2. Отладочная плата ProMicro с разъемом Micro USB

Первое, что нам понадобится, — матричная ПИН-клавиатура 4×4, предназначенная для управления режимами работы устройства. Это самое простое, что подойдет для решения поставленной задачи. Как было сказано выше, каждому созданному паролю должен быть присвоен уникальный идентификатор, самостоятельно определяемый пользователем. Это может быть как тривиальное «B2» из «Морского боя», так и более замысловатое »8C49B» из «Звездных войн». Все ограничивается только вашей фантазией.

Рис. 3. Пленочная клавиатура

Рис. 3. Пленочная клавиатура

Если вы выберете сложный идентификатор, то получите дополнительный уровень защиты пароля. Злоумышленник не будет знать действительных идентификаторов, и ему будет сложно их подобрать. Какой бы идентификатор ни был введен (существующий или нет), устройство отправит в USB-порт набор символов, который может быть как настоящим паролем, так и псевдослучайной последовательностью.

Дополнительные кнопки * и # клавиатуры можно использовать для выбора режима работы устройства. Например, нажатие # в режиме ожидания будет означать старт процедуры создания нового пароля. Для еще большего удобства можно было бы подключить к Pro Micro двухстрочный LCD-экран, отображающий текущее состояние устройства, но реализация получилась бы более сложной, поскольку плата имеет ограниченное число распаянных выводов.

Второе подключаемое к Pro Micro устройство — бесконтактный считыватель MIFARE-совместимых карт, основанный на чипе PN532. Прикладывание карты к устройству необходимо для идентификации пользователя, который хочет воспользоваться сохраненными паролями. Подход максимально близок к традиционной СКУД, где для получения доступа необходимо предъявить ключ-карту. Для того чтобы пользователь не забывал карту и не оставлял ее где попало, лучше всего, если она будет иметь для него ценность (например, как банковская). Особенностью PN532 является поддержка различных протоколов передачи данных, работающих поверх стандарта ISO 14443. Это позволит применять практически любую карту с NFC- или RFID-меткой. Важно, что все эти карты имеют уникальный идентификатор — UID, который «прошивается» на производстве. Хотя UID не является секретным (его можно легко прочитать из памяти карты и даже записать в другую), для идентификации пользователя этого достаточно, ведь это не единственный уровень защиты. Для доступа к паролю злоумышленник должен не только завладеть банковской картой пользователя, но и ввести валидный идентификатор пароля, что не так-то просто.

Рис. 4. Подключение периферии

Рис. 4. Подключение периферии

Несмотря на компактность подключенных к Pro Micro периферийных устройств, их можно дополнительно уплотнить, уложив в портативный корпус, напечатанный на 3D-принтере. Общая стоимость «обвеса» к Pro Micro обошлась в $5.

Нюансы реализации

Итак, смарт-карта выступает в роли мастер-ключа, требуемого для любой операции с паролями. Хотя можно использовать любую ISO14443-совместимую карту, будет удобнее выбрать для этих целей именно банковскую, ведь она есть у каждого. А вот использовать смартфоны, поддерживающие технологию Host-based Card Emulation (HCE), увы, не получится. UID-метка будет генерироваться разной при каждом считывании, намекая на то, что производители смартфонов считают эту технологию небезопасной.

Всякий раз, когда бесконтактная карта прикладывается к NFC-считывателю, Pro Micro сканирует ее UID и присоединяет к нему идентификатор пароля, введенный пользователем с ПИН-клавиатуры. Итоговый хеш от полученного значения преобразуется в криптографический ключ, который используется для шифрования или дешифрования конкретного пароля. Такой подход означает, что каждый сохраненный пароль шифруется собственным ключом. Это затруднит восстановление паролей даже в ситуации копирования злоумышленником содержимого энергонезависимой памяти Pro Micro.

Даже в том случае, когда злоумышленник завладеет картой пользователя и введет произвольный идентификатор, он не будет знать, корректный ли пароль он восстановил. Какую бы карту он ни приложил, какой бы идентификатор пароля ни ввел, устройство отправит в USB-порт последовательность символов, которая может являться чем угодно. Security through obscurity.

Переходя к нюансам программной реализации, нельзя не затронуть еще несколько аспектов безопасности. Генерация случайных чисел, необходимая для формирования сложных символьных последовательностей, требует надежного источника энтропии. В силу своей дешевизны чип ATmega32U4 не имеет генератора случайных чисел, поэтому рассчитывать на предлагаемые механизмы формирования псевдослучайных чисел не приходится. Например, производитель предлагает использовать разведенные на плате аналоговые выводы чипа в качестве источника энтропии: считываемые значения атмосферных шумов в теории должны быть случайными. Исследования показали, что они в высокой степени предсказуемы.

Как это часто бывает, сообщество разработчиков нашло другое решение: ATmega32U4, как и большинство микроконтроллеров данного класса, имеет Watchdog Timer (WDT). WDT — это аппаратный счетчик, который должен периодически сбрасываться контролируемой системой. Если сброс не произошел, значит, система зависла сама и ей необходим hard reset. По результатам нескольких исследований оказалось, что считываемые значения таймеров с определенными ухищрениями можно считать в высокой степени случайными. Размер пула энтропии, формируемого за счет данных от счетчиков, невелик. Однако и генерация случайных чисел — редкая для менеджера паролей операция.

Использованная в проекте библиотека Entropy позволила применить описанный выше нестандартный метод наполнения пула энтропии, необходимый для генерации случайных чисел.

Поскольку различные системы и приложения понимают пароли разной степени сложности, была введена их классификация: от уровня legacy (без поддержки спецсимволов) до сложных (без ограничений по длине и использованию спецсимволов). Выбор категории сложности пароля был назначен на клавиши от «A» до «D» матричной клавиатуры.

Для защиты памяти Pro Micro в случае несанкционированного копирования была обеспечена рандомизация ее содержимого, при которой в каждую ячейку памяти, выделенной для хранения паролей, была записана случайная последовательность байтов. При расшифровке неверным ключом это бы каждый раз давало на выходе случайную парольную фразу.

Все криптографические методы, включая симметричное шифрование и хеширование, были реализованы с помощью сторонней библиотеки Spritz. Она же помогала генерировать сложные пароли, дополнять пул энтропии и очищать память.

И в качестве вывода

Нужно констатировать, что, помимо очевидных проблем с практичностью (идентификаторы паролей все еще приходится запоминать) и отказоустойчивостью (желательно иметь резервную копию сохраненных паролей), программно-аппаратные менеджеры паролей не устраняют некоторых проблем безопасности. Например, если хост, к которому будет подключено такое устройство, окажется скомпрометирован, злоумышленник сможет перехватывать вводимые пароли при помощи кейлоггера.

Используемая для идентификации пользователя ключ-карта должна гарантировать невозможность ее несанкционированного использования, в том числе копирования. Для этого необходимо перейти от считывания UID-меток к работе по стандарту EMV, что позволит выполнять офлайн-аутентификацию карты так, как это происходит с платежными картами при оплате покупок. Приятным бонусом этого шага стала бы возможность использования смартфона вместо физической карты.

Вместе с тем попытка поддержания в жизнеспособном состоянии самой технологии парольной аутентификации схожа с откачиванием воды с тонущего корабля. Итог неизбежен, поэтому лучшее направление приложения усилий лежит в области распространения беспарольных методов аутентификации, таких как FIDO2. Современный программный стек к этому уже подготовлен.

d1e86e0baa982b2abd319c71994260e0.JPGАндрей Захаров

Руководитель группы информационной безопасности в Уральском филиале «Инфосистемы Джет»

© Habrahabr.ru