|
Криптографическая проверка правильности программы в ROM |
|
|
|
Mar 23 2013, 17:47
|
Местный
  
Группа: Участник
Сообщений: 212
Регистрация: 2-02-11
Пользователь №: 62 643

|
Допустим, встаёт задача определения, что в память МК записана именно та программа и той версии какой нужно, а не какая-нибудь другая. Например, в цепочке от программиста до потребителя, в частности на производстве или при продаже, программа могла быть заменена.
Как потребитель может понять, что он работает именно с той версией программы. Что при замене программы в ней не появилось дополнительных вредоносных функций.
Если потребитель может считать из памятьи код программы и расчитать и проверить MD5 хэш, например, то вопрос решается (вопрос как именно считать и возможные уязвимости см. ниже). Но есть принципиальная необходимость защиты от копирования для программы. Кроме того, потребитель не имеет возможности подключения программатора и т.п.
Допустим, программа может расчитывать самостоятельно MD5 и выдавать пользователю. Но, в таком случае, вредоносная программа может попросту выдавать MD5 от достоверной программы. Усложним. Пусть программа расчитывает MD5(RAND + ROM), где RAND -- случайное число задаваемое пользователем. И можно сделать web-сайт, например, который будет генерировать RAND и выполнять такой же расчёт. И пользователю останется только сверить числа. Не зная заранее RAND злоумышленник не может сохранить в памяти заранее расчитанный верный MD5. Нельзя расчитываать MD5(ROM + RAND), т.к. в последнем случае злоумышленник заранее сохранит MD5(ROM). И также как злоумышленник не может хранить какой-то более короткий хэш программы, также и web-сайт должен хранить в памяти все прошивки, что не очень хорошо, но терпимо. Можно ещё сказать, что MD5 в таком применении имеет известные уязвимости, но вместо MD5 можно применить HMAC на его базе и более стойкие хэши, это не принципиально.
Но вредоносная программа может состоять из полностью оригинальной программы и, в какой-то небольшой части памяти, исправлений к ней. Или наоборот, исправленная программа и информация об отличиях от оригинала. И при расчёте использовать эти сведения и таким образом расчитать верный MD5.
Не должно иметься возможности увеличения объёма программы. Как этого достичь. Допустим, что неиспользуемая программная память будет занята (псевдо)случайными данными и они тоже будут учавствовать в расчёте MD5. Естесственно, эти данные не должны подвергаться сжатию (иначе можно сохранить в сжатом виде и возвращаемся на абзац назад). Тогда внесение изменений в программу будет затруднено, большие изменения внести станет практически невозможно. А небольшие, скорей, возможно, если программа в ROM хранится в виде машинного кода. Т.к. машинный код немного сжимается. Следующим этапом было бы хранение в ROM уже сжатой версии программы дополненной случайной последовательностью и исполнение распакованной версии из RAM. Тогда внести изменения ещё более сложно, но такой метод ограничен используемым микроконтроллером.
Пользователь, получается, должен проверить, что в изделии используется именно микроконтроллер с таким-то объёмом памяти и на основе заданного им числа RND выдаётся MD5, который соответствует тому, что выдаёт web-сайт (на котором хранятся копии всех версий прошивок и следовательно можно осуществить такие же вычисления). Практически, пользователю сложно проверить тип микроконтроллера. Производство может, например, использовать МК с в двое большей памятью и во второй половине будет место попросту для исправленной программы, а в первой будет оригинал для прохождения проверки MD5. Маркировка же на чип может быть нанесена другая, от того микроконтроллера от которого нужно. И пользователю сложно разбирать прибор для проверки.
Допустим теперь, что прибор кроме МК обладает начительным объёмом FLASH-памяти. Если содержимое FLASH памяти включить в расчёт MD5 то всё получается. Но очень легко заменить микросхемы памяти на такие же, но большего объёма и трудно пользователю это проверить.
Допустим, что пользователь проверяет маркировку микроконтроллера и используемой FLASH-памяти. Или, что проще, MK и FLASH выбраны такими, что в таких же корпусах не существует аналогов с большими объёмами памяти.
Но если часть FLASH памяти используется для хранения каких-либо меняющихся данных? Допустим даже, что их можно стереть во время проверки. Получается, часть FLASH не проверяется и там может, например, находиться оригинальная программа по которой и посчитается MD5, а в памяти микроконтроллера будет совсем другое.
Неужто тупик? Вопрос чисто теоретический. Понятно, что организационные меры... Кроме того, можно допустить, что изделие проходит через 2 этапа производства и каждый программирует свою половину памяти (чётные и нечётные биты, например) и таким образом трудно внести искажения в ПО.
Продолжу размышления. Число RAND может быть достаточно длинным, объёмом равным объёму неиспользуемой части внешней FLASH-памяти и чуть менее, чем всё ОЗУ. Тогда вредоносной программе попросту негде будет хранить оригинал и, получается, такой метод действенный. Разумеется RAND тоже не должно сжиматься. И, кроме того, число RAND должно передаваться в МК в обратном порядке, например, чтобы нельзя было посчитать MD5 без сохранения в памяти.
Сообщение отредактировал Frolov Kirill - Mar 23 2013, 17:54
|
|
|
|
|
 |
Ответов
|
May 1 2013, 13:02
|
Местный
  
Группа: Участник
Сообщений: 212
Регистрация: 2-02-11
Пользователь №: 62 643

|
Цитата(Aner @ Apr 20 2013, 13:05)  Давно есть понятие электронной подписи как документа так и файла программы. Чтобы быть уверенным что не было подмены. Электронная подпись вычисляется с помощью хеш-функции. Все есть в инете. Оригинальный файл+подпись в виде хеш-функции (хеш либо внутри файла, либо отдельно) Обычно оригинальный файл в открытом виде. Но есть ещё вариант криптованной подписи, в различных вариантах. В закриптованной оригинал документа, программы не в открытом виде. Оригинал доступен после раскриптовки. Можно пользовать и то и другое по ситуации. Также есть госты. Всё это здорово, но нет файла, есть чип (иначе пользователю нужен и программатор...) И нельзя из него считать прошивку в файл (читающая программа может подменить) и проверить. И проверить самой программой хэш нельзя (вообще не считает, а выдаёт посчитанное для какой нужно программы). Вот с этого всё и начинается...
|
|
|
|
Сообщений в этой теме
Frolov Kirill Криптографическая проверка правильности программы в ROM Mar 23 2013, 17:47 alx2 Цитата(Frolov Kirill @ Mar 23 2013, 22:47... Mar 25 2013, 08:40 yes чтобы дистанциироваться от "устройство в опеч... Mar 25 2013, 13:40 sasamy Цитата(yes @ Mar 25 2013, 17:40) мне не п... Mar 26 2013, 06:28  yes Цитата(sasamy @ Mar 26 2013, 10:28) для i... Mar 26 2013, 10:37  sasamy Цитата(sasamy @ Mar 26 2013, 10:28) для д... Apr 20 2013, 06:24 san822 Как-то тоже задумывался над подобным вопросом, при... Apr 26 2013, 11:02 Aner QUOTE (san822 @ Apr 26 2013, 14:02) ... С... Apr 26 2013, 11:29 san822 Цитата(Aner @ Apr 26 2013, 15:29) Чёт нер... Apr 29 2013, 10:15 Aner . Apr 26 2013, 11:29 Aner 1) C небольшим объемом кода ... это для начинающих... Apr 29 2013, 19:14 syoma Не сильно то, что ТС спрашивал, но по теме дискусс... May 2 2013, 18:44
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|