реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Дырка в LPC bootloader (старые чипы), Наконец нашел время ее залатать
KRS
сообщение May 3 2007, 13:33
Сообщение #1


Профессионал
*****

Группа: Модераторы
Сообщений: 1 951
Регистрация: 27-08-04
Из: Санкт-Петербург
Пользователь №: 555



Как я уже говрил, и здесь раньше обсуждали.
В весиях bootloader до 1.64 (включительно) для чипов LPC_2114_2124_2119_2129_2194_2212_2214_2292_2294
есть дыра. Можно легко считать защищенный флешь

В филипс я письмо уже давно посылал, они ответили что выйдет новая ревизия чипа.
Для старых они похоже и не собираются исправлть бутлоадер.
В общем вот мое описание дыры:

В исследованном бутлоадере распределение памяти такое:

RAM:40000128 unsigned protection_flag
RAM:4000012C char recv_buf[70] сюда принимается команда
RAM:40000172 char cmd[15]; сюда
char param1[15]; происходит
char param2[15]; разбор
char param3[15]; по словам
char param4[15]; разделенными пробелом
RAM:400001BD char unsued[3];
RAM:400001C0 char* param_ptrs[5]={cmd,param1,param2,param3,param4}

При разборе команды первые 4 слова разделенные пробелом складываются по указателям param_ptrs, при этом длина макс 14 символов не проверяется!

После посылки строки
"1 2 3 123456789012345123456789012345678\x28\x01\"<CR><LF>
можно посылать команды бутлоадеру без ограничений.
(строка состоит из 39 символов, потом идет символ с кодом 0x28, символ с
кодом 0x01 и как любая команда завершается символами 13 10)
в ответ бутлоадер пришлет ответ 1 (INVALID COMMAND), но один из указателей, указывающий на буфер в который разбирается команда, будет указывать на переменную, которая хранит флаг защиты и следующей командой он будет затерт.
И следующей командой можно без проблем считать весь флеш!

Решение проблемы:
я подправил функцию разбора строки на параметры, при этом что бы было как можно меньше изменений пришлось пожертововать проверкой разделения параметров несолкькими пробелами
вот то что я изменил

Код
        CODE16
_parse_cmd                            ; CODE XREF: sub_400006BC+32p
                PUSH    {R4-R7}
                MOV     R12, R3
                LDRB    R3, [R0]
                MOV     R6, #0
                MOV     R4, #0
                CMP     R3, #0
                BNE     loc_4000120E
_e0:// вспомогательная метка                                
                MOV     R0, #0

loc_4000120A                          ; CODE XREF: _parse_cmd+4Aj
                POP     {R4-R7}
                BX      LR
; ---------------------------------------------------------------------------

loc_4000120E                          ; CODE XREF: _parse_cmd+Cj
                MOV     R5, #0
                B       loc_4000123E
; ---------------------------------------------------------------------------

loc_40001212                          ; CODE XREF: _parse_cmd+46j
                ADD     R3, R4, #1
                CMP     R3, R12
                BEQ     loc_40001242
                LDRB    R7, [R0,R5]
                CMP     R7, #0x20
                BEQ     loc_40001228
                LSL     R3, R4, #2
                LDR     R3, [R2,R3]
                STRB    R7, [R3,R6]
                ADD     R6, #1
                        cmp     R6, #15  // эти строки я добавил
                  bhs     _e0         //  добавлено
                B       loc_4000123C
; ---------------------------------------------------------------------------

loc_40001228                          ; CODE XREF: _parse_cmd+22j
                //ADD     R7, R0, R5      а эти удалил
                //LDRB    R7, [R7,#1]     и эту удалил
                nop//CMP     R7, #0x20       замена на NOP
                nop//BEQ     loc_4000123C   чтобы не изменилась длина
                LSL     R4, R4, #2
                LDR     R4, [R2,R4]
                MOV     R7, #0
                STRB    R7, [R4,R6]
                ADD     R4, R3, #0
                MOV     R6, #0

loc_4000123C                          ; CODE XREF: _parse_cmd+2Cj
                                      ; _parse_cmd+34j
                ADD     R5, #1

