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

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

|
Цитата(galjoen @ Feb 19 2008, 00:20)  ... А это возможно, только если во всей программе ни одной потенциально опасной команды (в т.ч. и во вторых словах двухсловных команд и в таблицах) не будет. А потенциально опасными командами можно считать те, которые зацикливают (могут на wdr зациклить), в регистры пишут (например в порты), или в ОЗУ в то место где реально регистры могут оказаться (запись собственно в ОЗУ безопасна)... Тогда давайте вообще от всех команд откажемся, они все потенциально опасные, все могут сделать что-нибудь нехорошее. Будем применять только NOP, поскольку это наш идеал Цитата Пишу и думаю: всё это ещё кому нибудь интересно или нет? Я-то ко всему этому интерес стремительно теряю, т.к. все во флуд превращается. Все и саму тему-то уже давно забыли. Сама тема не интересна. Как я уже писал, "искусство ради искусства", теоретические размышления, мало пригодные на практике. Просто иногда интересно почитать, что ещё могут придумать люди, которые тему принимают всерьез  Именно тему, а не саму проблему в целом, которая важна. (Это не наезд, не обижайтесь  )
|
|
|
|
|
Feb 19 2008, 10:06
|

Любитель Кошек
    
Группа: Свой
Сообщений: 1 593
Регистрация: 8-06-06
Пользователь №: 17 873

|
Цитата(Baser @ Feb 19 2008, 12:19)  Сама тема не интересна. Как я уже писал, "искусство ради искусства", теоретические размышления, мало пригодные на практике. Просто иногда интересно почитать, что ещё могут придумать люди, которые тему принимают всерьез  Именно тему, а не саму проблему в целом, которая важна. (Это не наезд, не обижайтесь  )  Есть отдельно взятое мнение, что если тема не интересна то: - не читать - и уж точно не писать (сама умрет) ну и не засорять офтом - может кому тема и интересна (мне например интересно в позновательных целях)
--------------------
По современному этикету, в левой руке держат вилку, в правой - мышку.
|
|
|
|
|
Feb 20 2008, 10:46
|
Знающий
   
Группа: Свой
Сообщений: 841
Регистрация: 10-05-07
Из: Чебоксары (Россия)
Пользователь №: 27 640

|
 Я тут вспомнил того мужика, который вторым на южный полюс пришёл. Пришёл, а там плакат висит "Добро пожаловать на южный полюс". Его тот, кто первым туда пришёл установил. Это я про то, что у всех потенциально опасных команд атмел старший бит =1 сделал. А тут некоторые считают, что лучше он бы дома на диване сидел, и через интернет посты слал "не вижу смысла ходить на южный полюс". Цитата(tyro @ Feb 19 2008, 13:06)  (мне например интересно в позновательных целях)  +1 Цитата(Rst7 @ Feb 15 2008, 14:03)  Я вам больше скажу. Все эти извращения можно применять. Возможно, в каком-то очень маловероятном случае, они даже спасут. +1  А я предлагаю написать тем, кто что-то полезное для себя из темы для себя извлёк. Желательно с указанием автора и с комментариями. Но без критики. Думаю это всем полезно будет. Вот я начинаю: Цитата(Непомнящий Евгений @ Feb 11 2008, 22:26)  Ну как вариант - расставить assert-ы по всей проге, для рантайм- проверки предусловий и постусловий функций. Если assert не выполняется - ахтунг. Буду делать. Цитата(Дон Амброзио @ Feb 14 2008, 21:45)  У меня данные храняться в команде CPI Rd , K. Как Вы, конечно же знаете, код этой команды 0011KKKK ddddKKKK. Отсюда 12 из 16 бит ячейки флэшь можно заюзать под данные. Т.е. 25% объёма флешь мы теряем в случае такого способа хранения данных.. Но зато !!!! Если в результате случайного джампа проц попадёт на область данных, то он просто выполнить цепочку команд CPI Rd , K а в конце области данных у меня стоит джамп JMP CRASH Достаточно чтобы у данных в таблицах во FLASH только срарший бит в слове =0 был. Выполнять это условие всегда тяжело. Но бывает, что без разницы чему равен старший бит в слове. В этом случае буду его =0 делать. Цитата(galjoen @ Feb 15 2008, 14:20)  ; до последней проверки ldi R17,Tag ; что такое Tag думаю объяснять не надо ; начинается последняя проверка. В ней R17 не используется. ... ; последняя проверка закончена. Дальше пошли аварийно опасные команды. .... ; дальше пример от 'Дон Амброзио'. Чуть переделанный OUT SPMCR , R16 ; --------------- cpi R17 , Tag brne CRASH ;----------------- SPM Буду делать.
