|
|
  |
Защита секция кода во FLASH в ATmega, Как защититься от несанкционированного выполнения кода |
|
|
|
Feb 15 2008, 18:12
|
Знающий
   
Группа: Свой
Сообщений: 543
Регистрация: 22-10-05
Пользователь №: 9 984

|
Цитата(galjoen @ Feb 15 2008, 18:39)  Не хотел никого обидеть. Я имел в виду, что хакеров-крекеров и так хватает. Это они в программах (для компьютера) таким способом защиту кода с помощью CRC ломают. И мою защиту так сломали (когда-то давным-давно когда я еще молодой-неопытный был). Я бы на вашем месте гордился ,далеко не каждая прога заслуживает того ,что бы ее ломали. _PashaДумаю достаточно просто перед самим SPM повторно проверить наличие команды типа WRITE_EN . У меня за год еще не разу бутлоадер не снес страницу ,а вот фузы - было один раз такое дело,нарерное из за того ,что там выполняемый код гораздо короче.
|
|
|
|
|
Feb 15 2008, 20:10
|
Знающий
   
Группа: Свой
Сообщений: 841
Регистрация: 10-05-07
Из: Чебоксары (Россия)
Пользователь №: 27 640

|
Цитата(bodja74 @ Feb 15 2008, 21:12)  Думаю достаточно просто перед самим SPM повторно проверить наличие команды типа WRITE_EN . У меня за год еще не разу бутлоадер не снес страницу ,а вот фузы - было один раз такое дело,нарерное из за того ,что там выполняемый код гораздо короче. WRITE_EN - это что за зверь? Код который в SPMCR пишется? Так "запись в младшие пять разрядов регистра SPMCR значений, отличных от 10001, 01001, 00101, 00011, 00001 не вызывает никакого эффекта". Т.е. команда spm и так не запустится. А если это код конкретной операции, и на каждую у вас своя команда spm - это не лучший вариант. ИМХО желательно, чтоб во всей FLASH всего 1 команда spm была - кол-во аварийно опасных при случайном изменении PC команд меньше будет. Цитата(zltigo @ Feb 15 2008, 22:22)  Да. Там меньше 45ns нет. Но может и потом появиться - просто атмел приятный сюрприз сделать хочет. А если xmega с периферией на половинной работать будет - кому тогда она нужна? Неужто атмел это не понимает.
|
|
|
|
|
Feb 15 2008, 20:32
|
Знающий
   
Группа: Свой
Сообщений: 543
Регистрация: 22-10-05
Пользователь №: 9 984

|
Цитата(galjoen @ Feb 16 2008, 00:10)  WRITE_EN - это что за зверь? Код который в SPMCR пишется? Нет ,допустим WRITE_EN - это команда принятая бутом например с компа ,и дает возможность перейти на подпрограмму загрузки и записи страницы флеш ,если ее опять профиксить перед самой SPMSR дающей команду на запись страницы в результате даже если мы случайно туда попадем - записи не будет. Цитата Так "запись в младшие пять разрядов регистра SPMCR значений, отличных от 10001, 01001, 00101, 00011, 00001 не вызывает никакого эффекта". Это Вы мне ?
|
|
|
|
|
Feb 15 2008, 22:38
|

кекс
     
Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326

|
Цитата(SasaVitebsk @ Feb 15 2008, 23:55)  Например на половинной скорости читать две команды, а исполнять по очереди. Ни конвеер ни кэш для такой системы не нужен. Хотя реализуется, естественно, сложнее.  Дык, по теории - это уже конвеер.. Цитата(_Pasha @ Feb 15 2008, 17:30)  Как защититься от случайного выполнения записи в boot-loader. .... Код ... OUT SPMCR,R16 SPM CLR NullReg 3. Как безопасно запихнуть в стек адрес входа ? Вопрос открытый, хотя я загружал с порта в теле команды для записи страницы. Некрасиво, но луше не придумал. Это фигня и в реальной жизни не спасет на самом деле. Представьте, что в слуйчайный момент времени, в R16 находится случайное значение и происходит случайный прыжек на sequence OUT SPMCR, R16 SPM и страница флеш отъехала. Вывод - по настоящему защититься от слета флеш памяти можно: 1. удалив из кода все SPM команды. 2. проверять целостность программы и восстанавливать ее.
|
|
|
|
|
Feb 16 2008, 07:15
|
;
     
Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509

