[Перевод] Разложил 512-битный RSA-ключ за 8,5 часа и вернул режим разработчика в T-Mobile Sidekick

Автор оригинала: x86.cx

Danger Hiptop, больше известный как T-Mobile Sidekick, вышел в 2002 году. У него была полноценная QWERTY-клавиатура, встроенные AIM и Yahoo Messenger и push-уведомления, и всё это в годы, когда большинство телефонов с трудом справлялись с SMS. Работало всё на DangerOS, собственной Java-операционке Danger.

Sidekick был облачным устройством ещё до того, как слово «облако» стало привычным. Всё хранилось на серверах Danger: контакты, сообщения, фотографии, настройки. Большинство владельцев понятия не имели, что их телефон, по сути, тонкий клиент, целиком зависящий от бэкенда, о котором они никогда не задумывались. Он просто работал, и этого хватало. В 2008 году Danger купила Microsoft, в 2009-м случилась катастрофическая потеря данных, стёршая у пользователей контакты, фотографии и личные файлы, а в 2011-м сервис закрыли окончательно. Телефону, который держал всё на чужих серверах, стало не с кем разговаривать.

Разрешение на запуск

Danger давно нет, и я начал копаться в том, что от неё осталось. В итоге нашёл на archive.org копию SDK[1]: в нём было всё, что нужно для разработки под устройство, — документация, примеры, симулятор и набор JAR-файлов. Я закинул эти JAR-ы в JADX, и декомпиляция показала, как устройство работает изнутри.

Мне хотелось запустить собственный код на настоящем Sidekick, а значит, предстояло разобраться с моделью безопасности Danger. DangerOS запускает только программы, подписанные Danger или оператором. Разработчики обходили это с помощью ключа разработчика. Прошиваешь его в телефон, и тот переходит в режим разработчика: принимает приложения по USB и включает htconsole, отладочную консоль Danger.

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

К концу года появилась веб-форма для самообслуживания: вводишь номер счёта T-Mobile и IMEI, соглашаешься отказаться от поддержки оператора, и подписанный ключ приходит на почту. Так продолжалось до сентября 2010 года, когда Danger сообщила разработчикам, что перестаёт принимать новые приложения[2], а через несколько недель закрыла сайт для разработчиков — единственное место, где можно было получить ключ. Ключи больше никто не выдаёт, так что если он мне нужен, придётся сделать его самому.

На фоне открытого Android необходимость спрашивать у производителя разрешения просто чтобы запустить свой код звучит дико. А может, и нет: Google как раз вводит верификацию разработчиков, и скоро приложение от разработчика, не зарегистрированного в Google, можно будет поставить только через adb или через запрятанный «расширенный сценарий».

Ищем ключ

Ключ разработчика Sidekick крошечный: одна настройка конфигурации, lock_to_imei_0, со значением IMEI телефона, и подпись Danger над ней. Бывает он в двух видах. Старые Hiptop принимали его как небольшой файл .sq, а Sidekick 3 — как .jar, устроенный как подписанное Java-приложение и устанавливаемый из режима восстановления. Подписаны оба одинаково, а единственный настоящий ключ, который мне удалось найти, был в формате .sq.

С настройкой всё просто. А чтобы сделать подпись, нужно знать, каким ключом телефон её проверяет, и этот ключ должен был где-то лежать в прошивке. Когда-то один студент получил полный JTAG-доступ к старому Sidekick и снял дамп его флеш-памяти[3], но для этого нужно железо, которого у меня нет, а его ссылки на скачивание давно мертвы.

К счастью, на archive.org сохранилась ServiceProgrammer — программа Danger для перепрошивки Sidekick II[4]. В ней лежат полные заводские образы ОС. Я прошёлся по всем образам в поисках всего, что похоже на сертификат или открытый ключ, и вытащил несколько десятков: сертификаты для подписи от разных операторов — T-Mobile, Fido, KPN и других, — заводские корневые сертификаты и несколько публичных корневых сертификатов TLS. Закрытых ключей, конечно, не было. Большинство ключей были 1024-битными RSA, но один сертификат выделялся:

CN=Danger Developer Program, OU=Developer, O=DangerE=Not Before: Sep 17 2003Not After: Apr 11 2006Public Key: RSA (512 bit)

Самоподписанный корневой сертификат программы для разработчиков, которому ОС доверяла на всех поколениях, что я проверил, от Hiptop 1 до Sidekick 3. Чтобы убедиться, что именно этим ключом подписаны ключи разработчика, нужен был настоящий ключ для сверки. Старый сайт Danger для разработчиков тоже сохранился на archive.org[5], и на нём до сих пор лежит null-device-key.sq — ключ без привязки к IMEI, который телефон принимает и тут же удаляет. Danger раздавала его, чтобы можно было выйти из режима разработчика. Его подпись сошлась с ключом Developer Program. Это был он.