|
|
|
|
|
Feb 20 2008, 11:11
|

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

|
Цитата(galjoen @ Feb 20 2008, 12:46)  Это я про то, что у всех потенциально опасных команд атмел старший бит =1 сделал. Это сугубо ваше личное мнение. А я считаю, что любая команда потенциально опасна. И не факт, что хитрое хранение данных (внедрение в тело команд) требующее применения сложного и медленного экстрактора будет безопаснее чем данные "как есть" с простым доступом к ним. Хотя конечно отговаривать любителей экзотики (покорителей южного полюса) бесполезно. Делайте так как считаете нужным.
|
|
|
|
|
Feb 20 2008, 11:37
|
Знающий
   
Группа: Свой
Сообщений: 841
Регистрация: 10-05-07
Из: Чебоксары (Россия)
Пользователь №: 27 640

|
Цитата(defunct @ Feb 20 2008, 14:11)  Это сугубо ваше личное мнение. А я считаю, что любая команда потенциально опасна. Согласен. Надо было написать так: у наиболее потенциально опасных. Цитата(defunct @ Feb 20 2008, 14:11)  И не факт, что хитрое хранение данных (внедрение в тело команд) требующее применения сложного и медленного экстрактора будет безопаснее чем данные "как есть" с простым доступом к ним. А к этому я и не призывал. Я написал так: если это безразлично, то лучше старший бит в слове данных =0 делать. Цитата(defunct @ Feb 20 2008, 14:11)  Хотя конечно отговаривать любителей экзотики (покорителей южного полюса) бесполезно. Делайте так как считаете нужным. Ну я же просил - без критики. А вы, уважаемый 'defunct', что нибудь полезное из этой темы для себя извлекли? Если нет, то пожалуйста об этом не пишите. Тема и так за 200 постов перевалила.
|
|
|
|
|
Feb 20 2008, 15:53
|
Гуру
     
Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521

|
Понимаете, большинство практикующих программистов (а не программистов теоретиков) сталкиваются ежедневно с определёнными трудностями. В том числе ошибки и сбои. Они могут оценить важность того или иного события, с практической точки зрения. Это проявляется при вылизывании любого законченного проекта имеющего мало мальски приличную серию. Например в одном из моих мелкосерийно(тысячи) выпускающемся приборе - было 118 версий и изменений. Каждая из которых выстрадана. Причём обнаружена одна существенная ошибка после начала серийного выпуска и куча мелких, незаметных для потребителя. Таким образом вероятность мелкой ошибочки программиста которая проявляется при уникальном стечении входных данных или действий - во много раз выше, чем "вероятность случайного перехода во время сбоя на область данных где по дикому стечению обстоятельств сбрасывается WDT". Это вам скажет любой самый высококлассный программист. А исходя из того, что "чем сложнее и крупнее проект тем выше вероятность ошибки программиста" (что совершенно очевидно), то и получается такое обсуждение. Люди не хотят обсуждать гипотетические ошибки, когда во много выше вероятность обычной привнесённой ошибки. Это с одной стороны. Теперь с другой. Приведу пример из области оптимизации. Представьте, что у вас две процедуры. Одна вызывается 100 тыс раз за секунду, вторая - 10 раз. При оптимизации мы выиграли 1 такт на первой и 10 на второй. Сравните результат. Таким образом оптимизировать вторую процедуру просто не имеет смысла. Так и здесь. Для того чтобы бороться с такими событиями как сбои, помехи и т.п., необходимо ПРОАНАЛИЗИРОВАТЬ ВЕРОЯТНОСТЬ И ТИП ТЕХ ИЛИ ИНЫХ СОБЫТИЙ. Причём сделать это надо в реальном изделии в реальном месте работы. Уверяю вас, - это можно реально сделать. И получить реальные результаты, на основании которых необходимо строить средства борьбы. Одно дело, если выяснится что с вероятностью 99% портится регистр данных, а другое дело - регистр комманд. Пока же мы рассуждаем о том, "чем лечить внеземной организм при заболевании". Вот только что выяснил, что у меня не нулевая вероятность появления пакета защищённого 8-ми битным CRC.  То есть проходит помеха (точнее идёт непрерывно) и может быть сформирована адрес сетевой + команда + CRC8. За год непрерывной работы на 5 изделиях такое произошло 2 раза. Но борьба будет аппаратной поставлю резисторы подпорки (растяжки) и терминаторы, чтобы отсечь маломощные помехи. Если это не решит проблему, то буду менять протокол.
|
|
|
|
|
Feb 21 2008, 14:30
|

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