|
Цитата(defunct @ Feb 16 2008, 01:38)  и происходит случайный прыжек на sequence OUT SPMCR, R16 SPM Дык я поэтому такой оптимистичный, что R16 перед этим колбасили так, что правильной команды spmcr не дождется  Цитата Вывод - по настоящему защититься от слета флеш памяти можно: 1. удалив из кода все SPM команды. .... Нет,понятно, что лучшее средство от седины - это лысина.  Вопрос только о снижении вероятности налета на разрешенный spm. Т.е. юзать 4-х тактовый зазор. Вот теперь понимаю свой просчет. Наверное, аукнется. Надо было, к примеру так: Код Somewhere: LDI R17,Spmcr_value; abstract command MOV R18,R17 NEG R18 LDI R19,2 SUBI R18,2 Fl_write_by_boot: COM NullReg; assuming ==0 just before this cmd RET; pre-initialized stack content HERE
; the following procedure has no entry point FL_write_entry: MOV R16,R17 AND NullReg,R16 OUT SPMCR,Nullreg ;*** adding validation rules *** ADD NullReg,R18; decrease overall probability ADD NullReg,R19; to uneven spm enables BRNE PC+2 SPM CLR NullReg Короче, жаль, что 1 такт съелся переходом А еще можно привязаться, например, к тикающему таймеру. И пытаться код команды в SPMCR считать оттуда. 2 bodja74: Спасибо, мне все ясно. 2 all: Вот я считаю, что при соблюдении вышеозначенного порядка действий и достаточной сложности ( вопрос открытый) инициализации вероятность налета на грабли можно снизить. Конкретнее скажу после инъекций забытой теории вероятности.  P.S. Насчет безопасного формата данных cpi Rd,K - отдельное спасибо. Вот в пиках, например, такая фича архитектурой задана.
Сообщение отредактировал _Pasha - Feb 16 2008, 07:22
|
|
|
|
|
Feb 16 2008, 11:21
|

Местный
  
Группа: Участник*
Сообщений: 323
Регистрация: 11-02-08
Пользователь №: 34 947

