Представьте, что у вас есть два миллиона долларов, хранящихся на куске кремния размером с почтовую марку, а пароль от них вы забыли.

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

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

Меня зовут Джо Гранд, я хакер оборудования. Взлом подобного продукта — потрясающая задача, похожая на решение головоломки, и у нас есть только один шанс сделать всё правильно.

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

В процессе работы я общался с заказчиком и объяснял риски. Например, он собирался доставить мне устройство самолётом, и мы обсудили опасность его рентгеновского досмотра. Большинство электроники выдерживает воздействие рентгеновских лучей, это не какое-то особо мощное излучение.

Основы

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

Блокчейн — это технология, используемая в криптовалюте, по сути, в качестве децентрализованной цифровой бухгалтерской книги: каждый раз, когда происходит транзакция, она становится публичной. Если мои заказчики Дэн и Джесси потеряют свой приватный ключ, хранящийся в их физическом аппаратном кошельке, то изменения в бухгалтерскую книгу внести будет нельзя. Аппаратный кошелёк — это, по сути, компьютер общего назначения, хранящий приватный ключ, но если вы забудете пароль к кошельку, то дело плохо... если, конечно, вы не найдёте кого-то вроде меня.

Рассказывает заказчик Дэн Райх: «Несколько лет назад мы с другом инвестировали деньги в криптомонеты. Одна из этих монет, THETA, взлетела, и у нас появилось больше двух миллионов долларов. Друг записал пароль от неё на кошелёк, но потом забыл PIN-код. Ирония в том, что он профессионально играет в покер и обладает фотографической памятью.

Если ввести четырёхзначный PIN кошелька Trezor с ошибкой слишком много раз, то его содержимое будет стёрто. Поэтому мы обыскали всё, гуглили и искали людей, которые смогут нам помочь, пока не нашли Джо и каких-то ребят из Швейцарии, работавших в секретной лаборатории. Я спросил их, можно ли приехать к ним, чтобы убедиться, что всё реально. Они отказались. Я был согласен даже на то, чтобы они надели мне мешок на голову, пока меня везут в эту лабораторию. Тем временем Джо добился кое-какого прогресса и показал, что может взломать устройство. При этом он очень подробно рассказывал, как будет выполнять эту работу. Когда ему удалось взломать три тестовых кошелька подряд, я сел в самолёт и прилетел в Портленд, надеясь наконец спасти монеты.

После шестнадцати ошибочных попыток ввода PIN данные кошелька удаляются. Дэн с Джесси потратили уже двенадцать попыток и больше не хотели рисковать. Тогда эти монеты суммарно стоили 12 тысяч долларов. Дэн уже сдался и выбросил эти деньги из головы. Он был готов смириться... но потом стоимость криптовалюты снова пошла вверх. К концу 2020 года их монеты стоили больше 400 тысяч долларов и на короткий момент достигала цены более трёх миллионов.

Уже было много историй о том, как люди забывали пароли к аппаратным кошелькам и теряли деньги. Например, в 2017 году мой друг Марк Фрауенфельдер хранил 7,4 биткойна, которые тогда стоили три тысячи долларов. Пароль он записал на листе бумаги, который однажды выбросила уборщица. Он думал, что помнил PIN, но оказалось, что забыл и его.

В другом случае человек предпринимал все усилия для возврата 280 миллионов долларов в биткойнах. У него было 7500 биткойнов, а приватный ключ хранился на жёстком диске. У него было два одинаковых жёстких диска, и он случайно выбросил не тот. Любопытно, что жёсткий диск выбросили на местную свалку, то есть ему нужно было искать иголку в очень дурно пахнущем стоге сена.

И это лишь две самые известные истории. Я был практически уверен, что мы сможем взломать кошелёк. Для устройства Trezor One уже существовали эксплойты, поэтому когда Дэн обратился ко мне с вопросом, смогу ли я взломать его, я ответил утвердительно. Мне казалось, я смогу повторить какую-то из работ. В 2017 году пятнадцатилетний британский хакер Салим Рашид нашёл способ взлома кошелька Марка, о котором говорилось выше. Рашид обнаружил, что когда кошелёк Trezor включён, он создаёт копию PIN и ключа, хранящегося в защищённой флеш-памяти устройства, и помещает копию в ОЗУ. Уязвимость позволила ему перевести кошелёк в режим обновления прошивки и установить в устройство его собственный неавторизованный код, считывающий PIN и ключ из ОЗУ. Но при установке этого кода PIN и ключ удаляются из долговременной флеш-памяти, оставляя только копию в ОЗУ. Это была рискованная методика: если мы случайно сотрём ОЗУ до считывания данных, то ключ будет невозможно восстановить.