|
Цитата(Serj78 @ Feb 21 2008, 12:36)  В устройстве имеется набор параметров, (констант) защищенных CRC и хранящихся в EEPROM, в начале работы параметры загружаются в ОЗУ. Имеет ли смысл в процессе работы если не загестрировано сброса подгружать их периодически? Цитата(SasaVitebsk @ Feb 21 2008, 13:35)  Это обсуждалось в другой ветке "тестирование регистров". Я считаю что ответ - "нет". Никаких практических величин вероятности у меня нет, но я параметры из EEPROM все-таки периодически подгружаю, каждые 10 сек. Соображения тут следующие: Энергия помехи, необходимая для изменения ОЗУ, на несколько порядков меньше, чем необходимая для изменения EEPROM. Соответственно и вероятность порчи ОЗУ значительно выше. Параметры из eeprom являются константами и не изменяются в процессе работы. Все другие переменные в ОЗУ меняются несравнимо чаще, чуть-ли не все время. А чем больше время "жизни" значения в ОЗУ, тем больше вероятность его сбоя. Причем большая часть алгоритмов МК циклические, поэтому порча содержимого обычной переменной чаще всего нивелируется последующими циклами, а порча константы может изменить поведение прибора на длительное время. Другой вариант - проверять CRC констант и в ОЗУ, и подгружать только когда есть ошибки. Все это, конечно, чистая эмпирика, но это из той области приемов, которые я всегда применяю, в отличие от тестирования регистров и АЛУ  p.s. Забыл уточнить, речь идет о внешней EEPROM, из внутренней копии в ОЗУ обычно не делаю, читаю напрямую.
Сообщение отредактировал Baser - Feb 21 2008, 21:05
|
|
|
|
|
Feb 21 2008, 18:40
|
Гуру
     
Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521

|
Тут - кто как себе разгоняет. Самый эффективный способ вызвать сбой - весьма прост. 1) Подключите ваше устройство ч/з не стационарный блок питания. Например ч/з свой. 2) Воткните этот БП в тройник. 3) Паралельно ему воткните устройство мощностью не менее 1.5кВт с индуктивной нагрузкой. 4) Поискрите этим устройством часа три. (В зависимости от качества БП и разводки, первые сбои пойдут через 1 - 10 мин) Если в своём устройстве вывести индикатор или счётчик сбоев, то очень хороший отладчик получится. Попробуйте проделать операцию с двумя вариантами программы, - получите статистику сбоев. Если устройство намертво повисло, то значит - шляпа.
|
|
|
|
|
Feb 26 2008, 13:16
|

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

|
Цитата(SasaVitebsk @ Feb 21 2008, 21:40)  Если устройство намертво повисло, то значит - шляпа. А если не зависло, то это ещё не означает, что сбоя нет  Ибо могло пройти искажение инфы в ОЗУ от помехи. Как напрямую, в рузультате воздействия на ячейку или шину адреса/данных во время записи, так и косвенно, например, в результате случайного джампа выполнится код, который не должен бы выполняться, и это код запишет в ОЗУ не то, что нужно.. Получиться дезинформация, т.е. деза
Сообщение отредактировал Дон Амброзио - Feb 26 2008, 13:21
--------------------
После устранения бага в программе она стала работать....хуже
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|