GNUK на BluePill 4

Заключительная часть про известные уязвимости и методы их противодействия..

   /|      .----.      |\
 /  |  __ |      | __  |  \
|   .Y`  `\|    |/`  `Y.   |
|  |        `--`        |  |
 \|        ,----,        |/
  |      /        \      |
  |     |          |     |
   |   / )  GNUK  ( \   |
    \/ /|          |\ \/
    | |  \        /  | |
   |  |\   ~----~   /|  |
   |  | ~-.______.-~ |  |
    |  \ ___    ____/  |
     \      ~~~~      /
       ~ - .____. - ~

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

Gnuk - реализация криптографического токена USB для GnuPG

Программное обеспечение, каким он не был, всё ещё является продуктом человека и подвержен ошибкам (случайным и не очень). В качестве меры предосторожности стоит проверить цифровую подпись использованного релиза Gnuk перед загрузкой на микроконтроллер:

$ git clone https://salsa.debian.org/gnuk-team/gnuk/gnuk.git \
  --recurse-submodules --branch "release/2.2" &>/dev/null
$ cd gnuk
$ git verify-tag release/2.2
gpg: Signature made Sat 20 Apr 2024 05:22:21 AM MSK
gpg:                using EDDSA key B7321C557870D98D81D76101640114AF89DE6054
gpg: Good signature from "NIIBE Yutaka <gniibe@fsij.org>" [unknown]
gpg:                 aka "NIIBE Yutaka <gniibe@debian.org>" [unknown]
gpg: WARNING: This key is not certified with a trusted signature!
gpg:          There is no indication that the signature belongs to the owner.
Primary key fingerprint: 249C B377 1750 745D 5CDD  323C E267 B052 364F 028D
     Subkey fingerprint: B732 1C55 7870 D98D 81D7  6101 6401 14AF 89DE 6054

Таким же способом можно проверить все изменения сделанные в Gnuk:

$ git log --show-signature release/2.2
commit de9652726b1ce52b21e939c6989dda0268b5c640 (HEAD, tag: release/2.2)
gpg: Signature made Sat 20 Apr 2024 05:20:45 AM MSK
gpg:                using EDDSA key B7321C557870D98D81D76101640114AF89DE6054
gpg: Good signature from "NIIBE Yutaka <gniibe@fsij.org>" [unknown]
gpg:                 aka "NIIBE Yutaka <gniibe@debian.org>" [unknown]
gpg: WARNING: This key is not certified with a trusted signature!
gpg:          There is no indication that the signature belongs to the owner.
Primary key fingerprint: 249C B377 1750 745D 5CDD  323C E267 B052 364F 028D
     Subkey fingerprint: B732 1C55 7870 D98D 81D7  6101 6401 14AF 89DE 6054
Author: NIIBE Yutaka <gniibe@fsij.org>
Date:   Sat Apr 20 11:20:40 2024 +0900

    Version 2.2.
    
    Signed-off-by: NIIBE Yutaka <gniibe@fsij.org>
...

К сожалению я не знаком лично с 新部(Ниибэ) 裕(Ютака) или с тем, кто знаком с ним чтобы подтвердить ключ, отсюда и предупреждения.

STM32F1 - микроконтроллер на ARM Cortex-M3

Микроконтроллер - это "Ахиллесова пята" любого токена. Существуют несколько видов атак по сторонним каналам, позволяющие обойти механизм RDP. Gnuk с версии 1.2.17 стало обязательным применение KDF-DO в качестве защиты материала ключа, поэтому ключа из памяти контроллера не означает конец света. Однако подбор DEK или KEK остаётся лишь вопросом времени, это же также подтверждается самим автором проекта в переписке gnuk-users.

Единственным способ противодействия угрозе будет обеспечения защиты от несанкционированного вскрытия (tamper-evident) корпуса и превращение его в предмет постоянного ношения. Лично я использую токен в прозрачном корпусе и ношу его всегда с собой в качестве брелка для ключей.

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

$ gpg --output 3AAFE5661C44977F.asc --gen-revoke 3AAFE5661C44977F

sec  ed25519/3AAFE5661C44977F 2026-10-15 Aleksei Savin 

Create a revocation certificate for this key? (y/N) y
Please select the reason for the revocation:
  0 = No reason specified
  1 = Key has been compromised
  2 = Key is superseded
  3 = Key is no longer used
  Q = Cancel
(Probably you want to select 1 here)
Your decision? 1
Enter an optional description; end it with an empty line:
> Token was lost, key has been compromised. Do not use it.
> 
Reason for revocation: Key has been compromised
Token was lost, key has been compromised. Do not use it.
Is this okay? (y/N) y
ASCII armored output forced.
Revocation certificate created.

Please move it to a medium which you can hide away; if Mallory gets
access to this certificate he can use it to make your key unusable.
It is smart to print this certificate and store it away, just in case
your media become unreadable.  But have some caution:  The print system of
your machine might store the data and make it available to others!

Внимание: Если вы уже создавали Paperkey приватного ключа ранее, вы можете восстановить приватный ключ на любой доверенной машине и снова создать сертификат отзыва.

После того как сертификат создан, импортируем его наш Keyring и загружаем на сервер ключей:

$ gpg --import 3AAFE5661C44977F.rev
$ gpg --keyserver keys.openpgp.org --send-keys 3AAFE5661C44977F
$ gpg --keyserver pgp.mit.edu --send-keys 3AAFE5661C44977F
$ gpg --keyserver keyserver.ubuntu.com --send-keys 3AAFE5661C44977F
$ gpg --keyserver pgp.surf.nl --send-keys 3AAFE5661C44977F

USB - последовательный интерфейс

USB-токены используют распространённый стандарт, используемый на сегодняшний день практически на всех устройствах, но так было не всегда. Первые же OpenPGP смарт-карты использовали ISO/IEC 7816 совместимый картридер, которые нужно было носить с собой помимо самой смарт-карты.

Тем не менее USB поощряют пользователя оставлять свои устройства в компьютере. UIF защищает от использования токена без участия пользователя. Экспериментальная функция уже работает на Gnuk и требует подключенного датчика Холла DRV5032FA к пину A3.

Включаем UIF:

$ gpg --edit-card
...
UIF setting ......: Sign=off Decrypt=off Auth=off
...
gpg/card> admin
Admin commands are allowed
gpg/card> uif
usage: uif N [on|off|permanent]
       1 <= N <= 3
gpg/card> uif 1 on

gpg/card> uif 2 on
gpg/card> uif 3 on
gpg/card> list
...
UIF setting ......: Sign=on Decrypt=on Auth=on
...
gpg/card> quit

После этого все команды с будут обрабатываться только после намагничивания/нажатия пользователем на токен.

Заключение

Я поддерживаю аппаратную криптографию и считаю её использование положительной практикой. Сам я пользуюсь токеном на ежедневной основе порядка уже более 3 месяцев и могу дать относительно объективную критику.

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

Архитектура ARM32 микроконтроллеров сильно проще x86, поэтому в такие рода устройства невозможно что-то внедрить, что исключает возможность атак типа Evil Maid. Существуют даже отладочные платы размером с USB-Flash накопитель (например ST-LINK V2 Debugger).

Одновременно с этим, само наличие токена или смарт-карты добавляют MFA, поэтому доступа к системе с зашифрованными данными станет недостаточно для получения секрета.

Gnuk является свободным программным обеспечением и распространяется под лицензией GPLv3. Это значит, что любой желающий может изучать, распространять и модифицировать код прошивки и это идёт в руку с принципом Керкгоффса.

Помимо этого, существует и другие открытые проекты (например: Pico Keys), также в будущем должна выйти новая версия Gnuk с кодовым названием Mirae. Быть может я сделаю ещё статью по данной теме, но пока засим откланиваюсь.