|
[ Цитата(Непомнящий Евгений @ Feb 15 2008, 08:24)  требуют полного знания ассемблера А Вы что ? Когда пишите программу не утруждаете себя детальнейшим изучением архитектуры MCU, одной из составляющей которой является система команд процессора..А? Я например не напишу ни строчки кода пока не буду уверен, что досконально понимаю архитектуру MCU Цитата(galjoen @ Feb 15 2008, 14:20)  Т.к. сам всегда CRC32 FLASH в основном цикле считаю (по слову за раз - см. мои предыдущие посты). Но ни разу не сработало. А я случайные джампы ловил.. Достаточно потрыкать пьезозажигалкойс присоединённым в её "жалу" проводом Цитата(_Pasha @ Feb 16 2008, 00:56)  А как ее пофиксить за 4 такта ? Писал же уже выше...Но Вы видно не читатель..Повторю для Вас: OUT R17 , SPMCR ;--------------- SBRS R16 , 7 ; Проверяем флаг запроса на запись RJMP CRASH ;----------------- SPM
--------------------
После устранения бага в программе она стала работать....хуже
|
|
|
|
|
Feb 16 2008, 12:12
|
Знающий
   
Группа: Свой
Сообщений: 841
Регистрация: 10-05-07
Из: Чебоксары (Россия)
Пользователь №: 27 640

|
Цитата(bodja74 @ Feb 15 2008, 23:32)  Нет ,допустим WRITE_EN - это команда принятая бутом например с компа ,и дает возможность перейти на подпрограмму загрузки и записи страницы флеш ,если ее опять профиксить перед самой SPMSR дающей команду на запись страницы в результате даже если мы случайно туда попадем - записи не будет. 1. А если мы попадем уже после этой самой проверки? 2. Команду на запись страницы во FLASH не запись в регистр SPMSR даёт, а команда spm. Запись в регистр SPMSR влияет только на то, что по spm делаться будет. Цитата(_Pasha @ Feb 16 2008, 00:56)  А как ее пофиксить за 4 такта ? Если мы просто сравним один байт - этой защите грош цена, т.к. вероятность попадалова практически не изменяется. Если не трудно, проиллюстрируйте. Вот: Цитата(galjoen @ Feb 15 2008, 14:20)  Если предположить, что аварийно опасных команд 8 шт. А у R17, в остальных частях программы, значения от 0 до FF равновероятны. То вероятность "не попорчивания" FLASH при случайном прыжке для AVR с 128 кБайт памяти будет: (1-(8/65536)/256)*100%=99.9999523%. Что существенно выше, чем надёжность CRC16 с производящим многочленом 0x11021, которая составляет 99.9984% для пакетов данных длиной более 17 бит (Р.Л. Хаммел "Последовательная передача данных"). Пример кода там-же. Конечно если вы вероятность срабатывания защиты в 99.9999523% и в грош не ставите - тогда я пас.
|
|
|
|
|
Feb 16 2008, 12:16
|

Местный
  
Группа: Участник*
Сообщений: 323
Регистрация: 11-02-08
Пользователь №: 34 947

|
Цитата(defunct @ Feb 16 2008, 01:38)  Это фигня и в реальной жизни не спасет на самом деле. Представьте, что в слуйчайный момент времени, в R16 находится случайное значение и происходит случайный прыжек на sequence OUT SPMCR, R16 SPM и страница флеш отъехала. А если подумать головой? RJMP CRASH ;-------------- Input_in_Code_Writing : OUT R17 , SPMCR ;--------------- SBRS R16 , 7 ; Проверяем флаг запроса на запись RJMP CRASH ;----------------- SPM Т.е. чтобы записать страницу мало того нужно войти в процедуру в строго определённой точке... Да плюс к тому ещё нужно чтоб флаг разрешения записи (не аппаратный, а программный) был выставлен. А его выставляет совсем другой поток. И он(этот флаг) автоматом сбрасывается по тайм-ауту.. Так что....Ещё раз повторю: думать надо прежде чем писать программу Цитата(_Pasha @ Feb 16 2008, 00:56)  А как ее пофиксить за 4 такта ? Если мы просто сравним один байт - этой защите грош цена, т.к. вероятность попадалова практически не изменяется. В корне не согласен. Чтоб вероятность того, что одновременно в некотором байте будет записано строго определённое число (которое к тому же записывается туда на короткое время) и то что проц прыгнет точно в точку входа в процедуру записи мизерна (конечно если программу правильно спроектировать)
--------------------
После устранения бага в программе она стала работать....хуже
|
|
|
|
|
Feb 16 2008, 12:22
|
Знающий
   
Группа: Свой
Сообщений: 841
Регистрация: 10-05-07
Из: Чебоксары (Россия)
Пользователь №: 27 640

|
Цитата(Дон Амброзио @ Feb 16 2008, 15:16)  RJMP CRASH ;-------------- Input_in_Code_Writing : OUT R17 , SPMCR ;--------------- SBRS R16 , 7 ; Проверяем флаг запроса на запись RJMP CRASH ;----------------- SPM Т.е. чтобы записать страницу мало того нужно войти в процедуру в строго определённой точке... Да плюс к тому ещё нужно чтоб флаг разрешения записи (не аппаратный, а программный) был выставлен.
А его выставляет совсем другой поток. И он(этот флаг) автоматом сбрасывается по тайм-ауту.. В принципе согласен. Только я бы переписал это так: RJMP CRASH ;-------------- Input_in_Code_Writing : OUT R17 , SPMCR ;--------------- CPI R16 , 1<<7 ; Проверяем флаг запроса на запись BRNE CRASH ;----------------- SPM В этом случае вероятность срабатывания защиты в 128 раз повышается. См. мой предыдущий пост. А тактов - столько-же.
|
|
|
|
|
Feb 16 2008, 12:44
|

Местный
  
Группа: Участник*
Сообщений: 323
Регистрация: 11-02-08
Пользователь №: 34 947

|
Цитата(galjoen @ Feb 15 2008, 14:20)  А у R17, в остальных частях программы, значения от 0 до FF равновероятны. А если проверять перед записью не один регистр, а два, то вероятность случайной записи можно уменьшить в 65536 раз Пример код RJMP CRASH ;---------------- OUT SPMCR , R16 ;---------------------- ; Проверяем, а допустима ли запись CP R17, R18 ; 2 контрольных регистра разрешения записи BREQ PC+0x02 RJMP CRASH ;----------------- SPM Вот и посчитаёте: какова вероятность, что в обоих регистрах R17 и R18 будет записано одно и тоже число Цитата(defunct @ Feb 16 2008, 15:19)  Ваш код тоже не дает 100% гарантии защиты от перетирания флеша. Т.е. из-за 99,99% Вы и напрягаться не будете , чтоб подумать? Цитата(defunct @ Feb 16 2008, 15:19)  вероятность того что программный флаг при случайном прыжке взведен - 50%. Это как написать программу, можно вообще сделать 100%. А у меня это вероятность менее 1% Цитата(defunct @ Feb 16 2008, 15:11)  когда девайс слетает, и стоишь перед фактом ехать в командировку в мухосранск  , оптимизм быстро пропадает... Вот вот... И я про тоже.... Как замаячит такая перспектива я лучше "сломаю голову" над программой сидя дома за письменным столом, чем потом кайфовать где-нибудь на Таймыре или Чукотсуом полуострове срочно исправляя глючащее устройствоЦитата(Дон Амброзио @ Feb 16 2008, 15:36)  Вот вот... И я про тоже.... Как замаячит такая перспектива я лучше "сломаю голову" над программой сидя дома за письменным столом, чем потом кайфовать где-нибудь на Таймыре или Чукотсуом полуострове срочно исправляя глючащее устройство Потому что заказчику не объянишь, что это мол я не сделал ни каких программных защит-ловушек из -за того, что это: "слижком сложно", что "СИ-компилятор не поддерживает такие конструкции" Но зато "счастливого" владельца глючящего девайса можете утешить тем, что программа написана на языке высокого уровня СИ (во крута ) и что она переносима и не привязана к конкретным архитектурным особенностям данного процессора
--------------------
После устранения бага в программе она стала работать....хуже
|
|
|
|
|
  |
4 чел. читают эту тему (гостей: 4, скрытых пользователей: 0)
Пользователей: 0
|
|
|