В любом случае, компания Trezor с тех пор внесла изменения в свои кошельки: PIN и ключ, копируемые в ОЗУ при запуске, при переключении устройства в режим обновления прошивки удаляются из ОЗУ.

Взлом

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

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

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

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

С его помощью мы подаём питание на устройство, а затем отключаем его. Глитч может сработать только при включении питания, поэтому если он не сработал, мы отключаем устройство, а потом снова подаём питание. Нам нужно победить проверку безопасности ровно в подходящий момент, чтобы убедить чип, что у нас есть доступ к нему. При помощи Chip Whisperer мы проводим атаку под названием fault injection или voltage glitch: по сути, она позволяет чипу работать ошибочно в выгодную нам сторону. Электронные системы рассчитаны на работу в определённом диапазоне параметров, и их поставщик гарантирует работу только в этой области.

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

Кроме того, нам нужно модифицировать устройство, чтобы можно было подключить его к остальному оборудованию. Для начала я просто подсоединил кошелёк к своему компьютеру, чтобы убедиться, что в нём установлена версия прошивки 1.6.0.

Отлично!
Отлично!

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

Теперь мы подсоединяем к разъёму программатор J-link Plus, а также подключим к системе осциллограф. Включим питание, после чего нам останется лишь сидеть и ждать. Мы запустили глитч-атаку: основной цикл программы многократно выполняет цикл включения-отключения, проверяя, открылся ли интерфейс отладки. Как только он сработает, мы получим ID устройства, и это будет значить, что оно открыто для нас. Я предложил сделать ставку, через какое время глитч сработает. Дэн решил, что примерно через час. Мне показалось, что, скорее всего, понадобится 3-4 часа. Возможно, даже шесть часов: нам нужно обойти довольно широкий диапазон примерно в десять тысяч попыток, а тестировать можно всего одну в секунду. Так что точно мы не знаем; я лишь надеялся, что не придётся сидеть всю ночь. Параллельно я занимался за компьютером другими вещами, поэтому в код скрипта я добавил воспроизведение аудио с фразой «Hack the planet» («Хакайте планету»).

Спустя 3 часа 19 минут глитч сработал. Оставалось понять, можно ли извлечь из устройства содержимое ОЗУ. Для этого понадобилась внешняя программа. После успешного копирования содержимого памяти на экране появились PIN (оказалось, что он пятизначный, а не четырёхзначный, как думали заказчики) и парольная фраза криптокошелька.

В последующих версиях прошивки Trezor частично устранила проблему, использованную нами для взлома. Кошельки больше не копируют и не перемещают ключ и PIN в ОЗУ. Теперь они хранятся в защищённой флеш-памяти, которую не затрагивают обновления прошивки.

Однако фундаментальную проблему чипа STM32, благодаря которой fault injection по-прежнему может существовать, способен решить только производитель чипов, что он делать отказывается, или заменой чипа на более защищённый. Разработчики Trezor изучили второй вариант, но выяснилось, что производители более защищённых чипов требуют подписания NDA, на что компания идти отказывается. В Trezor используется опенсорсное ПО, и когда команда обнаружила в одном из защищённых чипов уязвимость, производитель сослался на NDA, запретив ей говорить об этом.

Об авторе

Джо Гранд — инженер-электротехник и изобретатель, взламывавший оборудование с десяти лет. Он был членом известного хакерского коллектива L0pht под прозвищем Kingpin. В 1998 году он выступал в Сенате США с объяснением уязвимости, которую можно использовать для вывода из строя Интернета или слежки за трафиком со стороны спецслужб. В настоящее время он обучает взлому оборудования организации и компании, которые изготавливают сложные системы и желают знать, как хакеры могут атаковать их продукты.