Information Security
Data recovery
Reverse engineering
Data storage
June 17

Реверсинг и взлом самошифрующегося внешнего HDD-накопителя Aigo. Часть 1: Препарируем на части

Original author: Raphaёl Rigo
Translation

Реверсинг и взлом внешних самошифрующихся накопителей – мое давнее хобби. В прошлом мне доводилось упражняться с такими моделями, как Zalman VE-400, Zalman ZM-SHE500, Zalman ZM-VE500. Совсем недавно коллега занес мне еще один экспонат: Patriot (Aigo) SK8671, который построен по типичному дизайну – ЖК-индикатор и клавиатура для ввода ПИН-кода. Вот что из этого получилось...


1. Введение
2. Аппаратная архитектура
– 2.1. Основная плата
– 2.2. Плата ЖК-индикатора
– 2.3. Клавиатурная плата
– 2.4. Смотрим на провода
3. Последовательность шагов атаки
– 3.1. Снимаем дамп данных SPI-флешки
– 3.2. Обнюхиваем коммуникации




1. Введение



Корпус



Упаковка


Доступ к сохранённым на диске данным, которые якобы зашифрованы, осуществляется после ввода пинкода. Несколько вводных замечаний по этому девайсу:


  • Для изменения пинкода необходимо нажать F1 перед разблокировкой;
  • В пинкоде должно быть от 6 до 9 цифр;
  • После 15 неверных попыток диск очищается.


2. Аппаратная архитектура


Сначала препарируем девайс на части, чтобы понять, из каких компонентов он состоит. Самое нудное занятие — вскрытие корпуса: много микроскопических винтиков и пластика. Вскрыв корпус, видим следующее (обратите внимание на припаянный мной пятиконтактный разъём):




2.1. Основная плата


Основная плата довольно-таки проста:



Наиболее примечательные её части (см. сверху вниз):


  • разъём для ЖК-индикатора (CN1);
  • пищалка (SP1);
  • Pm25LD010 (спецификация) SPI-флешка (U2);
  • контроллер Jmicron JMS539 (спецификация) для USB-SATA (U1);
  • разъём USB 3 (J1).

SPI-флешка хранит прошивку для JMS539 и некоторые настройки.



2.2. Плата ЖК-индикатора


На плате ЖК нет ничего примечательного.




Всего лишь:


  • ЖК-индикатор неизвестного происхождения (вероятно с китайским набором шрифтов); с последовательным управлением;
  • ленточный соединитель для клавиатурной платы.


2.3. Клавиатурная плата


При осмотре клавиатурной платы дела обретают более интересный поворот.



Вот здесь, на задней стороне, мы видим ленточный соединитель, а также Cypress CY8C21434 – микроконтроллер PSoC 1 (далее по тексту будем звать его просто PSoC)



CY8C21434 использует набор инструкций M8C (см. документацию). На странице продукта указано, что он поддерживает технологию CapSense (решение от Cypress, для емкостных клавиатур). Здесь виден припаянный мной пятиконтактный разъём – это стандартный подход для подключения внешнего программатора через ISSP-интерфейс.



2.4. Смотрим на провода


Разберёмся, что с чем здесь связано. Для этого достаточно прозвонить провода мультиметром:



Пояснения к этой на коленке нарисованной схеме:


  • PSoC описан в технической спецификации;
  • следующий разъём, тот что правее – ISSP-интерфейс, который волею судеб соответствует тому, что о нём написано в Интернете;
  • самый правый разъём – это клемма для ленточного соединителя с клавиатурной платой;
  • чёрный прямоугольник – чертёж разъёма CN1, предназначенного для соединения основной платы с ЖК-платой. P11, P13 и P4 – присоединены к ножками PSoC 11, 13 и 4, на ЖК-плате.


3. Последовательность шагов атаки


Теперь, когда мы знаем, из каких компонентов состоит этот накопитель, нам необходимо: 1) убедиться, что базовая функциональность шифрования действительно присутствует; 2) узнать, как генерируются/сохраняются ключи шифрования; 3) найти, где именно проверятся пинкод.


