Привет, на связи Денис Генералов, младший системный администратор Cloud4Y. Сегодня хочу поделиться статьёй, которая актуальна в связи с выходом Windows 11 и обязательным требованием вендора о наличии TPM для защиты данных владельцев устройств. Выражаю своё почтение автору статьи: Генри Нурми.
Вступление
Полное шифрование диска — один из краеугольных камней защиты конечных точек. Этот метод эффективен не только для защиты конфиденциальных данных от физической кражи. Он обеспечивает целостность данных, предотвращает атаки, нацеленные на подделку данных. Если было бы возможно скомпрометировать данный метод защиты без серьёзных усилий, это разрушило бы фундаментальную идею защиты конечных узлов.
Со временем были придуманы различные физические атаки на полностью шифрованные диски, такие как атаки холодной загрузки, а также атаки, основанные на сниффинге интерфейса TPM или DMA. Большинство компаний в своей модели угроз не учитывают этот тип атак. Да и какой смысл учитывать, если злоумышленник имеет к устройству неограниченный доступ?
Кроме того, у злоумышленников тоже есть бюджет, который они готовы потратить на проведение атаки. И если она потребует очень большого количества ресурсов, это будет попросту нерентабельно.
В данной статье мы исследуем атаку на основе сниффинга через SPI шину TPM с использованием финансово доступных инструментов. А также воспользуемся инструментом, который извлекает ключ BitLocker из перехваченного SPI трафика.
Предшествующие работы
Доверенный платформенный модуль (TPM) часто используют для защиты ключа шифрования диска. Сам чип TPM защищен от множества видов атак, однако вот незадача, чаще всего данные, передаваемые между CPU и TPM по шине, не шифруются, что делает максимально доступной и простой атаку, реализуемую через сниффинг данных, передаваемых по шине.
Атаки, реализуемые через захват данных, передаваемых к TPM, нельзя назвать новым типом атаки. К примеру, Д. Андзакович демонстрировал атаку, базировавшуюся на сниффинге шины LPC и последующем извлечении ключа BitLocker, а Дж. Бун — атаку, базировавшуюся на использовании промежуточного устройства внутри шины I2C. Однако про исследования на тему перехвата сообщений TPM от шины SPI слышно не было.
Обзор BitLocker
BitLocker — это функция полного шифрования диска Microsoft для Windows, которая была представлена в Windows Vista. Начиная с Windows 10 версии 1511, BitLocker использует алгоритм шифрования AES-XTS для шифрования всего тома. По умолчанию длина ключа составляет 128 бит, но также можно настроить использование 256-битного ключа.
Архитектура BitLocker включает несколько ключей. Ключ шифрования полного тома (FVEK) используется для шифрования тома, защищённого BitLocker. Этот ключ зашифрован главным ключом тома (VMK), а зашифрованный FVEK сохраняется в метаданных тома. Наконец, VMK зашифровывается различными механизмами защиты, а зашифрованный VMK сохраняется в метаданных (аналогично FVEK). По умолчанию для расшифровки VMK требуется воспользоваться только одним из ключей защитного механизма.
Архитектура позволяет легко изменять ключ криптографической системы, если какое-либо из защитных устройств будет скомпрометировано, поскольку для этого необходимо лишь создать новый VMK и повторно зашифровать FVEK с новым VMK. Данный механизм решает проблему повторного шифрования всего тома.
Обзор модуля доверенной платформы
Trusted Platform Module — это криптографический сопроцессор, который реализует определенный набор криптографических операций, безопасное хранилище для ключей и набор регистров конфигурации платформы (PCR). TPM — одно из наиболее используемых средств криптографической защиты BitLocker.
Одним из ключевых преимуществ TPM является возможность раскрыть часть ключа после проверки целостности платформы. Эта проверка достигается путём измерения каждого шага в процессе загрузки и сохранения результатов в PCR. Ключ может быть привязан к определённым значениям PCR, и он может быть выпущен только в том случае, если текущее состояние PCR совпадает с этими исходными значениями. BitLocker использует TPM для запечатывания VMK, и ключ может быть отдан только в том случае, если процесс загрузки не был изменён.
Обычно микросхема TPM представляет собой дискретный модуль на материнской плате, а ЦП обменивается данными с микросхемой TPM через концентратор контроллера платформы (PCH) или южный мост. Спецификация TPM описывает три различных интерфейса связи: LPC, SPI и I2C. Кроме того, для TPM разрешены два разных типа упаковок IC: TSSOP-28 (слева) и QFN-32. Упаковка QFN-32 усложняет атаку сниффинга, так как сложнее подключиться к его контактам.
Сниффим шину SPI
Последовательный периферийный интерфейс (SPI) — это протокол синхронной последовательной связи, поддерживающий полнодуплексную связь с высокой тактовой частотой. Он использует архитектуру «ведущий-ведомый», при которой ведущее устройство всегда инициирует обмен данными. Шина SPI состоит из четырёх проводников:
SCLK: Serial Clock
MOSI: Master out Slave in (данные от мастера)
MISO: Master in Slave out (данные от ведомого)
SS: Slave select (выбирает активное ведомое устройство)
К одной шине SPI можно подключить несколько подчиненных устройств. Однако в этой ситуации каждому ведомому устройству требуется собственная линия SS, как показано ниже.
Чтобы «прослушать» шину, требуется логический анализатор, который может захватывать четыре сигнала одновременно. Минимальная частота дискретизации зависит от скорости, используемой в шине. Стандарт TPM определяет, что микросхема TPM с интерфейсом SPI должна поддерживать диапазон тактовой частоты 10–24 МГц. Однако в стандарте также указано, что могут поддерживаться более высокие тактовые частоты. Имейте в виду, что мы должны использовать не менее чем в четыре раза более высокую частоту дискретизации, нежели используемая тактовая частота на шине.
Как описано выше, микросхема TPM имеет форм-фактор TSSOP-28 или QFN-32, имеет маленький корпус. Микросхему в корпусе TSSOP можно послушать, взяв сигнал с её ножек. Однако корпус QFN требует пайки к IC, поскольку данный корпус паяется на шарики. Кроме того, материнские платы обычно содержат контрольные точки или порты отладки, подключенные к шине данных TPM, которые также можно использовать для того, чтобы послушать сигнал.
Было бы неплохо, если бы сниффинг-атака могла быть выполнена быстро и без специальных инструментов.
Ноутбук обычно необходимо разобрать, чтобы получить доступ к микросхеме TPM, что не очень практично. Однако прошивка UEFI часто хранится во флэш-чипе на основе SPI, который обычно выполнен в корпусе SOIC-8. К нему очень легко подцепляются обычные зонды. Поскольку к одной шине SPI можно подключить несколько устройств, микросхема флэш-памяти и микросхема TPM, вероятно, используют одну и ту же шину. Кроме того, к микросхеме флэш-памяти обычно можно получить доступ, сняв заднюю крышку или клавиатуру, и поэтому данная микросхема является идеальной целью для прослушивания трафика на шине SPI. Эта тактика исключает необходимость пайки, и атака может быть выполнена вполне себе быстро.
Возьмём ноутбук Dell Latitude E5470, которому несколько лет, на котором установлена Windows 10 с поддержкой BitLocker, а TPM защищает VMK без дополнительного PIN-кода. В этой конкретной модели доступ к TPM и flash можно получить, сняв заднюю крышку, как показано ниже.
Микросхема Nuvoton NPCT650JAOYX TPM 2.0 поставляется с пакетом QFN-32, и, как мы видим, проверить микросхему напрямую невозможно. Мы можем проверить с помощью мультиметра, что контакты синхронизации на обеих микросхемах соединены вместе, подтвердив то, что они используют одну и ту же шину SPI. Как мы видим, корпус SOIC-8 выглядит огромным по сравнению с QFN-32. Микросхема флэш-памяти имеет следующую распиновку, которая определяет размещение датчиков.
* ----------- +
- | СС | -
- | MISO | -
- | SCLK | -
- | GND MOSI | -
+ ----------- +
Как вы помните, каждое SPI-устройство имеет свою выделенную SS-линию, однако в нашем случае ноутбук имеет только два устройства, подключенных к данной шине. Из этого следует, что, SS-линия TPM может быть построена путём взятия отрицания из SS-линии микросхемы флэш-памяти. SS-линию можем просто проигнорировать. Однако в этой ситуации существует возможность декодирования обмена данных между flash-памятью и TPM.
Снимем сигналы SPI с помощью логического анализатора Saleae Logic Pro 8, который способен записывать четыре сигнала с частотой до 100 МГц. Широкий шаг клемм корпуса SOIC-8 позволяет без труда закрепить щупы, а весь процесс захвата займёт не более одной минуты.
Приложение Logic 2 поддерживает декодирование SPI «из коробки». Единственное, что нужно помнить: линия SS инвертирована. К счастью, параметры декодирования Saleae позволяют нам выбирать, будет линия SS инвертирована, либо нет. На снимке экрана ниже показаны декодированные байтовые потоки MOSI и MISO во время тестового сниффинга.
Ищем иголку в стоге сена
Чтобы продолжать копаться, мы должны понимать, что ищем. На данный момент у нас есть два декодированных байтовых потока, которые представляют только необработанные данные на шине. Байты в потоке MOSI — это трафик от ЦП к TPM, в трафик MISO — наоборот.
В разделе 7.4 «Спецификация профиля TPM клиентской платформы ПК» описывается протокол SPI для микросхемы TPM 2.0. Ключевыми элементами являются транзакции чтения и записи, которые выглядят почти одинаково. Транзакция начинается, когда хост отправляет командный байт, за которым следует трехбайтовый адрес. После этого 1–64 байта данных транзакции отправляются либо ЦП, либо TPM, в зависимости от типа транзакции. Однако TPM может приостановить передачу через операцию состояния ожидания между байтами адреса и данных. Микросхема TPM вставляет состояние ожидания, переводя линию MISO в низкий уровень на последнем бите адреса, и линия переводится в ожидание, пока микросхема TPM не будет готова к приёму или передаче данных. Транзакция чтения показана ниже.
Командный байт кодирует тип транзакции и размер передаваемых данных. Когда старший бит в командном байте равен 1, считывается тип транзакции. В противном случае тип записи. Шесть младших значащих битов декодируют размер передачи от 1 до 64 байтов. Ниже показана вся структура протокола.
Учитывая эту информацию, мы можем подтвердить фиксацию транзакций на TPM. Ниже показана однобайтовая транзакция чтения по адресу 0xD40018, где TPM в результате отправил обратно 0x90.
Logic 2 не может анализировать транзакции SPI TPM по умолчанию. Однако он поддерживает настраиваемые высокоуровневые анализаторы, которые могут дополнительно анализировать декодированный трафик SPI. Я написал анализатор, который декодирует транзакции TPM из потока SPI и показывает их в Logic 2.
Учитывая, что TPM работает в разных регистрах, нас интересуют только регистры TPM_DATA_FIFO_x
. Эти регистры FIFO действуют как буферы между хостом и TPM при обмене данными для хранения команд или ответов. Исходя из этого сброса содержимого регистров FIFO достаточно, чтобы перехватить незапечатанный ключ. Кроме того, BitLocker использует только Locality 0, который ограничивает отслеживаемые регистры TPM_DATA_FIFO_0
, и этот конкретный регистр декодируется по адресу 0xD40024
. Анализируемая транзакция чтения из этого регистра показана ниже.
Остаётся проблема идентификации VMK внутри байтового потока. К счастью, описание BitLocker общедоступно. Запись метаданных VMK имеет формат, аналогичный записи метаданных FVE. Запись VMK состоит из следующих полей:
Эта информация позволяет нам создать шаблон для поиска, соответствующий возможным VMK в потоке байтов. Мы знаем приведённые ниже подробности из документации, о которой говорили ранее:
размер записи: 0x002c - 0x0c (метаданные) + 0x20 (ключ)
тип записи: 0x0000 - Нет, запись является свойством
тип значения: 0x0001 - Ключ
Мы не можем быть до конца уверены в версии и методе шифрования. Следовательно, мы можем использовать указанный выше шаблон для поиска начала записи VMK. Обратите внимание, что в полях заголовка используется прямой порядок байтов.
2c00000001000 [0–1] 000 [0–5] 200000
На скриншоте мы определённо видим указанную выше структуру в потоке TPM_DATA_FIFO_0
. Следующие 32 байта, начинающиеся с 0x17
, представляют собой фактическую VMK.
После извлечения VMK диск можно расшифровать и смонтировать. Последняя версия (0.7.3) Dislocker поддерживает дешифрование тома с помощью VMK. Следовательно, нам не нужно вручную разбирать и расшифровывать ключ FVEK. На скриншоте показана процедура монтирования диска.
Автоматизированный подход
Несмотря на то, что Proof of Concepts великолепны, правильно подобранные инструменты выводят атаку на совершенно новый уровень. А ещё, как мы говорили в начале статьи, дают реальное преимущество, если это можно сделать приложив минимум усилий. По этой причине процесс атаки был максимально автоматизирован. Набор инструментов состоит из следующих частей:
Пользовательский высокочастотный анализатор для поиска записей VMK из транзакций TPM.
Контейнер Docker, который включает в себя все необходимые инструменты для монтирования диска с подстановкой VMK.
Рабочий процесс с инструментарием выглядит следующим образом:
Поснифьте шину SPI и извлеките VMK.
Извлеките диск и подключите его к машине используемой для взлома или загрузите целевое устройство прямо с USB-накопителя, если это возможно.
Расшифруйте и смонтируйте диск.
Ниже показано, как анализатор может извлекать VMK из полученных данных. Затем ключ может передаётся в инструмент монтирования, который расшифровывает содержимое и перенаправляет вас в shell, где вы можете изменить содержимое тома.
Вы можете найти этот инструмент на GitHub.
Надежда всё же есть
Вместо того, чтоб использовать только TPM, для усложнения проведения атаки следует использовать дополнительные опции, такие как:
TPM с PIN-кодом
TPM с ключом запуска
TPM с ключом запуска и PIN-кодом
В режиме TPM с PIN-кодом TPM требует дополнительного PIN-кода, прежде чем VMK будет распечатан. Следует отметить, что ключ можно перехватить даже при использовании PIN-кода. Однако злоумышленник должен иметь возможность прослушивать шину в тот же момент, когда вводится PIN-код.
Если непривилегированные пользователи получат доступ к любым используемым ключам или средствам защиты BitLocker, они смогут выполнить локальное повышение привилегий (LPE), изменив содержимое тома. Эта атака позволяет инсайдерам легко использовать LPE. Стоит отметить, что тот же LPE применяется, если пользователи знали свои ключи восстановления.
Ключ запуска добавляет дополнительный уровень, на котором VMK может быть расшифрован, только если представлены и TPM, и ключ запуска. Ключ запуска может храниться на съёмном устройстве, например, на USB-накопителе.
TPM 2.0 поддерживает так называемое шифрование параметров, при котором зашифровывается первый параметр в команде или ответе TPM. Однако BitLocker на данный момент не поддерживает эту функцию, и Дж. Бун в своём исследовании показал, что у неё есть свои недостатки.
Выводы
Мы продемонстрировали, что ключ BitLocker может быть легко извлечён из трафика SPI без дорогостоящих инструментов. Атака требует физического доступа к целевой машине только в течение нескольких минут, если использовать автоматизированные инструменты.
Что ещё интересного есть в блоге Cloud4Y
→ Изучаем своё железо: сброс паролей BIOS на ноутбуках
→ Как я случайно заблокировал 10 000 телефонов в Южной Америке
→ Клавиатуры, которые постигла неудача
→ Самый большой космический телескоп Уэбб должен изменить наши представления о космосе
Подписывайтесь на наш Telegram-канал, чтобы не пропустить очередную статью. Пишем не чаще двух раз в неделю и только по делу.