|
|
  |
Защита секция кода во FLASH в ATmega, Как защититься от несанкционированного выполнения кода |
|
|
|
Feb 17 2008, 21:21
|

фанат дивана
     
Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684

|
Цитата(WHALE @ Feb 18 2008, 02:13)  А на практике все таки,как убедиться,что все процессы живы,а не весело щёлкаете WDR и глухо висите Например, завести набор флажков. При WDR сбрасывать. А в каждом критичном месте программы - взводить свой флажок. При очередном сбросе WDR - проверить, все ли флажки взведены. Если не все, то висим. Можно усложнить, ждать взвода флажков несколько циклов.
--------------------
Если бы я знал, что такое электричество...
|
|
|
|
|
Feb 17 2008, 21:42
|
дятел
    
Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065

|
Цитата(WHALE @ Feb 18 2008, 00:13)  А на практике все таки,как убедиться,что все процессы живы,а не весело щёлкаете WDR и глухо висите а на практике, делаем примерно так: при загрузке определяем источник ресета, если было не от power on , то регестрируем ошибку., делаем заглушки на все незадействованные прерывния(если есть связь с верхом то предаем это на верх ), запускаем автомат контроля использования стека/рам, запускаем автомат контроля использования текущего размера системного тика.... дальше просто работаем, и что удивительно, все контролируем...
|
|
|
|
|
Feb 17 2008, 22:05
|
Гуру
     
Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823

|
Цитата(WHALE @ Feb 17 2008, 20:32)  А в не жестких?Для обычных девайсов на чем-нить дешевом без всяких излишеств,зависон которых не приведет к пожарам/взрывам,но которые тоже хочется как-нить защитить от слетов при ударах молнии,бросков питания и т.д?Я из треда пока уловил одну здравую мысль-сброс собаки делать в специальном самом низкоприоритетном потоке(я тупо сбрасывал до сих пор в системном таймере  ). Ну, недостаток сброса в системном таймере неоднократно обсуждался (например, получение команды HALT. Не знаю правда, есть ли она в AVR  - уже привито ). Я обычно использую достаточный минимум - в системном прерывании взводится флаг, в основном кольце по этому флагу непосредственно сбрасывается WDT. Вообще-то я хотел написать, что для обычных дивайсов следует идти не от умозрительных заключений об успешной или неуспешной ловле сбойных состояний, а стандартном тестировании приборов по стандартным методикам. Если доктор прав, и вероятность сбоя в нормальных условиях десять в минус восьмой, то программными извращениями можно ее улучшить на порядок или ухудшить на порядок - и при этом ничего не почувствовать. "Опыт - критерий истины". Все удары молнии, броски по питанию и прочие неприятности давно уже стандартизованы. Протестили - и вперед. А программирование - никакое это не искусство, и это такое среднее ремесло, давно уже привлекающее только тех, кто больше ничего делать не умеет. На этой высокой ноте разрешите пойти спать. Цитата(singlskv @ Feb 18 2008, 01:42)  при загрузке определяем источник ресета, если было не от power on , то регестрируем ошибку., Зачем же? На практике можно продолжить работу - подумаешь, сброс прошел? Работать! Вернуться на то же место. Не под ОС, конечно
--------------------
Уходя, оставьте свет...
|
|
|
|
|
Feb 17 2008, 22:20
|
дятел
    
Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065

|
Цитата(Dog Pawlowa @ Feb 18 2008, 01:05)  Зачем же? На практике можно продолжить работу - подумаешь, сброс прошел? Работать! Вернуться на то же место. Не под ОС, конечно  Дык, конкретно здесь, только для того что бы знать что оно было, если в рамках поставленной задачи нам пофиг, было или нет, мы можем просто проигнорировать.... а если не пофиг, можем и запомнить....что был сбой ....
|
|
|
|
|
Feb 17 2008, 23:39
|

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

