Тестирование модели безопасности кошельков семейства Trezor Safe

Почему Secure Element имеют решающее значение для безопасности аппаратного кошелька

Оригинал статьи на английском

Резюме

В отличие от предыдущих поколений устройств Trezor, которые, как показало исследование Ledger Donjon, были уязвимы к физическим атакам с восстановлением seed, линейка Trezor Safe предлагает значительные улучшения в плане безопасности, в первую очередь за счет использования Secure Element для защиты seed пользователя. Однако критические криптографические операции по-прежнему выполняются на обычном микроконтроллере, что делает возможными атаки в более продвинутых моделях угроз.

Введение

С момента своего основания Ledger Donjon постоянно уделяет часть своего времени и ресурсов проведению открытых исследований в области безопасности проектов и устройств, имеющих отношение к пользователям и заинтересованным сторонам криптовалютной экосистемы. Целью этих исследований является не только устранение или смягчение уязвимостей до того, как они могут быть использованы субъектами угроз, но и выявление взаимосвязи между архитектурой криптовалютного устройства и атаками, от которых оно может разумно защититься.

За прошедшие годы команда проанализировала безопасность популярных аппаратных кошельков, включая устройства Trezor One и Trezor T. Было обнаружено несколько критических уязвимостей, о которых компания ответственно сообщила Trezor, а затем приложила все усилия для устранения или смягчения проблем, которые можно было устранить с помощью обновления программного обеспечения. Это привело к конкретным и значительным улучшениям в безопасности всех пользователей Trezor, а значит, и криптовалютной экосистемы в целом.

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

Действительно, и Trezor One, и Trezor T полагаются на обычный микроконтроллер для защиты пользовательских данных. К сожалению, такие микроконтроллеры не рассчитаны на аппаратные атаки, и, в частности, было обнаружено, что атаки с использованием сбоев напряжения позволяют извлечь их содержимое, используя лишь очень дешевое оборудование.

Другими словами, мы показали, что полагаться только на такие микроконтроллеры для защиты секретов пользователя не является надежным вариантом, если кража устройства представляет собой актуальную угрозу для пользователя — а это, несомненно, очень вероятный сценарий для большинства пользователей аппаратных кошельков. В отличие от этого, лучший способ надежно защититься от атак с применением сбоев (среди которых сбои напряжения — лишь один из самых дешевых и простых вариантов) — это использовать чипы, специально разработанные и прошедшие тщательное тестирование, чтобы противостоять физическим атакам: Secure Element.

Устройства Trezor Safe

В конце 2023 года компания Trezor выпустила первый продукт из новой линейки аппаратных кошельков — Trezor Safe 3, а вскоре за ним последовал Trezor Safe 5, выпущенный в середине 2024 года. Оба кошелька имеют одинаковую общую архитектуру, которая разительно отличается от архитектуры устройств Trezor прошлых лет. В частности, устройства Trezor Safe теперь построены на базе двух чипов, один из которых представляет собой полноценный безопасный чип, сертифицированный по стандарту EAL6+, в паре с обычным микроконтроллером.

Это огромный плюс для безопасности. В этой архитектуре PIN-код пользователя и его криптографические секреты защищает Secure Element, основная функция которого — выступать в качестве безопасного элемента хранения: когда вводится правильный PIN-код, он предоставляет доступ к секретам пользователя.

Проверка PIN-кода и счетчик повторных попыток ввода PIN-кода выполняются непосредственно безопасным чипом, а секреты пользователя недоступны в памяти подключенного микроконтроллера, когда устройство заблокировано. Это позволяет эффективно предотвратить любую недорогую аппаратную атаку, в частности сбои напряжения, которые ранее были возможны в Trezor One и Trezor T, и дает пользователям уверенность в сохранности их средств, даже если устройство будет потеряно или украдено.

Безопасный чип, используемый в Trezor Safe 3 и Trezor Safe 5, — это Optiga Trust M (он же SLS32), выпускаемый компанией Infineon. Он состоит как из интегральной схемы (собственно чипа, состоящего из кремниевых транзисторов), так и из фиксированного, не подлежащего обновлению программного обеспечения, запрограммированного на чип компанией Infineon на своих производственных линиях. Это программное обеспечение имеет полностью закрытый исходный код.

