Убить Еву
Вот уже неделю не утихают спекуляции на тему зловреда с СС'15, который так никто и не видел. Тут вам и слухи, и догадки, расследования, обвинения… Все это интересно и смешно, но не столь интересно, сколько интересен сам прецедент.
Конечно, технически всем было понятно, что стереть флеш или сд-карту — не вопрос, ведь есть софт, который в них что-то пишет. Но почему-то считалось, что никто не захочет этим воспользоваться. Что ж, так было и будет всегда :) Подобный трюк проделывали еще в прошлом веке. Казалось бы, история должна нас чему-то научить…
Но это всё интересно лишь первый раз, поэтому нет смысла рассказывать, что можно «убить» Еву стиранием флеша. В принципе, очевидные вещи типа запортить сд-карту, подменить файл и прочее — тоже не особо интересны. Поэтому, предлагаю обратить внимание на другие аспекты.
Известно, что на плате Евы установлен МК ATMEGA128, к которому подключена FPGA. В этом МК хранится сжатая прошивка для FPGA и код, обслуживающий разные девайсы типа клавиатур, модема и пр. МК с FPGA общаются по интерфейсу SPI.
Вся эта система практически неубиваема до конца — в МК есть бутлоадер, который, при правильных настройках МК, нельзя стереть программно. То есть, если даже каким-либо образом получится испортить основную программу МК, то все равно можно будет легко перепрошиться с сд-карты.
Бутлоадер всегда стартует перед запуском основной прошивки. Он проверяет CRC основной программы, и если оно неправильное — запускается обновление с сд-карты. То же происходит если зажат soft reset.
Таким образом, у нас есть несколько теоретических векторов атаки:
Так как в AVR нельзя залить свой код даже через потенциальную дыру (исполнение только из flash), то для первого случая нам нужен любой код в прошивке, который меняет флеш МК. На данный момент такого нет. Fail.
Для второго случая (да и для первого бы подошел как вариант) нам нужна возможность сделать переход по произвольному адресу. Такие уязвимости в софте для AVR известны и эксплуатабельны — нам всего лишь нужно переписать адрес возврата на стеке на адрес программы обновления в бутлоадере. Нужно найти дыру с переполнением буфера. Я поискал. Не нашел. :) Fail.
Пока что перепрошивка AVR и FPGA из кода пользователя считается невозможной. Пока что. Но не стал бы я ради этого писать статью, правда? ;)
До этого я не сталкивался с работой с флешами (кроме сд-карт) ни в каком виде. Но lhxrkud навела меня на интересные мысли. Там говорилось, что чтобы что-то во флеш прошить, ей нужно наслать разного по разным адресам. Т.е., там какой-то конечный автомат внутре. А что если… если мы начнем процесс и не закончим? Я скачал даташит на нашу флеш и нашел там такую таблицу:
Таким образом, например, чтобы стереть флеш, надо строго последовательно записать такие данные по адресам:
После этого запустится процесс стирания, который будет длиться некоторое время. В этот момент из любых адресов флеша будет читаться регистр статуса. Уже чувствуете, куда я клоню? Вместо ПЗУ в этот момент будет читаться что угодно, только не прошивка (хотя, мы же ее стерли). В общем, не надо так. Кроме багов и пустой флеши это ничего не даст. Но концепт нужно развивать.
Команды стирания и программирования зависают в «ином» режиме лишь на небольшое время. А вот команда Autoselect зависает в «ином» режиме до принудительного выхода из него командой Reset. Бинго!
Входим в режим Autoselect и… зависаем :) Теперь вместо данных у нас читаются разные ID чипа и прочая ерунда. И веселуха в том, что никакие ни софт- и хард-ресеты, ни переключения конфигураций не помогают :) Всё, трупик. Но если выключить и включить питание — все работает как прежде.
Что нам это дает кроме игры в злодеев? Веселье! У нас всектетолпе так принято. Но нельзя же останавливаться только на умерщвлении? Конечно нет, мы ведь профессионалы своего дела! Сделаем-ка зомбочка (для этого я даже реал завёл, что само по себе не легко).
Сразу оговорюсь. «Убиение» автоселектом сработает везде, а вот зомбачок наш будет работать на честном слове. И работать он будет только с определенными флешками и нормальным спектрумом, как то пентагон или тс-конф. Бейзконфа с атм-неспектрум в пролете, что в очередной раз подтверждает, что не спектрум это.
Итак, что же будет читаться из ПЗУ, если мы включим autoselect? Даташит говорит нам, что:
Про другие адреса ничего не говорится, но мы просто возьмем и проверим:
А вот и дизассемблер:
(но не всё так радужно! ldir скопировал вот такую красоту, а если смотреть ручками в sts, то 4й байт может быть и 00, и 20, и Е2, и это чуть-чуть огорчает.)
То есть, как мы видим, для нашей конкретной флеши получаются кучи переходов непонятно куда. Но не вопрос — мы поставим ловушки и в итоге перейдем куда нам будет нужно.
Например, если мы будем держать флаг Z=0, то при ресете мы гарантированно перейдем на 0xFFE4. Просто поставим в конец ОЗУ JP куда нам надо, а остальное заполним нопами. Вуаля! Перехватчик ресета готов!
Во-первых, в секретных лабораториях разрабатывается защита от махинаций с флешками, и все эти игрища однажды перестанут работать.
Во-вторых, посмотрим, вдруг кто еще что-то интересное нароет и напишет продолжение :)
Наслаждайтесь и имейте совесть, господа!
Конечно, технически всем было понятно, что стереть флеш или сд-карту — не вопрос, ведь есть софт, который в них что-то пишет. Но почему-то считалось, что никто не захочет этим воспользоваться. Что ж, так было и будет всегда :) Подобный трюк проделывали еще в прошлом веке. Казалось бы, история должна нас чему-то научить…
Но это всё интересно лишь первый раз, поэтому нет смысла рассказывать, что можно «убить» Еву стиранием флеша. В принципе, очевидные вещи типа запортить сд-карту, подменить файл и прочее — тоже не особо интересны. Поэтому, предлагаю обратить внимание на другие аспекты.
Программная смена прошивки
Известно, что на плате Евы установлен МК ATMEGA128, к которому подключена FPGA. В этом МК хранится сжатая прошивка для FPGA и код, обслуживающий разные девайсы типа клавиатур, модема и пр. МК с FPGA общаются по интерфейсу SPI.
Вся эта система практически неубиваема до конца — в МК есть бутлоадер, который, при правильных настройках МК, нельзя стереть программно. То есть, если даже каким-либо образом получится испортить основную программу МК, то все равно можно будет легко перепрошиться с сд-карты.
Бутлоадер всегда стартует перед запуском основной прошивки. Он проверяет CRC основной программы, и если оно неправильное — запускается обновление с сд-карты. То же происходит если зажат soft reset.
Таким образом, у нас есть несколько теоретических векторов атаки:
- испортить хотя бы байт во флеше основной программы, тогда при следующем включении бутлоадер прошьет то, что будет в zxevo_fw.bin;
- запустить программу обновления из бутлоадера напрямую.
Так как в AVR нельзя залить свой код даже через потенциальную дыру (исполнение только из flash), то для первого случая нам нужен любой код в прошивке, который меняет флеш МК. На данный момент такого нет. Fail.
Для второго случая (да и для первого бы подошел как вариант) нам нужна возможность сделать переход по произвольному адресу. Такие уязвимости в софте для AVR известны и эксплуатабельны — нам всего лишь нужно переписать адрес возврата на стеке на адрес программы обновления в бутлоадере. Нужно найти дыру с переполнением буфера. Я поискал. Не нашел. :) Fail.
Пока что перепрошивка AVR и FPGA из кода пользователя считается невозможной. Пока что. Но не стал бы я ради этого писать статью, правда? ;)
Убить… до полусмерти
До этого я не сталкивался с работой с флешами (кроме сд-карт) ни в каком виде. Но lhxrkud навела меня на интересные мысли. Там говорилось, что чтобы что-то во флеш прошить, ей нужно наслать разного по разным адресам. Т.е., там какой-то конечный автомат внутре. А что если… если мы начнем процесс и не закончим? Я скачал даташит на нашу флеш и нашел там такую таблицу:
Таким образом, например, чтобы стереть флеш, надо строго последовательно записать такие данные по адресам:
- 0xAA -> 0x0555
- 0x55 -> 0x02AA
- 0x80 -> 0x0555
- 0xAA -> 0x0555
- 0x55 -> 0x02AA
- 0x10 -> 0x0555
После этого запустится процесс стирания, который будет длиться некоторое время. В этот момент из любых адресов флеша будет читаться регистр статуса. Уже чувствуете, куда я клоню? Вместо ПЗУ в этот момент будет читаться что угодно, только не прошивка (хотя, мы же ее стерли). В общем, не надо так. Кроме багов и пустой флеши это ничего не даст. Но концепт нужно развивать.
Команды стирания и программирования зависают в «ином» режиме лишь на небольшое время. А вот команда Autoselect зависает в «ином» режиме до принудительного выхода из него командой Reset. Бинго!
Входим в режим Autoselect и… зависаем :) Теперь вместо данных у нас читаются разные ID чипа и прочая ерунда. И веселуха в том, что никакие ни софт- и хард-ресеты, ни переключения конфигураций не помогают :) Всё, трупик. Но если выключить и включить питание — все работает как прежде.
А зомби зомби зомби
Что нам это дает кроме игры в злодеев? Веселье! У нас в
Сразу оговорюсь. «Убиение» автоселектом сработает везде, а вот зомбачок наш будет работать на честном слове. И работать он будет только с определенными флешками и нормальным спектрумом, как то пентагон или тс-конф. Бейзконфа с атм-неспектрум в пролете, что в очередной раз подтверждает, что не спектрум это.
Итак, что же будет читаться из ПЗУ, если мы включим autoselect? Даташит говорит нам, что:
- по адресу 00: Manufacturer ID
- по адресу 01: Device ID
- по адресу 02: Sector Protect Verify (00/01)
Про другие адреса ничего не говорится, но мы просто возьмем и проверим:
А вот и дизассемблер:
(но не всё так радужно! ldir скопировал вот такую красоту, а если смотреть ручками в sts, то 4й байт может быть и 00, и 20, и Е2, и это чуть-чуть огорчает.)
То есть, как мы видим, для нашей конкретной флеши получаются кучи переходов непонятно куда. Но не вопрос — мы поставим ловушки и в итоге перейдем куда нам будет нужно.
Например, если мы будем держать флаг Z=0, то при ресете мы гарантированно перейдем на 0xFFE4. Просто поставим в конец ОЗУ JP куда нам надо, а остальное заполним нопами. Вуаля! Перехватчик ресета готов!
Что дальше
Во-первых, в секретных лабораториях разрабатывается защита от махинаций с флешками, и все эти игрища однажды перестанут работать.
Во-вторых, посмотрим, вдруг кто еще что-то интересное нароет и напишет продолжение :)
Наслаждайтесь и имейте совесть, господа!
23 комментария
а тут psb такой — нна!
и все ооо!!!
и осторожно, этот код не проверялся с магнитофонами!