Для этого я проделал следующие шаги:


  • снял дамп данных SPI-флешки;
  • попытался снять дамп данных PSoC-флешки;
  • удостоверился, что обмен данными между Cypress PSoC и JMS539 фактически содержит нажатые клавиши;
  • убедился, что при изменении пароля, в SPI-флешке ничего не переписывается;
  • был слишком ленивым, чтобы реверсить 8051-прошивку от JMS539.


3.1. Снимаем дамп данных SPI-флешки


Эта процедура очень проста:


  • подключить зонды к ножкам флешки: CLK, MOSI, MISO и (опционально) EN;
  • «обнюхать» коммуникации снифером, используя логический анализатор (я воспользовался Saleae Logic Pro 16);
  • декодировать SPI-протокол и экспортировать результаты в CSV;
  • воспользоваться decode_spi.rb, чтобы распарсить результаты и получить дамп.

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


$ decode_spi.rb boot_spi1.csv dump
0.039776 : WRITE DISABLE
0.039777 : JEDEC READ ID
0.039784 : ID 0x7f 0x9d 0x21
---------------------
0.039788 : READ @ 0x0
0x12,0x42,0x00,0xd3,0x22,0x00,
[...]
$ ls --size --block-size=1 dump
49152 dump
$ sha1sum dump
3d9db0dde7b4aadd2b7705a46b5d04e1a1f3b125 dump

Сняв дамп с SPI-флешки, я пришёл к выводу, что её единственная задача – хранить прошивку для устройства управления JMicron, которая встраивается в 8051-микроконтроллер. К сожалению, снятие дампа SPI-флешки оказалось бесполезным:


  • при изменении пин-кода дамп флешки остаётся тем же самым;
  • после этапа инициализации девайс к SPI-флешке не обращается.


3.2. Обнюхиваем коммуникации


Это один из способов найти, какой чип отвечает за проверку коммуникаций, для интересующих времени/контента. Как мы уже знаем, контроллер USB-SATA подключен к ЖК Cypress PSoC через разъём CN1 и две ленты. Поэтому подключаем зонды к трём соответствующим ножкам:


  • P4, общий ввод/вывод;
  • P11, I2C SCL;
  • P13, I2C SDA.


Затем запускаем логический анализатор Saleae, и вводим на клавиатуре: “123456~”. В результате видим следующую диаграмму.



На ней можем видеть три канала обмена данными:


  • на канале P4 несколько коротких всплесков;
  • на P11 и P13 – почти непрерывный обмен данными.

Увеличивая первый всплеск на канале P4 (синий прямоугольник предыдущего рисунка), видим следующее:



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


Однако последний аудио-поток канала P4 немного отличается от других: это звук для «неверного пинкода»!


Возвращаясь к диаграмме нажатия клавиш, при увеличении диаграммы последнего аудио-потока (см. снова синий прямоугольник) получаем:



Здесь мы видим однообразные сигналы на P11. Так что, похоже, это и есть синхросигнал. А P13 – данные. Обратите внимание, как шаблон изменяется после окончания звукового сигнала. Было бы интересно посмотреть, что здесь происходит.


Протоколы, работающие с двумя проводами, это обычно SPI или I2C, и в технической спецификации на Cypress говорится, что эти контакты соответствуют I2C, что, как видим, справедливо и для нашего случая:



Чипсет USB-SATA постоянно опрашивает PSoC – чтобы считывать состояние клавиши, которое по умолчанию равно «0». Затем, при нажатии клавиши «1», оно меняется на «1». Окончательная передача, сразу после нажатия “~” отличается, если введён неверный пинкод. Однако на данный момент я не проверял, что там фактически передаётся. Но подозреваю, что вряд ли это ключ шифрования. Так или иначе, смотри следующий раздел, чтобы понять как я снял дамп внутренней прошивки PSoC.

+15
8.9k 46
Comments 12
Top of the day