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

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

Пароли уже давно должны были уйти в историю, но им не находится подходящей замены. Даже такие технологии, как 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

Первое, что нам понадобится, — матричная ПИН-клавиатура 4x4, предназначенная для управления режимами работы устройства. Это самое простое, что подойдет для решения поставленной задачи. Как было сказано выше, каждому созданному паролю должен быть присвоен уникальный идентификатор, самостоятельно определяемый пользователем. Это может быть как тривиальное «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. Современный программный стек к этому уже подготовлен.

Андрей Захаров

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

Комментарии (15)


  1. vilgeforce
    10.07.2024 12:28

    Перезаписываемые Mifare-карты не так и сложно купить...


  1. kenomimi
    10.07.2024 12:28
    +1

    Погуглил - тут на хабре минимум два проекта подобных были, все так и осталось достоянием недр гитхаба. Еще несколько проектов у буржуев, но тоже все так себе, максимум на 3+...

    Первая проблема, и она же диллема - что делать, если я потерял железку? Если бекапить, то автоматом обеспечить извлекаемость ключа, а значит потерял равно передал злоумышленнику. Если не бекапить - то потеря устройства либо пароля доступа к нему даст потерю доступа ко всему, что оно защищает... Упс. Решения не видел нигде.

    Вторая проблема в юзабилити. Либо вязать догл с телефоном, но это небезопасно и неудобно. Либо мельчить кнопочки на устройстве, что опять неудобно... Про большое устройство я вообще молчу, нафиг-нафиг, еще одну дуру таскать. Тут нужен крутой спец по UI/UX, чтобы ответить на вопрос :)


    1. leon_shtuet
      10.07.2024 12:28

      что делать, если я потерял железку?
      Если бекапить, то автоматом обеспечить извлекаемость ключа, а значит
      потерял равно передал злоумышленнику. Если не бекапить - то потеря
      устройства либо пароля доступа к нему даст потерю доступа ко всему, что
      оно защищает... Упс. Решения не видел нигде.

      Надо железку на основе Trezor Wallet. Криптокошелек с открытой реализацией. Если потеряли, то просто покупаете/сами паяете новый и вводите seed фразу от потерянного. Кстати, Trezor умеет выполнять функцию U2F ключа из коробки. FIDO2, к сожалению, не умеет. Так как все там опенсорсное, есть надежда, что кто-то забабахает поддержку всего вышеописанного в этой статье. Может даже сам автор. Ув. Андрей Захаров, обратите пожалуйста внимание, на мою идею.


    1. JetHabr Автор
      10.07.2024 12:28

      Ключ не хранится в памяти устройства, а восстанавливается каждый раз при прикладывании карты и ввода пин-кода. Так что бэкапить вполне безопасно.

      Что касается юзабилити, то действительно возможно сделать USB-донгл, которому телефон по Bluetooth будет отправлять пароль. Придется поколдовать с профилями, но это реализуемо. Ключ для расшифровки паролей может быть единым и храниться в условном Android Keystore. Будет ли это безопаснее? Это вопрос.


  1. KEugene
    10.07.2024 12:28

    Вот, кстати, про юзабилити.

    Периодически, сильно возниксет желание купить и использовать вместо пароля физический ключ. Забыл, как называется точно, в виде флешки. Программы его поддерживают. Вроде, в чем вопрос? А их у меня два.

    Первый - насколько эти ключи надежные? Какова вероятность, что он, как нонейм флешка навернется? Что тогда делать? Бэкапов у них, насколько я знаю, не предусмотрено. Мне банк выдал такую штуку. Сказал заходить через него. Через пол года "что-то пошло не так, заходите через сайт с логином и паролем". Ок, так даже проще. Но показательно.

    Второй вопрос - что на счет телефона? Если я пропишу в системе вход с ключом, то как быть при входе не с десктопа, а с телефона? Разъем есть, и есть переходник с usb a на usb c. Но что-то мне подсказывает, что ключик не сработает.

    Не подскажите ответы на эти два вопроса?


    1. kenomimi
      10.07.2024 12:28

      Весь поддерживающий софт умеет работать с массивом открытых ключей, потому можно купить сразу хоть десяток донглов, все добавить, и положить в резерв. Потерял/сломал - отзови ключ, и всё.

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

      Использую рутокен для ssh и веба, очень удобно.


      1. KEugene
        10.07.2024 12:28

        Спасибо. Посмотрю насчет nfc. Это, конечно, вариант.


      1. StraNNicK
        10.07.2024 12:28

        рутокен mfa или какой-то другой? для ssh используете как второй фактор (или как-то ещё)?


        1. kenomimi
          10.07.2024 12:28

          Для ssh используется авторизация по ключам. Закрытый сидит в рутокене, открытый устанавливается на сервер. На лайте ключи извлекаемые, на более дорогих моделях - нет.

          Для веба тоже клиентский серт и ключ, стандартная шняга, умеет любой браузер.


          1. StraNNicK
            10.07.2024 12:28

            вот-вот, поэтому и спрашивал.
            У меня MFA, там извлекаемый (и только ecdsa-sk, ed25519-sk не поддерживается).
            подскажите, на какой модели можно неизвлекаемые держать?


            1. kenomimi
              10.07.2024 12:28

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


    1. JetHabr Автор
      10.07.2024 12:28

      Вы, наверное, говорите про USB-токены FIDO U2F, которые горстями продают на AliExpress? Они позволяют входить на веб-сайты с использованием протокола Webauthn. Его много кто сейчас поддерживает. Но с этими токенами существует две проблемы. Если потеряете, то кто угодно сможет воспользоваться сохраненным в памяти ключом, поскольку верификации пользователя в большинстве случаев не предусмотрено. Второй момент — если девайс навернется, то придется покупать новый и генерить новую ключевую пару, а до этого понадобится как-то подтвердить подлинность. Хотя вряд ли вы столкнетесь со второй проблемой.


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


      1. event1
        10.07.2024 12:28

        То есть можно входить на один и тот же ресурс хоть с ноутбука, хоть с телефона.

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


  1. dyadyaSerezha
    10.07.2024 12:28

    И все же, это неудобно и ограничено. Софтовый вариант с ключами на облаке пока самый удобный. Кроме вообще безпарольного, конечно.


  1. event1
    10.07.2024 12:28

    Честно говоря, если уже надо запоминать пин-код, то проще взять какой-нибудь KDF и создавать пароль из него каждый раз. Нужной длины можно добиться обрезанием, а нужного набора символов умелым преобразованием base32/64.

    Идея заполнить пустые пароли мусором не сильно увеличивает безопасность. Пароли состоят из определённого набора символов. Отличить удачный подбор от неудачного — легко.

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