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

Один из сопровождающих пакеты в NixOS представил технику атаки, позволяющую получить доступ к данным на зашифрованных дисковых разделах, в конфигурациях, не требующих ввода пароля разблокировки при загрузке, благодаря размещению в TPM2 (Trusted Platform Module) информации для расшифровки. Такие конфигурации часто используются на серверах или многопользовательских рабочих станциях, на которых проблематично после каждой перезагрузки вручную вводить пароль.

При применении подобного метода шифрования дисков, расшифровка выполняется с использованием дополнительного ключа, хранимого в TPM и выдаваемого только при подтверждении исходного состояния системы. Состояние системы сохраняется в виде хэшей в регистрах PCR (Platform Configuration Register) и привязывается к цифровой подписи, которой заверен загрузчик, а также к контрольными суммам загрузчика и начального загрузочного окружения (initrd). Доступ к ключу в TPM предоставляется только когда все привязанные к нему регистры PCR находятся в том же состоянии, что и при сохранении ключа.

Подразумевается, что цепочка загрузки операционной системы верифицируется при помощи UEFI Secure Boot и доступ к ключам можно получить только из немодифицированного образа initrd. При успешной проверке диск автоматически расшифровывается, но доступ к расшифрованным данным можно получить только через вход в свою учётную запись в системе. При обращении без верифицированной загрузки или при попытке замены или внесения изменений в initrd с целью перехвата ключей, цепочка доверия будет нарушена, состояние регистров PCR будет нарушено и TPM2 не отдаст сведения, необходимые для расшифровки.

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

Примеры совершения атаки продемонстрированы на Fedora Linux в связке с инструментарием clevis и на NixOS в связке с systemd-cryptenroll. Для совершения атаки необходим физический доступ к компьютеру и возможность извлечения накопителя.

Метод основывается на том, что атакующий может заменить существующий корневой шифрованный раздел на собственный шифрованный раздел, созданный с тем же UUID-идентификатором и известными атакующему ключами расшифровки. Окружение initrd передаст управление init-процессу в разделе атакующего. Так как содержимое initrd не было изменено, состояние TPM не будет нарушено и получив управление в своём окружении атакующий cможет использовать TPM для расшифровки ключа исходного дискового раздела.

Атака сводится к следующим шагам:

  • Извлечение диска и проведение на другом компьютере анализа незашифрованных данных в разделе /boot. Определение информации о зашифрованном разделе и его UUID-идентификаторе из находящегося в разделе /boot initrd-образа.
  • Создание резервной копии первых 64МБ зашифрованного LUKS-раздела.
  • Замена указанных 64МБ на образ с собственным корневым разделом, зашифрованным с использованием известного атакующему ключа и имеющем UUID-идентификатор как у старого раздела.
  • Возвращение диска в исходный компьютер и загрузка с подменённым корневым разделом. Так как автоматическая разблокировка по ключу из TPM для подменённого раздела завершается неудачей, initrd выводит запрос для ручного ввода пароля.
  • Получение исходного ключа, используя метаданные (номер PCR), зашифрованный токен из LUKS-заголовка старого раздела и ключ из TPM.
  • Перестановка диска на компьютер атакующего, восстановление перезаписанной части LUKS-раздела из резервной копии и использование полученного исходного ключа для доступа к данным.

Release. Ссылка here.