Аппаратный CTF. Легкий способ узнать ключ шифрования, когда у тебя под рукой осциллограф и ноутбук

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

В 2016 году компания Riscure проводила конкурс среди энтузиастов информационной безопасности RHme2. Задачи на реверс бинарников, цифровых протоколов, криптографию и эксплуатацию уязвимостей решали на единой аппаратной платформе — это была крохотная плата Arduino Nano с микроконтроллером AVR. Позднее, на конференции RSA 2018 в Сан-Франциско, один из организаторов конкурса сетовал на то, что лишь немногие участники пробовали свои силы в аппаратных атаках по второстепенным каналам (АВК) и атаках методом индуцированных сбоев (АМИС).

Остальные же посчитали подобные способы чересчур сложными, дорогими и нереалистичными и отказались от дальнейших попыток. Чтобы показать, что и такой вектор атаки стоит рассматривать в качестве потенциальной угрозы, Рафаэль Буа Карпи (Rafael Boix Carpi) из Riscure в ходе выступления успешно решил одну из задач на оборудовании стоимостью менее 60 долларов (не считая ноутбука). Так что стартовый набор для начинающего исследователя аппаратных уязвимостей сегодня доступен как никогда раньше!

В исполнении инструктора из Riscure атака кажется настолько простой и изящной, что хочется повторить ее прямо здесь и сейчас. Что я практически сразу же и сделал, с некоторыми изменениями и дополнениями.

WARNING

Информация в статье предназначена исключительно для образовательных целей. Редакция и автор не несут ответственности за любое противоправное применение и причиненный ущерб.

Современное железо

В первую очередь было решено выбрать в качестве цели более актуальное железо. Arduino и AVR — это прекрасно, это наше наследие, и к нему нужно относиться с подобающим уважением, а не ломать направо и налево. Но сегодня бал правят микроконтроллеры на ядре ARM (Cortex-M). И вероятнее всего, именно их ты обнаружишь, распотрошив ближайшее умное устройство — беспроводную розетку, лампочку с Wi-Fi и прочие прелести сомнительной автоматизации.

На первый взгляд, бюджетный микроконтроллер STM32F091 (Cortex-M0) на плате Nucleo-64 идеально подходил на роль подопытного кролика. По сравнению с Arduino Nano это решение выглядит выигрышно буквально по всем параметрам: разрядность 32 бит (против восьми), тактовая частота 48 МГц (против шестнадцати) и напряжение питания всего 3,3 В против пяти. Что касается цены, нужно учесть, что оригинальные итальянские платы Arduino стоят как минимум столько же, если не дороже.


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

К счастью, у меня на столе стоял осциллограф RTC1002 компании Rohde & Schwarz. Если верить рекламным материалам, это модель начального уровня, но это обманчивое впечатление. Да, такой осциллограф стоит как флагманский смартфон, но у него масса полезных функций, и он максимально удобен.

Суть атаки

Остальные условия изначального конкурса я решил не менять. Мы по-прежнему будем анализировать трассы энергопотребления нашего устройства в момент шифрования данных и пытаться угадать хранящийся в памяти пароль. Шифр — AES в режиме ECB с длиной ключа в 128 бит.

Конечно, на практике в реальном устройстве ты, скорее всего, обнаружишь AES в режиме CBC, но я так и не придумал, как органично вписать вектор инициализации в условия задачи. Сам по себе IV без ключа шифрования не представляет особой ценности для злоумышленника и нередко передается в открытом виде (примером тому могут служить протоколы SSL/TLS, смотри RFC 5246).

INFO

Порой встречается ошибочное мнение, будто у алгоритма AES переменный размер блока. Это не совсем так, размер блока всегда фиксирован и составляет ровно 128 бит. А вот у симметричных шифров семейства «Рэндал» (к которому и относится AES) размер блока действительно различается и составляет от 128 до 256 бит (с шагом 32 бит). При этом размер ключа и количество раундов шифрования могут варьироваться. Так, существуют AES-128 (десять раундов), AES-192 (двенадцать раундов) и AES-256 (четырнадцать раундов).

Сам по себе алгоритм AES считается одним из лучших, используется практически повсеместно, и на сегодняшний день для него не известно ни одной реальной уязвимости. Что же может пойти не так и есть ли у нас вообще шансы на успех?

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

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

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