512 бит

В 1999 году группа исследователей разложила на множители RSA-155 — 512-битное число, то есть нашла два простых числа, произведение которых его даёт. Больше ничего для взлома RSA-ключа и не нужно: в каждом открытом ключе есть такое число, и двух его простых множителей достаточно, чтобы восстановить закрытый ключ. У исследователей это заняло около семи месяцев на сотнях компьютеров. С тех пор 512-битный RSA перестал считаться безопасным, а Danger выпустила этот сертификат четырьмя годами позже. Справедливости ради, в 2003 году разложение 512-битного ключа всё ещё было исследовательским проектом, а этот ключ охранял всего лишь режим разработчика. Никто не стал бы арендовать вычислительные мощности целого университета, чтобы ставить свои приложения на Sidekick.

В 2026 году это работа на одну ночь, если ядер хватает.

Стандартный инструмент для этого — CADO-NFS, открытая реализация общего метода решета числового поля. Основная часть работы — просеивание, оно делится на независимые рабочие единицы и потому масштабируется на сколько угодно машин.

Одной моей рабочей станции, Ryzen 9 9950X3D, понадобилось бы около полутора суток, и то если ничего не сломается. К счастью, у меня было несколько серверов, которые особо ничем не были заняты. В CADO-NFS центральный сервер раздаёт рабочие единицы по HTTP, а клиенты просеивают и загружают результаты обратно. Я написал небольшой скрипт, который копировал пакет клиента на каждый узел, запускал там десятки клиентов с низким приоритетом и пробрасывал всё к рабочей станции через SSH-туннель. Всего над задачей работали 220 процессорных ядер (436 потоков) на семи машинах. Я запустил расчёт чуть позже девяти вечера.

Без сбоев не обошлось. Около одиннадцати вечера разом отвалились все узлы, а позже сервер захлебнулся, когда 200 клиентов одновременно попытались загрузить результаты. Оба раза я всё подлатал и запустил заново. И всё же в 6:09 утра CADO-NFS выдал два 78-значных простых числа:

p = 104491666572898294264047880744514595625924491114579942567545554396922436316211q = 110787645499676419929932206845243986470558771418524609420578927381066743957279

Перемножьте их — и получите n, 155-значное число из открытого ключа Danger:

n = 11576385713948644711688861097066027618113758646736035007798668946285132955940594207257263351308819380417615195922932748143994263878857883771956785119149869

Этап

Затраты

Выбор полинома

~63 ядро-часа

Просеивание

~578 ядро-часов, 204,5 млн соотношений

Фильтрация

~2 ядро-часа

Линейная алгебра

~35 ядро-часов, 2,5 часа на одной машине

Квадратный корень

около минуты

Итого

~1175 ядро-часов (около 49 ядро-суток), 8,5 часа реального времени

Дальше восстановить закрытый ключ можно в несколько строк на Python. Для проверки я написал свою программу подписи и с её помощью заново собрал null-device-key.sq от Danger. Результат совпал с оригинальным файлом байт в байт. Спустя больше двадцати лет я мог подписывать ключи разработчика так же, как это делала Danger.

Для Sidekick 3 я положил настройку с IMEI в .jar, подписал его и прошил из режима восстановления. Режим восстановления проверяет, что разрешено подписавшему сертификату: сертификат оператора мог заменить ОС целиком, а сертификат Developer Program — только установить настройку разработчика. Больше мне и не требовалось. При следующей загрузке в логе появились две строки, за которыми я охотился:

Config: Override w/key IMEI found.Config: DEVELOPER BUILD

Class of ’09

Первым делом я запустил на разблокированном Sidekick 3 порт Class of ’09 — визуальной новеллы, действие которой происходит в 2007 году, а у главной героини как раз Sidekick. Порт представляет собой небольшой движок на Java, который проигрывает сценарий, графику, озвучку и ролики игры из пакета данных на карте памяти, ужатого с 1080p до экрана 240×160. Концовки приходят настоящими текстовыми уведомлениями Sidekick через эмулированный модем. Об этом стоит написать отдельный пост.

Class of '09 на Sidekick 3Class of ’09 на Sidekick 3

Симулятор в браузере

Прим. пер.: в оригинале статьи в самом начале страницы встроен работающий Sidekick — о нём и идёт речь в этом разделе.

