KeeChallenge для YubiKey и почему его стоит избегать
KeeChallenge — это плагин, добавляющий поддержку YubiKey в KeePass 2. Однако у него есть ряд проблем. В этой статье мы обсудим эти проблемы и альтернативные решения.
Как работает KeeChallenge
KeeChallenge шифрует базу паролей секретным ключом HMAC (S). Этот ключ хранится в YubiKey и используется для генерации ответов. Кроме того, KeeChallenge шифрует S заранее вычисленной парой «запрос–ответ» (challenge-response) и сохраняет зашифрованный секрет и запрос во вспомогательном XML-файле.
Когда вы открываете базу паролей:
- KeeChallenge загружает запрос C из XML-файла и отправляет его в YubiKey
- YubiKey преобразует запрос (используя хранящийся в ключе секрет S) и возвращает ответ R
- Ответ R используется для расшифровки секрета Senc, хранящегося в XML-файле.
- Расшифрованный секрет S используется для расшифровки базы паролей. Важно: это тот же самый секрет, что хранится в YubiKey.
- KeeChallenge заново создаёт XML-файл (генерирует новый случайный запрос C, вычисляет новый ответ R', шифрует S с помощью R' и сохраняет обновлённые C и Senc в XML-файл)
Подробнее см. полную схему процесса.
Проблемы KeeChallenge
У подхода KeeChallenge есть несколько проблем с безопасностью:
- Секретный ключ никогда не меняется, он лишь перешифровывается. С точки зрения KeePass, KeeChallenge ничем не отличается от статического ключевого файла, который каждый раз выдаёт одни и те же байты.
- Как следствие, KeeChallenge полностью открыт для атаки повторного воспроизведения (replay attack). Любой из предыдущих XML-файлов можно использовать для расшифровки базы паролей. То есть в рандомизации запроса и перешифровке секрета нет никакого смысла — это имитация безопасности.
- Секрет никогда не должен покидать YubiKey — в этом весь смысл аппаратного ключа с доступом только на запись. KeeChallenge нарушает этот принцип, перенося секрет на компьютер. Теоретически злоумышленник может скопировать S из памяти процесса, незаметно для владельца клонировать его YubiKey и расшифровать любую будущую версию базы паролей (поскольку секрет статичен).
Кроме того, есть несколько сопутствующих проблем:
- Разработчик из Yubico поднял вопрос о безопасности ещё в 2016 году. По состоянию на 2024 год вопрос всё ещё открыт.
- KeeChallenge выглядит заброшенным: значимых обновлений не было с 2016 года.
- Мейнтейнер проекта не отвечает на сообщения о проблемах.
Лучшая альтернатива
Альтернативный подход был представлен в KeePassXC и поддерживается всеми совместимыми приложениями:
В KeePassXC нам не требуется никакого знания секрета HMAC. Мы используем master seed базы паролей (случайную последовательность байтов, являющуюся частью базы) в качестве запроса, а затем используем ответ для её шифрования. Таким образом, нам не нужен дополнительный файл, и вдобавок мы получаем преимущество: требуемый ответ меняется при каждом сохранении базы, что гораздо больше похоже на настоящую двухфакторную аутентификацию.
Этот подход имеет несколько важных преимуществ по сравнению с KeeChallenge:
- Ключ, получаемый от YubiKey, динамический: он меняется при каждом сохранении базы паролей. (В KeeChallenge ключ шифрования остаётся неизменным, по сути имитируя статический ключевой файл.)
- Секрет HMAC никогда не покидает аппаратный ключ, поэтому YubiKey невозможно скрытно клонировать.
- Нет вспомогательного XML-файла — только сама база паролей.
- Этот подход поддерживают несколько активных команд разработчиков.
По описанным выше причинам KeePassium реализует подход KeePassXC. Поддержка баз паролей, зашифрованных с помощью KeeChallenge, не планируется.
Если у вас есть база паролей, защищённая KeeChallenge, — подумайте о переходе на KeePassXC и KeePassium. Эта комбинация даст вам более безопасное, совместимое и поддерживаемое решение.