Таким образом, Optiga выполняет полезную фиксированную функцию, не связанную с криптографией, позволяя использовать ранее сгенерированные криптографические ключи только при знании определённой информации, такой как PIN или другой секрет. Это полезно, но криптографические операции, такие как подписание транзакций в блокчейне, по-прежнему выполняются на обычном микроконтроллере.

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

Другими словами, новая архитектура устройств Trezor Safe 3 и Trezor Safe 5, включающая готовый, запрограммированный Secure Element, правильно решает проблему восстановления seed на украденном устройстве, что, пожалуй, является одной из самых серьезных и вероятных угроз, с которыми сталкивается пользователь криптовалюты. Важность этого действительно невозможно переоценить.

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

Целостность прошивки – взгляд атакующего

Представим себя на месте злоумышленника и детально изучим поверхность атаки Trezor Safe 3.

Используемый микроконтроллер обозначен как TRZ32F429, но фактически это STM32F429 в корпусе BGA с кастомной маркировкой. Несмотря на индивидуальную упаковку, электрически он идентичен STM32F429, а этот тип чипов уязвим к атакам через сбои напряжения (voltage glitching), что позволяет считывать и записывать данные во встроенную память. Эта уязвимость открывает возможность атаковать устройство в целом. Для этого злоумышленнику достаточно создать небольшую плату-адаптер, которая выведет контакты TRZ32F429 на стандартные разъёмы, чтобы подключить его к основной атакующей платформе.

TRZ32F429, установленный в Trezor Safe 3, и плата-адаптер, которую мы для него разработали.

Атака работает следующим образом.

Микроконтроллер STM32F4 имеет несколько конфигурационных байтов, включая один, который называется уровнем RDP (ReaDout Protection). Он хранится в одном байте с механизмом обнаружения ошибок, и может принимать три уровня: RDP0, который не предполагает защиту; RDP2, который представляет собой самую сильную защиту и считается необратимым; и RDP1, который является строгой защитой, но позволяет ограниченную отладку.

  • В RDP0 и встроенный загрузчик ST, и интерфейс отладки (для JTAG/SWD) позволяют полностью читать и записывать флеш-память устройства.
  • В RDP1 флеш-память недоступна для чтения через эти интерфейсы.
  • В RDP2 как загрузчик, так и интерфейс отладки отключены, и это режим, используемый в устройствах Trezor Safe 3. После перехода в RDP2 нельзя вернуться в RDP1 или RDP0.

Как мы уже говорили, уровень RDP хранится во флеш-памяти, и для того чтобы он повлиял на схему устройства, например, на интерфейс отладки, он должен быть зарегистрирован в цифровой логике. Это происходит в процессе загрузки устройства, до того как процессор начнёт выполнять команды. Если во время считывания из флеш-памяти происходит сбой напряжения, значение RDP может быть повреждено. Если это происходит, устройство может прочитать уровень RDP как 1, и иногда (хотя гораздо реже) ошибка приводит к тому, что значение остается валидным. Это позволяет понизить уровень RDP с 2 до 1.

Однако это изменение не сохраняется при перезагрузке, но его можно сделать постоянным, так как конфигурационные байты можно перепрограммировать через отладочный интерфейс, когда активен RDP1. К сожалению, установить уровень RDP в 0 напрямую нельзя, так как это приведет к стиранию флеш-памяти, чего мы не хотим допустить.

Это позволяет перепрограммировать чип по своему усмотрению — включая снятие защиты записи на любой странице флеш-памяти.

Еще одной возможностью в RDP1 является взаимодействие с встроенным загрузчиком ST, чего невозможно сделать в RDP2. Загрузчик поддерживает несколько команд, и для нас наиболее интересной является команда READ_MEMORY. Как уже упоминалось, флеш-память недоступна во время загрузки, но это ограничение реализовано исключительно программно, а не аппаратно.

На практике выполняется простая проверка уровня RDP, и команда отклоняется, если чип не находится в RDP0. Эту проверку можно обойти с помощью сбоя напряжения, и при правильных параметрах сбоя и времени, проверка может быть игнорирована. В этом случае команда успешно вернёт 256 байт данных, считанных с выбранного нами адреса. Чтобы прочитать больше данных, сбой нужно повторить. Для Trezor Safe 3 секретные данные хранятся на 32 смежных байтах, и их можно прочитать за один успешный сбой команды READ_MEMORY.

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

Чтобы проверить подлинность устройства Trezor, Trezor Suite отправляет устройству случайный вызов, а Optiga подписывает его. Эта подпись вместе с сертификатом, созданным в процессе производства, позволяет подтвердить, что именно эта Optiga была настроена компанией Trezor на ее производственной линии.