Sidekick в начале оригинальной страницы — это настоящая DangerOS, тот же байт-код, что и в симуляторе из SDK, только запущенный в браузере. Симулятор Danger — настольное Java-приложение, а привычные способы запустить Java на веб-странице тащат за собой целую JVM. DangerOS столько не нужно, поэтому я написал небольшой интерпретатор Java на JavaScript. Он загружает ОС прямо из SDK, без изменений, поверх стандартной библиотеки классов Java. Переписал я только то, что касалось десктопа: экран, клавиатуру, файлы и звук.

Со звуком вышло особенно. Sidekick 3 не декодирует MP3 программно: телефон передаёт их своему звуковому железу. Симулятору Danger передавать их было некому, поэтому MP3 он не играл вообще. Он знал только MIDI, WAV и ещё пару форматов, и музыкальный плеер из SDK показывал список песен, а потом играл тишину. В браузере MP3 уходят во встроенный декодер браузера, который подменяет железо. Поэтому плеер здесь работает. Сети нет, так что всё ведёт себя как телефон без сигнала: лаунчер, игры и плеер работают, а всё, что требует интернета, нет. Все изменения сохраняются в браузере до следующего раза.

Это телефон целиком, так что осмотритесь. Кнопка Jump (или F8) возвращает на главный экран откуда угодно. Помните адрес на том сертификате? Он принадлежит Брайану Светланду (Brian Swetland), который работал над операционной системой Hiptop, а потом руководил работой над ядром Android. На его сайте есть галерея фотографий из офиса Danger 2001 года, Dangerous People 2001, и они есть на этом Sidekick: откройте приложение Camera и выберите альбом. Остальные фотографии там я снял на свой Sidekick 3 в Японии. В разделе Games уже установлена Class of ’09. Попробуйте!

Re:Danger

Без серверов Danger Sidekick — только половина телефона, поэтому я ещё и восстанавливаю их по декомпилированному коду. Проект называется Re:Danger. Пока он общается только с симулятором. Вот что уже есть:

Часы. Первое, что заработало. После рукопожатия и входа сервер сообщил телефону, который час, и часы в строке состояния переключились. Это был первый ответ, который Sidekick получил от бэкенда с 2011 года.

Сообщения. Sidekick никогда не подключался к AIM, Yahoo или MSN сам. Серверы Danger оставались залогинены от вашего имени и отправляли каждое сообщение на телефон в момент его прихода — за годы до того, как push-уведомления появились у iPhone. Этих сервисов больше нет, поэтому Re:Danger пересылает сообщения в Discord.

Сообщения через Re:DangerСообщения через Re:Danger

Веб. Телефон никогда не загружал страницы сам: прокси Danger скачивал страницу, верстал её и отправлял телефону уже свёрстанную страницу, которую оставалось только отрисовать. Это значило, что Danger видела каждую страницу, которую вы открывали. Впрочем, это мало что меняло: большая часть веба тогда всё равно не шифровалась. В Re:Danger есть маленькая версия такого прокси — её хватает, чтобы читать Hacker News на Sidekick.

Hacker News на Sidekick через прокси Re:DangerHacker News на Sidekick через прокси Re:Danger

Что дальше

Настоящее железо. Настоящий Sidekick к серверу Re:Danger ещё ни разу не подключался. Я пытался направить на него свой телефон через переопределение конфигурации и через сеть по USB, и телефон отказался в обоих случаях. Следующий шаг — поднять собственную GSM-сеть: Sidekick 3 — телефон GSM/EDGE, так что SDR с Osmocom может заменить вышки T-Mobile, передавать его данные и отправлять их в Re:Danger вместо Danger.

Всё остальное. Почта, подключение к возрождённым серверам AIM по протоколу OSCAR, каталог загрузок Download Catalog и синхронизация фотографий — всё это ещё в списке.

Если у вас есть Sidekick 3, сделайте для него ключ разработчика и запустите свой код.

Если у вас есть Hiptop 1 или 2, мне интересно, работает ли ещё оригинальная процедура прошивки от Danger. Проверить её я не смог.

Примечания

  1. Hiptop SDK: https://archive.org/details/hiptop_sdk

  2. «Danger Closing Developer Program», Hiptop3.com, 2010: http://www.hiptop3.com/archives/danger-closing-developer-program

  3. Заметки о JTAG и дампе флеш-памяти Sidekick II (архив): https://web.archive.org/web/20160628162439/http://www.cs.umb.edu:80/~bazz/learn/independent/sidekick2/

  4. Прошивки Danger Hiptop2: https://archive.org/details/danger_hiptop2_firmware

  5. Архив материалов для разработчиков Danger Hiptop: https://archive.org/details/danger-hiptop

Источник: habr.com

0 0 голоса
Рейтинг новости
1
0
Подписаться
Уведомить о
0 комментариев