|
Цитата(bill_vs @ Feb 16 2008, 18:56)  Подскажите, пожалуйста, как Вы определили, что сбился PC, а не R16? Согласен...Мог и R16 сбитцо..Мог и SREG_Z... Была ещё такая тестовая прога: ; Зажечь светодиод ldi R16 , 0b11011111 out PortC , R16 ;------------------ Loop: cli wdr rjmp Loop ;--------------- Crash: ; Погасить светодиод ldi R16 , 0b11111111 out PortC , R16 rjmp Loop ;--------------------------- rjmp Crash rjmp Crash rjmp Crash rjmp Crash ..... rjmp Crash rjmp Crash rjmp Crash rjmp Crash ;------------------------------ При испытаниях вначале светодиод горел... Пять минут...После того как я потрыкал пьёзозажигалкой светодиод погас... Трыкал ещё...И один раз (за целый день "издевательств" мне удалось обратно зажечь светодиод Цитата(Baser @ Feb 16 2008, 21:08)  Да какое потребителю дело, какое количество сбоев происходит в купленной им системе и какое количество сбоев система фиксирует. Ему также всё равно на каком языке написана программа, зашитая в девайсе. Ему важно только чтоб девайс выполнял возлагаемые на него функции с требуемой степенью надёжности. И потребителю всё равно, что выбранный Вами СИ-компилятор не поддерживает те или иные конструкции. И потребителю не скажешь (когда выясниться, что произошёл сбой из-за того, что программное обеспечение не обнаружило случайный джамп в область данных во флэшь): "реализовать программные защиты для меня было слишком сложно - поэтому я их вообще не делал" Цитата(Baser @ Feb 16 2008, 21:08)  отсутствие последствий внутренних сбоев. Дык вот это и должна хотя бы пытаться сделать программа. А чтобы это сделать она должна по-крайней мере обнаружить, что сбой имеет место Цитата(Baser @ Feb 16 2008, 21:08)  А обеспечить отсутствие последствий сбоев чисто программными методами невозможно. Ещё один мне "Америку открывает"  Повторяетесь , Господа.. По кругу уже начинаем топтаться. Повторяю для "не четателей а писателей": я ниразу не отрицал необходимости впервую очередь аппаратных решений для обеспечения надёжностиЦитата(Baser @ Feb 16 2008, 21:08)  Взрослый человек утверждает, что применяет десятки различных методов программных защит, хранит несколько копий прошивки во флеш и т.д. и т.п. Напрашивается вывод: судя по всему, вам платят по часам, а не по конечному продукту и никто не ограничивает вас во времени разработки. А Вам за что платят деньги? За то, что Вы штампуете посредственные программы? Зато быстро? А что? Для Вас очень затруднительно написать прогу с обнаружением и разруливанием сбоев? Тогда я вообще не понимаю за что Вам платят деньги Цитата(Baser @ Feb 16 2008, 21:08)  От реалий рынка все это крайне далеко. А реалии рынка - эта гнать вал? Т.е. не нормальные программы, а, простите, посредственное фуфло? И что? Есть люди, которые за это фуфло ещё готовы платить деньги? Цитата(Baser @ Feb 16 2008, 21:08)  Иначе писать программы за реальное время по вашим методам просто невозможно.
.... Все же остальное, это, как я уже писал, или искусство ради искусства, или что-то, напоминающее маниакальную фобию. Если для Вас это всё слишком сложно, то почему Вы вообще работаете в области эмбедерства? Может лучше носками торговать? Цитата(arttab @ Feb 16 2008, 21:36)  и если что то сбойнет с последствиями, то Вы долго будите колотить себя пяткой в грудь, что это было внешнее воздействие, плохое заземление, слабая защита от грозы и помехи по питанию. Вот поэтому я "соломки подстелю" в виде спец. организации проги, чтобы сбои были по максимуму обнаружены и устранены их отрицательные последствия... Ибо какой бы у Вас супернадёжный девайс не был, лучше перебдеть, чем недобдеть. Да, "программные методы" не дают 100% гарантии обнаружения сбоя. А из-за 99,99% Вы и "мараться не будете"? Цитата(Dog Pawlowa @ Feb 18 2008, 01:05)  Зачем же? На практике можно продолжить работу - подумаешь, сброс прошел? Во-во.... Я бы инженеров с таким подходом на версту бы не подпустил к разработке..Пусть лучше трусами торгуют.. Цитата(singlskv @ Feb 17 2008, 19:06)  адепты проверки всего и вся так еще и не ответили на часть моих вопросов, хотелось бы услышать например про защиту кода при использовании 32бит команд.... А если подумать? Или Вы задаёте этот вопрос, просто чтоб продемонстрировать, что "против лома нет приёма"?. И что? Да..Это действительно тот случай, когда "против лома нет приёма".. Я же Вам уже говорил..И не один раз.. Что программа не может обнаружить 100% всех возможных сбоев.. Тогда к чему Ваш вопрос? Цитата(Дон Амброзио @ Feb 18 2008, 02:30)  Или Вы задаёте этот вопрос, просто чтоб продемонстрировать, что "против лома нет приёма"?. И что? Да..Это действительно тот случай, когда "против лома нет приёма".. Я же Вам уже говорил..И не один раз.. Что программа не может обнаружить 100% всех возможных сбоев.. Тогда к чему Ваш вопрос? Вот например Вы если будете знать, что Вам 100% на голову свалиться или плита или кирпич. От кирпича Вас может спасти каска, а от плиты..уж извините...Ничего не поможет... И что? Вы даже каску не оденете следуя Вашей логике, которую Вы тут всем пытаетесь навязать.. Да?
--------------------
После устранения бага в программе она стала работать....хуже
|
|
|
|
|
Feb 17 2008, 23:46
|

Просто Che
    
Группа: Свой
Сообщений: 1 567
Регистрация: 22-05-07
Из: ExUSSR
Пользователь №: 27 881

|
Цитата(Дон Амброзио @ Feb 18 2008, 01:30)  А Вам за что платят деньги? За то, что Вы штампуете посредственные программы? Зато быстро? Вы удивительно догадливы, именно за это  За одним мааааленьким исключением: пока еще никто на качество моей работы не жаловался. А вот на скорость - да, бывает  говорят, нужно быстрее. Цитата А что? Для Вас очень затруднительно написать прогу с обнаружением и разруливанием сбоев? Тогда я вообще не понимаю за что Вам платят деньги См. выше Цитата Если для Вас это всё слишком сложно, то почему Вы вообще работаете в области эмбедерства? Может лучше носками торговать? Да вот, виноват  мозгами вышел, скучно мне носки продавать. Лааадно! Пора спать
|
|
|
|
|
Feb 18 2008, 01:49
|

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

|
Цитата(_Pasha @ Feb 17 2008, 10:58)  для чего сваять простенькую модель: Код while(1) { _IJMP(random(0xffff));// *) } Методика: 1. забили весь флеш, чтобы 0xFF было минимум. 2. Запомнили CRC 3. ставим эту байду на несколько часов 4. Отвечаем 2 defunct ВОПРОС О СОСТОЯТЕЛЬНОСТИ МОДЕЛИ: покакит ли это все с псевдослучайными числами с нормальным распределением? Очень жду комментариев. Не покатит. После первого же IJMP, возврата в while(1) не будет, а к сожалению генератор псевдо-случайных чисел будет давать всегда одно и то же число, с высокой долей вероятности - безопасное. Поэтому модель лучше сделать такой: 1. random'ом или перебором заполнять регистры. 2. делать ICALL внутрь функции в которой выполняется SPM Результат могу сразу сказать - рано или поздно - свалится
|
|
|
|
|
Feb 18 2008, 07:22
|

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

|
Цитата(defunct @ Feb 18 2008, 04:49)  Поэтому модель лучше сделать такой: 1. random'ом или перебором заполнять регистры. 2. делать ICALL внутрь функции в которой выполняется SPM Результат могу сразу сказать - рано или поздно - свалится  Была ещё такая тестовая прога: ; Зажечь светодиод ldi R16 , 0b11011111 out PortC , R16 ;------------------ Loop: cli wdr rjmp Loop ;--------------- Crash: ; Погасить светодиод ldi R16 , 0b11111111 out PortC , R16 rjmp Crash ;--------------------------- rjmp Crash rjmp Crash rjmp Crash rjmp Crash ..... rjmp Crash rjmp Crash rjmp Crash rjmp Crash ;------------------------------ Максимум на 10 "трыке" пьзозажигалки светодиод гас. Если "удачно" подключить к корпусу девайса проводок, идущий от "земли" пьезозажигалки и "удачно" приложить точку приложения искры. Вот и говорите после этого, что порча PC маловероятна
Сообщение отредактировал Дон Амброзио - Feb 18 2008, 07:24
--------------------
После устранения бага в программе она стала работать....хуже
|
|
|
|
|
Feb 18 2008, 07:26
|
;
     
Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509

|
Цитата(defunct @ Feb 18 2008, 04:49)  Поэтому модель лучше сделать такой: 1. random'ом или перебором заполнять регистры. 2. делать ICALL внутрь функции в которой выполняется SPM Результат могу сразу сказать - рано или поздно - свалится  Спасибо, уже дошло. Остановлюсь на чуть исправленном вариантеА еще интересно, как это Доктор так лихо чиркает пьезоспичкой, что у него все стабильно сбивается. Вчера вечером чиркал-чиркал -- все нормально. Доктор, Вы случаем эти киловольты на корпус не наводите ? Блин, пока писал, Доктор уже сам ответил. Так вот, когда нормы ESD sensitivity нарушаются, то к чему камлания? Явно же ж кто-то виноват. А подвиг одного, как известно, - это преступление другого. И что самое печальное - паранойя не только профессиональная болезнь, она еще и заразная.
Сообщение отредактировал _Pasha - Feb 18 2008, 07:32
|
|
|
|
|
Feb 18 2008, 07:32
|
Местный
  
Группа: Свой
Сообщений: 278
Регистрация: 18-01-05
Из: Санкт-Петербург
Пользователь №: 2 031

|
Цитата Была ещё такая тестовая прога: По проге: 1 .А вы там случаем DDRC не забыли проинициализировать? 2. И ещё зачем там в цикле CLI? Понятно было бы перед циклом, но в цикле не очень понятно. Это тоже с каким то тестированием связано? Просто эти мелочи позволяют соменению закрасться. По поводу защиты от "случайных" jump: Допустим наша программа состоит из блоков Check - это всяческие проверки о которых тут писалось и блока Run - в этом блоке выставляются управляющие сигналы, действия которых нельзя отменить(ну к примеру "Пуск ракеты" это всё конечно утрировано). В итоге получим Код if(Check){ Run } В результате случайного джампа мы попали в Run.... Конструкция Код if(Check){ Run if(!Check) отменить Run } не покатит в силу специфики применения. Т.е. в этом случае задача всё таки нерешаемая или я не прав? Конечно если программа будет на 99,(9) % состоять из Check, а оставшаяся часть будет Run всё равно будет ненулевая вероятность пуска ракеты. P.S. Дон Аброзио, если не составит большого труда и это не является большим секретом могли бы показать стандартную обвязку вашего MCU(цепи питания, резета, развязка входов выходов)? Eстесно готовые схемы не надо. Просто в общем виде типа как в апп ноте рисуют. А то получается вы всегда приводите программу без схемы и говорите что сбоит программа, а может дело то и не в бобине.
|
|
|
|
|
Feb 18 2008, 07:59
|

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

|
Цитата(Дон Амброзио @ Feb 18 2008, 10:22)  Была ещё такая тестовая прога ... На основании этх тестов я понял, что всё же лучше попытаться обнаруживать в программе эти случайные джампы. После этого я решил проверить "а как же с ОЗУ? Оно не портиться?" И модифицировал прогу так, что она у меня непрерывно совершала тест ОЗУ. "А как же порча ячеек FLASH?" - подумал я. Короче, сделал и непрерывный тест флэшь. Короче у меня крутились 2 потока и ядро RTOS. Один поток непрерывно тестил ОЗУ, другой флэшь. И плюс оба потока были "сконструированы" так, что обнаруживали (разумеетцо не со 100% вероятностью) случайные дампы. Выяснилось, что: а) Чаще всего проц вываливался на обработчик случайного джампа б) Потом на обработчик порчи ОЗУ в) На обработчик порчи флэша (после проверки флэщи программатором выяснялось, что на самом деле флэшь не портилась, а переход на обработчик вызывался порчей ОЗУ во время теста флэшь) Хотя конечно нельзя утверждать со 100%-й уверенностью, что переход на соотвествующий обработчик сбоя был вызван соответствующей ему причиной. Например переход на обработчик порчи ОЗУ запросто мог быть вызван случайным джампом. Хоть это и менее вероятно (за счёт того, что у меня программа организована специальным образом + некоторые аксиомы по вероятности, которыми я руководствовался), но исключить такую вероятность нельзя Цитата(_Pasha @ Feb 18 2008, 10:26)  Так вот, когда нормы ESD sensitivity нарушаются, то к чему камлания? А что? Реальные помехи просто обязаны подчиняться нормам ESD  А то их в тюрьму посадят если они нарушат нормы ESD? Цитата(_Sam_ @ Feb 18 2008, 10:32)  По проге: 1 .А вы там случаем DDRC не забыли проинициализировать? Не забыл.. Иначе бы светодиод не зажёгся... Кстати , да... Погасание светодиода в конкретно этой программе могло быть вызвано и случайным изменением PortC, ddrC... А вообще у меня была куча различных тестовых программ (всех вариантов и не упомнишь) . Поэтому я в своих примерах на форуме пишу только часть кода, из которой можно понять основную идею теста Цитата(_Sam_ @ Feb 18 2008, 10:32)  2. И ещё зачем там в цикле CLI? Понятно было бы перед циклом, но в цикле не очень понятно. Это тоже с каким то тестированием связано?
Просто эти мелочи позволяют соменению закрасться. Может это и паранойа (как некоторые выражаются) но для надёжности. Я всегда так пишу когда мне нужен гарантированный программный СТОП. И написать однц 1-тактовую команду меня не сильно затрудняет. Так же как процессор не сильно затрудняет её выполнить Цитата(_Sam_ @ Feb 18 2008, 10:32)  По поводу защиты от "случайных" jump: Допустим наша программа состоит из блоков Check - это всяческие проверки о которых тут писалось и блока Run - в этом блоке выставляются управляющие сигналы, действия которых нельзя отменить(ну к примеру "Пуск ракеты" это всё конечно утрировано). В итоге получим Код if(Check){ Run } В результате случайного джампа мы попали в Run.... Конструкция Код if(Check){ Run if(!Check) отменить Run } не покатит в силу специфики применения. Т.е. в этом случае задача всё таки нерешаемая или я не прав? Конечно если программа будет на 99,(9) % состоять из Check, а оставшаяся часть будет Run всё равно будет ненулевая вероятность пуска ракеты. А если подумать? У меня "запуск ракеты" от одной команды невозможен. Ибо у меня железо выполено таким образом, что релюшка, запускающая "ядерную ракету" (  ) включается как минимум 2-мя пинами, сигналы на которых устанавливаются в разных точках программы. Так что даже если на один из пинов в результате сбоя будет подан сигнал "Enable RUN", то на другом-то пине такого сигнала не будет. И Америку не придётся с карты стирать ластиком
--------------------
После устранения бага в программе она стала работать....хуже
|
|
|
|
|
Feb 18 2008, 08:09
|
;
     
Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509

|
Цитата(Дон Амброзио @ Feb 18 2008, 10:59)  А что? Реальные помехи просто обязаны подчиняться нормам ESD  А то их в тюрьму посадят если они нарушат нормы ESD? ************************************ У меня "запуск ракеты" от одной команды невозможен. 1. На реальные помехи - реальная экранировка подсобного хозяйства и реальные техусловия 2. Пример решения на уровне архитектуры: см. MC68HC908MR08(freescale) понятие "WRITE-ONCE REGISTER"
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|