Таким образом, принцип атаки следующий: мы посылаем с компьютера на вход исследуемого устройства случайный набор чисел, устройство их шифрует и отправляет обратно, а осциллограф внимательно следит за расходом электроэнергии (счетчикам ЖКХ такая точность и не снилась). После этого по команде с компьютера мы сохраняем осциллограмму и набор данных (вход и выход) и повторяем процесс.

В теории все выглядит соблазнительно просто, не так ли? Сколько раз я так ошибался.

Подготовка платы

Начнем с отладочной платы: ее предстоит немножко испортить, но тут уж ничего не поделаешь. В первую очередь удалим с текстолита все лишнее, что может как-то потреблять или накапливать энергию, — нам нужен максимально чистый сигнал с самого микроконтроллера, а не с конденсаторов из его обвязки.

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

Теперь наступил черед конденсаторов в цепи питания. Микроконтроллер требует 3,3 В, но это совместимая с Arduino плата, и она рассчитана на внешний источник питания 5 В, за это отвечает линейный DC/DC-преобразователь LD39050PU33R. То, что он линейный, — это хорошо, от импульсного были бы лишние помехи.

Конденсаторы С20 и С21 на входе можно оставить, а вот С18 и С19 явно лишние, смело бери паяльник в руки и выпаивай. Да их тут и не было! Также совершенно необязательны конденсаторы С23, С24, С27 и C28. У них какие-то смешные емкости — 100 нФ — можно даже не обращать внимания. Понравилось? Все, стой, остальные пусть живут!

Теперь о грустном. Мы перед этим отломали программатор, но он нам все еще нужен. Ты ведь его не выбросил, верно? Это было очень предусмотрительно! И дело не в том, что программатор нам понадобится для того, чтобы прошить микроконтроллер. Нет, это, оказывается, еще и переходник с USB — UART, и с его помощью мы будем общаться с компьютером.

Проблема в том, что дорожки RX/TX интерфейса UART располагались как раз на перемычках, которые мы до этого перерезали. На программаторе эти сигналы доступны на разъеме CN3, но на самой плате с F091 контакты D0/D1 разъема CN9 не подсоединены к микроконтроллеру. За это отвечают перемычки SB62 и SB63 на обратной стороне платы, так что соедини их парой капель припоя.

Кстати, ты обратил внимание, что на плате отсутствует кварцевый резонатор на месте X3? Есть «часовой» кварц на 32,768 кГц на месте X2, но он предназначен для RTC. Оказывается, ST-Link, кроме того что выполняет свои основные функции, еще и генерирует опорную частоту в 8 МГц для основного микроконтроллера! Это линия МСО на схеме (вывод PF0).

В отличие от интерфейса UART, этот сигнал не выведен ни на какие контакты, и без него F091 работать точно откажется. Мне не пришло в голову ничего лучше, чем купить в ближайшем магазине радиодеталей кварцевый генератор на 8 МГц. Его следует подключить к линии 5 В. При этом меандр будет с амплитудой 5 В вместо положенных 3,3 В, но это не страшно, так как вывод PF0 обозначен в даташите на микроконтроллер как FT, то есть совместимый с пятивольтовой логикой.


Остается только отпаять перемычку SB50 и запаять SB55, чтобы вывести ножку PF0 на 29-й контакт разъема CN7. Вполне вероятно, сейчас тебя занимает только одна мысль: зачем разработчики в ST придумали такую сложную схему? Оказывается, на такой печатной плате основана вся модельная линейка отладок Nucleo-64, а это почти двадцать разных версий. Конкретная версия отличается сочетанием всех этих крошечных перемычек.

Продолжение доступно только участникам

Материалы из последних выпусков становятся доступны по отдельности только через два месяца после публикации. Чтобы продолжить чтение, необходимо стать участником сообщества «Xakep.ru».

Присоединяйся к сообществу «Xakep.ru»!

Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», увеличит личную накопительную скидку и позволит накапливать профессиональный рейтинг Xakep Score! Подробнее

faberge: Цифровыхъ дѣлъ мастеръ

Комментарии (5)

    • У залогиненных должно быть.

      • В мобильной версии уже давно нет, теперь в десктопной пропали в новых темах, в старых остались

        • Наоборот, мы его вернули в мобильную версию и везде подписали "добавить в закладки" для ясности. Попробуйте выключить все плагины-блокираторы, перезагрузить страницу и дождаться полной загрузки.

          • Из всех с последней страницы только 3 определенные темы могу добавить, проверял в пяти разных браузерах