Почему нельзя переливать дампы из одного "подписанного" телефона в другой? Схема проверки подписей.

  • Автор темы Автор темы Radiotrance
  • Дата начала Дата начала
3/3/06
4 202
Решения
1
1 859
1 000
735
Давно этот вопрос покоя не дает. Есть аппараты, в том числе на MTK, из которых нельзя вычитать прошивку и влить в другой такой же - он не запустится. Хочется знать, почему.

Прошивки под SPFT у таких телефонов часто имеют приставку *-sign и в файлах виден какой-то блок данных в самом низу. Подпись, надо полагать. Если бы применялась простая схема с закрытым и открытым RSA ключами, такого бы не происходило. Допустим, процессор проверяет подпись прелоадера, прелоадер - файла lk.bin и так далее. Хэш раздела шифруется закрытым ключом производителя, расшифровывается открытым, все просто. Это исключает запуск "не одобренного" производителем софта, но привязки к железу в данной схеме нет. Переливка дампа должна давать запуск. Однако, этого не происходит - видимо, схема сложнее.

1. Как именно реализуется механизм подписи прошивок и почему нельзя перелить дамп с одного аппарата в другой?
2. Почему при этом прошивка -sign файлов возвращает такие аппараты к жизни? Онлайн-подписывание не рассматриваем, все без интернета и авторизующих серверов.

JayDi знает, но не говорит.
 
Последнее редактирование:
В распространяемой по интернету прошивке такой привязки быть не может. И тем не менее, она оживляет телефон, а проливка дампа с такого же - нет.
Хочется понимать, как это работает.

пытался выяснить сей вопрос у JayDi в
но до конца он карты не раскрыл
 
Ну и я чуток совсем мыслей вставлю
Ничто не мешает взять прошивку в которой *sign*
Прошить в устройство
Слить с устройства дамп, желательно через emmc, дабы исключить порчу/модификацию данных процессором
Порезать дамп на разделы
Распаковать sparse файлы прошивки *sign*
И посмотреть различия всех разделов
Сразу станет понятно всё
Если прошивка обычная, не *sign* - данные должны совпадать
Ну кроме Кэш/Юзердата
 
так в том и юмор что прошивка с sign общая для модели а подвязка к железу аппарата ведется силами cpu и уже он под себя изменяет исходные данные так чтобы только он их понимал.... но это так чисто теория....
 
То есть подписи для прошивки - одни, а для запуска - другие? созданные самим процессором в процессе прошивки/при первом запуске?
Заморочено. Может в этом и есть правда, но кто-то наверняка знает схему точно.

Готов такого человека слегка замотивировать ею поделиться.
 

у самого лежат 3-4 аппарата блаупункт стертые в ноль на которых нет прошивки в природе...и стабильно приносят такие же телефоны на розлочку и тд...но дамп как вы и сказали ничего не дает.Аппараты на 6580
 
В свое время у МТК ( Nokla ) Были методы - когда загрузчик не лету криптовал блок под CPU ID соответственно дамп в RAW режиме читался ч уже зашифрованым блоком и даже в оригинальный телефон лился, но запуск не происходил. Тут вероятно та же тема.
 
В seccfg все лежит.
Есть несколько типов проверки.
Старый - когда агент при прошивке обновляет раздел seccfg сигнатурами файлов, которые проходят проверку, уникальным ключом процессора.
Нехитрыми манипуляциями можно их подтасовать, либо, в зависимости от выставленных битов фузов - можно просто подобрать другой прелоадер, что вполне себе пригодно для 80% тушек, кроме реализаций с дополнительными проверками. Т.е. все варианты GENERIC MTK, без прошитых фузов.

Новый - когда сигнатура в хвосте файла. Т.е. никаких проблем с переносом данных нет.

Проверить какой режим - довольно просто и быстро, достаточно посмотреть в seccfg. Актуально только, если тушка не подвергалась стиранию или прошивке чем-то, кроме стандартных средств и прошивок.
Это актуально для LEGACY платформы. В новых - аналогично нынешним трендам, например, как у qualcomm. Или простыми словами - без каких-либо проблем совсем.
 
То есть берутся подписи из lk-sign.bin, recovery-sign.img и т.д., которые лежат в конце разделов, тупо шифруются поверх с использованием CPU ID и кладутся в seccfg?
При запуске прелоадер берет закриптованную подпись для lk.bin, раскриптовывает два раза - ключом проца и открытым ключом производителя, - самостоятельно считает хэш и сверяет с тем, что раскриптовал?
Но в этом случае сами разделы lk, boot, recovery и другие можно переносить без проблем, ведь подписи внутри них не нарушаются. Родным должен быть лишь seccfg.

Мои представления хоть немного похожи на правду?

Так понимаю, новые - это Modern Raphael, все, начиная с MT675x.
Получается, в новых МТК привязки к железу нет вообще, то есть защита слабее?
 
1. Один раз. Перенести-то можно, вот только толку от этого нет. Внутри разделов нет подписей. Родным должен быть весь boot_chain , который проверяется и раздел SecCfg + проц тот же самый.
2. Так как нынче активно используется полноценный SecureBoot из hw+sw : eFuse, цепочка корневых сертификатов и прочее. Текущий вариант на несколько уровней выше.
В старых, как в итоге оказалось, имея на руках дамп тушки - отвязать ее и вообще избавить от верификации не составляет проблем для большинства девайсов, кроме тех, что имеют активный SLA\CERT\SBC уровни.
 
1. Значит, схему я так и не понял. Реально ли описать ее подробнее?
ШЬем, например, lk-sign.bin. Внутри него есть какая-то не привязанная к процу подпись, т.к. прошивка из интернета. Как она пересчитывается под проц и куда потом пропадает из раздела?
2. Уровень реализации выше, но дампы при этом переливать можно? А в более старых нельзя.
 
Я не знаю, как простыми словами объяснить то, что файлы там выглядят совсем иначе, чем обычные. Есть специальный заголовок размещения и дополнительная подпись. Вот с ней агент и работает. Прошивку он ложит куда надо, а вот дополнительные блоки сразу сверяет и обрабатывает. Достаточно посмотреть обычный вариант и подписанный вариант файла. Там будет шапка и хвост.

Дампы подписаны целой цепочкой сертификатов. Скомпроментировать ее сложно. Основная задача - не допустить изменения этих разделов.
МТК не боялись до некоторого времени применять простые вариации xor по статичным ключам и подобного, в итоге, даже не зная ключа, но зная как устроена цепочка - простой inc/dec бита может порушить всё.
 
Прошивку он кладет в соответствующий раздел памяти уже без дополнительных блоков? Из доп. блоков формируется лишь содержимое seccfg, с которым работает прелоадер?

Но тогда содержимое самих разделов (например, recovery) в разных экземплярах телефонов должно быть одинаковым. Подписей, как сказано выше, там нет. Почему их нельзя переносить даже если в телефонах были одинаковые версии проишвок?
 

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

К примеру некоторые старые Huawei после прошивки с SD карты сами снимали проверку подписей, что позволяло вливать в них потом TWRP и кастомы. если же вливать что-то после флештула - получали кирпич
 
Назад
Верх Низ