loc_4000123E                          ; CODE XREF: _parse_cmd+16j
                CMP     R5, R1
                BLE     loc_40001212

loc_40001242                          ; CODE XREF: _parse_cmd+1Cj
                ADD     R0, R4, #1
                B       loc_4000120A
; End of function _parse_cmd


В HEX файле апдейта бутлоадера изменилось 3 строчки

стока 34
Код
была
:1004000080C01FE040E0FF7F91A4D3D5EC04004002
стала
:1004000080C01FE040E0FF7F4F5C1D02EC04004015

здесь поменялалась контрольная сумма (используется при апдейте, для проверки)

И две строчки 259 и 260
Код
были
:1012100015E0631C634514D0475D202F04D0A30064
:10122000D3589F55013609E047197F78202F05D004
стали
:1012100015E0631C634514D0475D202F06D0A30062
:10122000D3589F55761C0F2EEED207E0C046C0461D

собственно сами изменения

Если кому нужно, прилагаю исправленный файл

Сделан на основе версии 1.63, к сожалению апдейта 1.64 нету

Сообщение отредактировал KRS - May 3 2007, 13:36
Прикрепленные файлы
Прикрепленный файл  patched_bootloader_update_ver_1_63_LPC_2114_2124_2119_2129_2194_2212_2214_2292_2294.rar ( 8.63 килобайт ) Кол-во скачиваний: 93
 
Go to the top of the page
 
+Quote Post
KRS
сообщение May 14 2007, 11:07
Сообщение #2


Профессионал
*****

Группа: Модераторы
Сообщений: 1 951
Регистрация: 27-08-04
Из: Санкт-Петербург
Пользователь №: 555



Сегодня на плату поставили LPC2129 из новой поставки, так там версия бутлоадера 1.65 в котором эта бага поправлена!
Go to the top of the page
 
+Quote Post
zltigo
сообщение May 14 2007, 12:54
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(KRS @ May 14 2007, 14:07) *
Сегодня на плату поставили LPC2129 из новой поставки, так там версия бутлоадера 1.65 в котором эта бага поправлена!

Уже 1.66 сваяли.
Новая фича:
Code Read Protection is a mechanism that allows user to enable different levels of
security in the system so that access to the on-chip Flash and use of the ISP can be
restricted. When needed, CRP is invoked by programming a specific pattern in Flash
location at 0x000001FC. IAP commands are not affected by the code read protection.
Three levels of CRP are implemented. CRP2 option is equivalent to CRP of previous
bootloader version.

И еще:
WRITE/ERASE SECURITY
In the NXP ARM based microcontroller, each flash sector can be secured against write/erase operation. This feature allows the application to secure the sensitive code/data against tempering. If the Code Read Protection feature is enabled then the sensitive code/data is also protected against unauthorized reads.

Сообщение отредактировал zltigo - May 14 2007, 13:02
Прикрепленные файлы
Прикрепленный файл  boot.loader.lpc2109.lpc2114.lpc2124.lpc2119.lpc2129.lpc2194.lpc2212.lpc2214.lpc2292.lpc2294.zip ( 159.86 килобайт ) Кол-во скачиваний: 2370
 


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
VslavX
сообщение May 14 2007, 13:48
Сообщение #4


embarrassed systems engineer
*****

Группа: Свой
Сообщений: 1 083
Регистрация: 24-10-05
Из: Осокорки
Пользователь №: 10 038



Цитата(zltigo @ May 14 2007, 15:54) *
Уже 1.66 сваяли.

Лучше бы NXP открыл механизм записи во флэш, чем ваял свои перманентно дырявые загрузчики.
(года 4 уже серии LPC, наверное) Сейчас потихоньку изучаю 2.11 (lpc214x и lpc213x) - "дырки" специально не ищу (все равно свой загрузчик будет с "честным" 28147/AES), но "макаронов" там изрядно, ИМХО. Будет неудивительно если и в 2.11 обнаружаться проблемы sad.gif
Go to the top of the page
 
