Comments 39
Если бы производитель сделал проверки ключа не байтами с вываливанием у случае первого неуспеха, а проверки всех 7 в цикле, с выставление флага и последующей проверкой флага, то наверное бы не вышло так.
Воистину защита хороша лишь тогда, когда все ее шаги защищены.
Кстати, номера весьма известные, для тех, кто смотрел сериал Lost
lostpedia.fandom.com/ru/wiki/Числа
Числа 4 8 15 16 23 42 — номера кандидатов замены Джейкоба в качестве «защитника острова».
…
После ввода чисел таймер становится в положение «108:00», указывающее на необходимость вновь ввести числа через 108 минут (4 + 8 + 15 + 16 + 23 + 42 = 108).
108=0х6с
Создатели железок любят всякую нумерологию :)
Я например встречал число Пи, в качестве ключа в одной из железок
Если бы производитель сделал проверки ключа не байтами с вываливанием у случае первого неуспеха, а проверки всех 7 в цикле, с выставление флага и последующей проверкой флага, то наверное бы не вышло так.Тоже опасно. Время исполнения кода с очень большой вероятностью будет различным для итераций цикла с различным результатом проверки. Особенно если это будет написано на С и потом оптимизировано компилятором. Компилятор наверняка выпилит строчку кода, когда флаг не нужно менять. Т.е. будет просто немного сложнее, разница во времени будет говорить о том, что один из 7 байтов оказался угадан верно/неверно. Если по уму, то надо пропускать n-раз через криптографически стойкую хэш-функцию как минимум и уже потом сравнивать.
Т.е. будет просто немного сложнее, разница во времени будет говорить о том, что один из 7 байтов оказался угадан верно/неверно.
bool weGood=true;
for (int i=0;i++;i<7)
{
if (key[i]!=input[i]) weGood=false;
}
if (!weGood) killIt();
как вы здесь определите какой байт верный?
по количеству присваиваний переменной weGood?
это вообще будет заметно на анализаторе?
как вы здесь определите какой байт верный?Да, в общем-то почти точно так же как в статье. Берём какой-нибудь пароль, замеряем его время. Перебираем первый байт, замеряя время и сравнивая с предыдущим показанием. И так по всем байтам.
по количеству присваиваний переменной weGood?Именно так. Разница будет в длительность исполнения инструкции присваивания weGood.
это вообще будет заметно на анализаторе?От анализатора зависит. Salea logic со своими несчастными 24МГц может и не увидит (хотя частоту атакуемого процессора можно и уменьшить). А вот осциллограф на 4Gsa/s очень даже увидит. Если использовать FPGA, то ещё и дешевле выйдет. Так или иначе цена подобного взлома достаточно низка для практического применения.
Есть безопасная реализация memcmp, где введенные байты xor'ятся с образцом, а результаты orr'ятся между собой.
Отличное завершение детектива!
По поводу защиты: производитель и не заявлял, стойкость к взлому. А также он предоставил возможность заменить загрузчик на свой, если это необходимо. Здесь все справедливо, как по мне.
А вот в плане перебора: любое ветвление в коде потенциально выдает по времени ветку, которая выполняется. Предположим, что мы даем ответ вообще по аппаратному таймеру, т.е. заведомо позже завершения алгоритма и всегда с одной задержкой. Тогда всего лишь отпадает атака по времени отклика, но мы начинаем измерять шум переключений вентилей и анализировать все это дело на FPGA и опять же, не достаточно стойкий алгоритм выдаст себя с потрохами. Т.е. стойкость к взлому и сам взлом — это такая гонка вооружений, которая никогда не кончится. Производители контроллеров также применяют различные трюки, к примеру можно посмотреть на МК DS5002 от Dallas (ныне Maxim)…
Вот так совпадение. Спасибо! Я сегодня тоже неожиданно обнаружил в блоке климата мазда cx5 защиту на r5f2138, в моде 3 контроллер не завелся, а в моде 2 отозвался но 0xff не принимает. Пойду почитаю даташит, может и у меня этот busy есть...
Очень крутое расследование-исследование. Интересно, как Vag защищает свои блоки.
youtu.be/7t4paclIwuU
У меня тоже возникла проблема с прошивкой контроллера R5F6416 в ресивере Yamaha, без знания ключа даже нет возможности стереть прошивку.
Тоже была мысль, что нужно использовать атаку по времени, но до реальных экспериментов дело у меня не дошло.
Попробуйте вместо Saleae Logic использовать программу PulseView от Sigrok — она гораздо удобнее.
Статья и подход к решению проблемы понравились. Только не проще ли было заменить этот МК на что-то более распространенное и написать свою прошивку для него? Вряд-ли ведь в отопителе используются какие-то сложные алгоритмы.
А по поводу замены МК — в некоторых товарищ в итоге так и сделал, т.к. они шли с управлением по CAN-шине, а у него был спрос на переделку для включения по логическому сигналу, вот он стал PIC16 туда ставить…
PulseView от Sigrok — она гораздо удобнее.Но жрет память как не в себя. Хотя может это конкретный плагин (i2c)
Алгоритм давно реализован прибором Martech. И работает он на нескольких версиях загрузчика, к сожалению не на всех.
Я пошел другими путями, но в итоге пароль вытащен, параллельный режим у его брата M306NBF закрыт. Чтобы не быть голословным WxxxWxx :).
Уязвимость — дело тонкое.
А другой путь это какой? Так же из контроллера тащилось, или откуда-то из дампа прошивки?
Вытаскиваем ПО из запароленного микроконтроллера Renesas M16C