fk0легенда (23.03.2013 22:07, просмотров: 12474)
Допустим, встаёт задача определения, что в память МК записана именно та программа и той версии какой нужно, а не какая-нибудь другая. Например, в цепочке от программиста до потребителя, в частности на производстве или при продаже, программа могла быть заменена.
Как потребитель может понять, что он работает именно с той версией программы. Что при замене программы в ней не появилось дополнительных вредоносных функций.
Если потребитель может считать из памятьи код программы и расчитать и проверить 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 без сохранения в памяти.
[ZX]