Несмотря на свою мощь, этот механизм проверяет подлинность только Optiga, но не микроконтроллера, и не свидетельствует о том, какое программное обеспечение запущено на последнем. Чтобы попытаться включить в проверку программное обеспечение микроконтроллера, используется предварительный общий секрет для каждого устройства, который опять же создается в процессе производства и известен только Optiga и микроконтроллеру одного и того же устройства Trezor Safe 3. Optiga принимает запросы на подпись только в том случае, если микроконтроллер, к которому она подключена, может доказать, что ему известен этот предварительный секрет.

Это обеспечивает связь между Optiga и микроконтроллером, но несколько слабую: она не удостоверяет, какое именно программное обеспечение работает на микроконтроллере, а лишь подтверждает, что он имеет доступ к заранее записанному секрету. Поскольку последний хранится во флэш-памяти TRZ32F429, для его считывания можно использовать сбой напряжения, а затем произвольно перепрограммировать чип, сохраняя тем самым полное впечатление подлинности устройства и одновременно позволяя реализовать атаки, которые могут привести к удаленному восстановлению всех средств пользователя (например, путем искажения генерации seed или манипулирования nonce подписей ECDSA).

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

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

К счастью, в Trezor прекрасно осведомлены об этих двух потенциальных атаках и работают над тем, чтобы усложнить их реализацию — например, см:

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

Печатные платы двух Trezor Safe 3, на одной из которых установлено подлинное программное обеспечение, а на другой — модифицированная прошивка.

Проверка прошивки

Однако это не совсем полная картина, поскольку Trezor реализовал еще один уровень защиты, чтобы попытаться обнаружить устройства с модифицированным, неоригинальным программным обеспечением, которое, как мы видели, может подвергнуть пользователя риску. В частности, при использовании устройства с Trezor Suite последний посылает случайный вызов устройству, которое затем вычисляет хэш, включающий в себя как вызов, так и запущенную прошивку. Это позволяет Trezor Suite проверить результат по базе данных подлинных образов программного обеспечения и является очень элегантной защитой.

Безопасность этого механизма основана на том, что из-за случайного вызова хэш должен быть полностью пересчитан устройством каждый раз. Злоумышленник не может просто закодировать хэш и отправить его обратно в Trezor Suite, он должен иметь под рукой полный образ программного обеспечения, чтобы иметь возможность вычислить хэш для любого возможного вызова. Учитывая, что микроконтроллер имеет ограниченный объем флэш-памяти, это является серьезным препятствием для любого злоумышленника, пытающегося изменить программное обеспечение, работающее на устройстве. Тем не менее нам удалось полностью обойти эту защиту, доказав, что, хотя она и очень умна, сама по себе она недостаточно надежна, чтобы помешать настойчивым злоумышленникам.

Если подумать, то части криптографии, связанные с аутентичностью (в отличие от конфиденциальности и целостности), позволяют предоставлять и проверять доказательства знания некоторых данных. Это обычно используется для подтверждения знания достаточно большого, действительно случайного секретного ключа, как в случае с проверкой аутентичности, реализованной с использованием Optiga в устройствах Trezor Safe.

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

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

Это не означает, что это не полезное дополнение к безопасности устройств, наоборот: оно действительно усложняет реализацию атаки на практике. Но этого недостаточно, и в конце концов общая безопасность устройств зависит от безопасности основной платформы — в данном случае микроконтроллера. Это приводит нас к Trezor Safe 5, который использует более новый микроконтроллер STM32U5, для которого на момент написания статьи не было публично представлено атак с инъекцией ошибок, и его проектирование явно учитывает такие угрозы, как сбои напряжения. Хотя он всё ещё не будет таким же безопасным, как Secure Element, это улучшает безопасность устройств по сравнению с теми, что используют TRZ32F429 — хотя бы на некоторое время.

Заключение

Мы считаем, что одной из основных задач Donjon является постоянное улучшение безопасности в экосистеме криптовалют, чтобы защитить пользователей. Мы видим, что это работает, и всё больше устройств учитывают угрозы аппаратных атак и интегрируют Secure Element в свою архитектуру.

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

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


Инженеры по безопасности Чарльз Кристен и Марион Лафон при участии Карима Абделлатифа, Баптистена Бойло и Оливье Эриво.