+Quote Post
KRS
сообщение May 14 2007, 14:07
Сообщение #5


Профессионал
*****

Группа: Модераторы
Сообщений: 1 951
Регистрация: 27-08-04
Из: Санкт-Петербург
Пользователь №: 555



Цитата(zltigo @ May 14 2007, 16:54) *
Уже 1.66 сваяли.
Новая фича:
Code Read Protection is a mechanism that allows user to enable different levels of
security in the system so that access to the on-chip Flash and use of the ISP can be
restricted. When needed, CRP is invoked by programming a specific pattern in Flash
location at 0x000001FC. IAP commands are not affected by the code read protection.
Three levels of CRP are implemented. CRP2 option is equivalent to CRP of previous
bootloader version.

Спасибо за апдейт!!!

А в 1.65 тоже есть такие константы, в коде видел.
А где вы сам update нашли?
А то у NXP на сайте часто пробематично свежие документы найти.
Go to the top of the page
 
+Quote Post
zltigo
сообщение May 14 2007, 14:12
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(VslavX @ May 14 2007, 16:48) *
Лучше бы NXP открыл механизм записи во флэш,

А в чем особо великий смысл?
Цитата
Сейчас потихоньку изучаю 2.11 (lpc214x и lpc213x)

Уже пару недель, как 2.12. Навороты аналогичные.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
KRS
сообщение May 14 2007, 14:13
Сообщение #7


Профессионал
*****

Группа: Модераторы
Сообщений: 1 951
Регистрация: 27-08-04
Из: Санкт-Петербург
Пользователь №: 555



Цитата(KRS @ May 14 2007, 18:07) *
Спасибо за апдейт!!!

А в 1.65 тоже есть такие константы, в коде видел.
А где вы сам update нашли?
А то у NXP на сайте часто пробематично свежие документы найти.


Отвечу сам себе!
на NXP надо заходить и через
http://www.standardics.nxp.com/
там другие догументы выложены smile.gif
Go to the top of the page
 
+Quote Post
zltigo
сообщение May 14 2007, 14:16
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(KRS @ May 14 2007, 17:07) *
А где вы сам update нашли?
А то у NXP на сайте часто пробематично свежие документы найти.

Периодически здесь осматриваюсь
http://www.standardics.nxp.com/support/doc.../?type=software


Цитата(KRS @ May 14 2007, 17:13) *
на NXP надо заходить и через
http://www.standardics.nxp.com/
там другие догументы выложены smile.gif

Да, я уже здесь неоднократно туда посылал. Странно, конечно, что поглубже зарывают sad.gif


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
VslavX
сообщение May 14 2007, 15:28
Сообщение #9


embarrassed systems engineer
*****

Группа: Свой
Сообщений: 1 083
Регистрация: 24-10-05
Из: Осокорки
Пользователь №: 10 038



Цитата(zltigo @ May 14 2007, 17:12) *
А в чем особо великий смысл?

Не особо великий, но, ИМХО, некоторый смысл есть:
- каждый пишет свой загрузчик, какой захочет и с какими угодно "фичами" и "граблями". Наступание на "личные грабли" не так обидно и субъективно не так больно smile.gif
- защита от считывания получше - нет чужого бинарного кода. "Отличная" ситуация - поместили, например, ключи шифрования и ЭЦП по флеш, а их из-за свеженайденой "дыры" в чужом лоадере взяли и прочитали.
- возможность записи флеша небольшими кусочками по 16 байт - иногда это нужно. IAP же нас четко ограничивает 256 байтами снизу.
- время записи фрагмента 16 байт по идее должно быть меньше чем 256 (еще практически не проверял) - улучшается реал-тайм, поскольку период запрещенных прерываний короче (да, обработчики в RAM иногда могут частично помочь, но нафига костыли, если можно полностью вылечиться?)
Все это можно сделать и сейчас, но - "неофициально" и с некоторым риском. Для NXP может оно так и проще, а вот мне как клиенту - нет. Как-никак, это некоторое ограничение свобод smile.gif
Цитата(zltigo @ May 14 2007, 17:12) *
Уже пару недель, как 2.12. Навороты аналогичные.

Не поделитесь ли .hex или .bin для 2.12?
Go to the top of the page
 
+Quote Post
zltigo
сообщение May 14 2007, 15:40
Сообщение #10


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(VslavX @ May 14 2007, 18:28) *
Не особо великий, но, ИМХО, некоторый смысл есть:
- каждый пишет свой загрузчик, какой захочет и с какими угодно "фичами" и "граблями". Наступание на "личные грабли" не так обидно и субъективно не так больно smile.gif

В новом вообще есть возможнось закрытия входа в родной загрузчик по P0.14.
Цитата
Не поделитесь ли .hex или .bin для 2.12?

Ссылку на все новое на их сайте давал выше.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
VslavX
сообщение May 14 2007, 15:50
Сообщение #11


embarrassed systems engineer
*****

Группа: Свой
Сообщений: 1 083
Регистрация: 24-10-05
Из: Осокорки
Пользователь №: 10 038



Цитата(zltigo @ May 14 2007, 18:40) *
В новом вообще есть возможнось закрытия входа в родной загрузчик по P0.14.

Нормально, значит клиенты их хоть в чем-то "дожали" и проблема безопасности не является надуманной.
Цитата(zltigo @ May 14 2007, 18:40) *
Ссылку на все новое на их сайте давал выше.

Спасибо, я 2.12 как-то там пропустил.
Go to the top of the page
 
+Quote Post
Ykidia
сообщение May 16 2007, 04:08
Сообщение #12


Частый гость
**

Группа: Свой
Сообщений: 80
Регистрация: 3-08-06
Пользователь №: 19 287



Цитата
Лучше бы NXP открыл механизм записи во флэш, чем ваял свои перманентно дырявые загрузчики.

А что тут открывать-то? Вот тут все достаточно подробно разъяснено.
Однако написание своего загрузчика, использующего недокументированные особенности микроконтроллера, чревато возможной его неработоспособностью уже в следующих партиях микроконтроллеров. Ведь не факт, что Philips, так "клёво" документирующая свою продукцию, обязательно изменит ревизию кристалла или как-то по-другому отличит его от других при изменении того же периферийного модуля работы с внутренним flash
Go to the top of the page
 
+Quote Post
KRS
сообщение May 16 2007, 05:20
Сообщение #13


Профессионал
*****

Группа: Модераторы
Сообщений: 1 951
Регистрация: 27-08-04
Из: Санкт-Петербург
Пользователь №: 555



Цитата(Ykidia @ May 16 2007, 12:08) *
А что тут открывать-то? Вот тут все достаточно подробно разъяснено.
Однако написание своего загрузчика, использующего недокументированные особенности микроконтроллера, чревато возможной его неработоспособностью уже в следующих партиях микроконтроллеров. Ведь не факт, что Philips, так "клёво" документирующая свою продукцию, обязательно изменит ревизию кристалла или как-то по-другому отличит его от других при изменении того же периферийного модуля работы с внутренним flash

Пролема то как раз не в функциях записи во флеш!
А в самом загрузчике, к сожалению они занимают одну страницу во флеше. И не просто поменять только код передачи данных не трогая запись во флеш!
И второая проблема неизвестно сколько времени будет выполняться запись, и нельзя параллельно выполнять код или прерывания обрабатывать... т.е. проблемы с обновелнием данных во время работы программы.
Go to the top of the page
 
+Quote Post
IgorKossak
сообщение May 19 2007, 08:20
Сообщение #14


Шаман
******

Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221



Цитата(KRS @ May 16 2007, 08:20) *
Пролема то как раз не в функциях записи во флеш!

Вот именно!
Например нам необходимо иметь шифрующий загрузчик (AES, 3DES), чтобы не давать в сервис-центры открытых хексов.
Добавлять такой загрузчик к имеющемуся - слишком жирно, а вот написать свой не трогая самой процедуры записи во флеш - это то что нужно.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st July 2025 - 23:45
Рейтинг@Mail.ru


Страница сгенерированна за 0.01498 секунд с 7
ELECTRONIX ©2004-2016