Как стать автором
Обновить

Комментарии 34

Чувак, ты крут!

Глядя на относительно примитивный код проверки, у меня возникает единственный вопрос – как же они там в bios-mods ломают-то? Методом научного тыка? Даже в играх 90-х защиты бывали посерьёзнее.
Да нет, ломают они там отлично, просто у них очень мало людей и очень много однотипных модов, поэтому на разработку новых каких-то времени не хватает почти никогда. Я уверен, что защиту эту сломали давно и до меня, но информацией не делились по каким-то причинам. А мне раз в 2 недели стабильно кто-нибудь писал по поводу этой защиты, и теперь я всех новых просителей буду вот сюда молча посылать.

Вообще, в теме модификации UEFI сейчас слишком мало людей, т.к. многие почему-то думают, что это сложно и модифицированное не будет работать. На деле же имеются открытые спецификации, почти полная открытая документация на все стадии загрузки, открытые исходники TianoCore, из которых на 75% любой UEFI и состоит, даже форматы исполняемых файлов (практически) стандартные, ну буквально реверсь-не хочу. А реверсят в итоге ~20 человек, половина из которых работает на MITRE, а другая не может ничего писать, т.к. у нее NDA на 1000 страниц. Так и живем.

P.S. пользуясь случаем, прорекламирую вчерашнюю статью d_olex про недавнюю уязвимость в S3 Boot Script, ее эксплуатацию и последствия.
НЛО прилетело и опубликовало эту надпись здесь
Более того, это не D6K такой краб, просто цель поставлена другая — научиться прошивать модифицированный БИОС поверх оригинального при помощи оригинальной же утилиты для обновления, и чтобы при этом все работало. Вот тут он поясняет свои дальнейшие действия после того места, на котором закончилась эта статья.
Правильно ли я понимаю, что прошить такой биос первый раз можно только программатором? Или есть какие-то тулзы которые шьют из ОС?
Да, прошить такой БИОС получится только программатором, если в нем нет уязвимостей, через которые можно снять с него защиту от записи. Вышеупомянутая уязвимость S3-бутскрипта как раз одна из таких, и если с ее помощью снять биты BIOSWE и SMM_BWP, то шть можно будет хоть через Intel FTP, хоть через flashrom.
Как бы со временем не отдали эти проверки аутентичности firmware на откуп всякой дряни типа TPM. Тогда с этим будем беда. А всё походу к тому идет ( Не здоровая эта тенденция, ограничивать владельца в использовании купленного железа.
Через TPM нельзя нормально проверить целостность firmware (точнее, можно, но это также бессмысленно, как защита из статьи), поскольку TMP умеет только measurement, а validation все равно находится в коде и может быть обойден. Что толку от TPM со всеми его хэшами, если их никто не спрашивает?
Именно поэтому и Intel, и AMD уже имеют в активе технологии hardware-based fimrware validation, и у Intel они уже давно работают на некоторых ноутбуках. На этот стек технологий условия NDA особенно драконовские, потому скажу всего два слова: Intel BootGuard и AMD TrustZone.
Погодите. Мы же вполне можем зашифровать прошивку каким-то ключом, привязать его к PCR'ам, и, как бы, все. Прошивку мы слить программатором можем, но она будет зашифрована. Расшифровать ее мы не можем, т.к. не можем влиять на ее runtime-поведение, и модифицировать не можем, т.к. она, во-первых, зашифрована, а во-вторых, просто не расшифрует сама себя после изменений (PCR не будут совпадать).
Остается только дампить память. Это, наверное, ненадежно.
Все, что делается до инициализации памяти, и она сама — будет лежать в открытом виде, т.к. оно исполняется прямо из SPI-flash. В этот же драйвер инициализации можно встроить вызов своего кода, который зарегистрирует обработчик события EndOfPei, при срабатывании которого будет доступен как весь расшифрованный код PEI, так и уже расшифрованный код DXE.
Код, на который мы можем влиять, все равно будет и потому такая защита все равно будет отломана.
Решение — запускать код, который производит валидацию прошивки, до reset vector'а, чтобы на него вообще никак нельзя было повлиять (или можно, но только имея private key, как на код ME), такая себе комбинация HW-based validation и HW root-of-trust. Вот это уже без доступа к ключам или уязвимостей аппаратуры не сломать.
А есть ли какие-нибудь тулзы, чтобы добыть образ БИОСа не напрямую из флэхи, а из файла с обновлением, например?
Нет, вручную только. Да и там, зачастую, недостает половины необходимых для нормальной работы данных — дескриптора, региона МЕ, а иногда вообще приложены только те модули, которые требутеся обновить.
а приходилось ли вам когда-нибудь вычленять и разбирать код, который загружается в теневую память и работает в SMM?
Его не надо вычленять, он в БИОСе в совершенно открытом виде лежит, в файлах типа SMM Driver, Combined PEI/SMM (исключительно редкий вид) и Combined DXE/SMM (раньше были распространены, сейчас от них отказались). Файлы лежат совершенно открыто в DXE-томе и по формату не отличаются от обычных DXE-драйверов, только вместо DXE_SYSTEM_TABLE используют SMM_SYSTEM_TABLE.
По существу вопроса: не было необходимости, поэтому можно считать, что не приходилось. Зато SMM-драйверов написал с десяток, так что кое-что понимаю в том, как они работают и зачем нужны. Рассказывать о конкретных особенностях не могу, NDA (я из второй половины вышеупомянутых людей как раз), но зато могу попросить: исследуйте популярные прошивки, пишите статьи, там конь не валялся еще и места море для улучшений как безопасности, так и функциональности.
Меня интересует не столько возможность улучшений, сколько вообще отключения этой «темной материи». И не столько в целях безопасности и паранойи, сколько в целях предсказуемого поведения системы, для приближения её к real-time. На текущий момент я встречаю редкие, но необъяснимые задержки в работе системы и связываю их главным образом с тем, что в какие-то моменты SMM решает «и пусть весь мир подождет». Вы можете пролить какой-нибудь свет по этому поводу?
Отключение возможно, но очень много вещей перестанет работать — эмуляция USB-устройств для DOS, CSM, мониторинг оборотов, IO-ловушки и масса другого. Можно опробовать удалить драйвер SmmInit или все SMM-драйверы и проверить.
Еще можно пропатчить БИОС на предмет обхода установки бита SMI_LOCK, а затем просто отключать источники SMI, пока не выяснится корень проблемы.
Ну речь идет про тюнинг конкретной машины под конкретную систему.

Поэтому скажем эмуляция USB-устройств нафиг не нужна. Мониторинг оборотов вентиляторов как таковой не нужен, но тревоги при их поломке, получать хотелось бы, но разве этим не занимается какой-нибудь чип типа Winbond (кажется они называются LPC чипами)? Или имеется ввиду подстройка оборотов для минимизации шума? Тогда пофиг, выставляем на максимум.

А у I/O trap'ов есть какое-то реальное применение, кроме как всякой мутоты по эмуляции мышей и клавиатур?

А что такое CSM (гуглил, но адекватную расшифровку не нашел)?
CSM — это Compatibility Support Module, т.е. слой эмуляции legacy BIOS. Если ОС поддерживает UEFI-загрузку и GOP — можно обойтись без него.
Чипы те называются Environmental Controller (EC), на некоторых платах для них пишут SMM-драйверы с вызовом через ACPI, чтобы управление получалось независимым от ОС.
У IO-trap'ов есть применение, мы их для отладки используем достаточно активно, к примеру.
Под конкретную машину надо брать и удалять из прошивки SMM-драйверы по одному, если исходного кода нет. Так оно будет отваливаться по частям и можно выяснить, без чего можно жить еще, а без чего уже нельзя.
> У IO-trap'ов есть применение, мы их для отладки используем достаточно активно, к примеру.

Имеется ввиду отладку BIOS'ов или драйверов? А не расскажете, где можно почитать про технику такой отладки? Или для этого требуется иметь доступ к коду SMM?
БИОСа в первую очередь. К примеру, происходит где-то в непонятном месте ресет (вот ровно как в статье), а у нас релизный БИОС без strings output (т.е. отладочные строки через COM-порт он не выводит). Добавляем в него драйвер, который вешает по ловушке на CF9h, A2h и 64h и выводит тип ресета и SMM CPU Context, из которого можно достать значение RIP и точное место, откуда он произошел, затем сделать дамп этого куска памяти и разбираться уже предметно.
Почти на два года запоздавший вопрос: можно ли просто выкинуть модуль CSM (или CsmVideo)? У меня тут возникла проблема с материнкой M5A99X Evo, которая упорно инициализирует видеокарту в legacy, а опции (даже скрытой) отключения CSM — нет.
Выкинуть то можно, только в этом случае видеокарта совсем перестанет работать, скорее всего. Если опции отключения CSM нет, значит прошивка, по мнению производителя не готова работать в UEFI-only режиме. Т.е. она в нем либо не тестировалась совсем, либо не может работать по разным причинам (рантайм-сервисы сломали и не смогли починить, например). Лучшее, что тут можно сделать — заменить плату на более новую либо пользоваться легаси-режимом дальше (ОС все равно потом переинициализирует как нужно).
Спасибо. Печально это. ОСь-то, конечно, переинициализирует, но вот линуксовый модуль нвидии все равно ругается, что видеокарта была инициализирована в легаси.
И пусть ругается, на скорость это не влияет, так что можно смело игнорировать.
Кстати, а IPMI использует SMM? Или же это отдельная подсистема?
Зависит от реализации, но чаще всего там есть и SMM-драйверы, и отдельная подсистема. И не работаю с серверными системами, поэтому из IPMI встречался пока только с Intel AMT, работает она без SMM или нет — тоже не проверял, но по идее не должна.
AMT всё-таки это IPMI для бедных, там и сетевуха общая, и вообще )

Кстати, раз уж пошла речь об этом, то может быть вы знаете, почему AMT в полной мере поддержана только на чипсетах серии Q? Действительно какие-то дополнительные возможности или чисто маркетинг? В своё время было интересно с этим поковыряться, но обнаружив, что у меня чипсет серии X, я был опечален )
Действительно дополнительные возможности, другая версия Management Engine и другой БИОС. Можно ли завести AMT на десктопных чипсетах — знает полтора человека из Intel.
Сейчас ситуация лучше чем ранее, можно найти б/у карты, которые будут работать. Сам несколько лет назад столкнулся с тем, что новая WiFi карта не заработала, что меня очень удивило. не ожидал такого подвоха. Вообще слишком много функций в БИОС навешивают, особенно с появлением Windows 8. Как то на каком-то ноуте из линейки HP Consumer при включении появилась надпись «manufacture programming mode is in unlock mode». Удалось это выключить специальной утилитой.
Это хорошо, когда можно найти совместимое оборудование, но иногда его либо уже не найти, либо придется два месяца ждать заказ из Китая. При этом ничего, кроме вот такой защиты идиотской, не мешает поставить другой чип, адаптировать под него БИОС (часто достаточно смены VEN/DEV IDs) и отдать починенный ноутбук уже завтра.
Слишком много всего — соглашусь на 500%, но так сейчас работает маркетинг в массовом сегменте, новые фичи важнее исправления стары багов. Это плохо, но пока — вот так.
> но так сейчас работает маркетинг в массовом сегменте

Странность этого маркетинга заключается в том, что вокруг всякой фигни типа управлением скорости вентиляторов, разводятся такие секреты (про многостраничные NDA), что иной раз кажется, что там довеском идет система управления ядерным реактором, которая тупо ждет, что его подключат в нужный разъем USB )))
Секреты там вокруг всего разводятся — монополия на рынке, страшно ее терять. :)
Рекомендую для исследований купить Intel Galileo Gen2, там практически настоящий i586+ с JTAG из коробки, открытый UEFI и открытая документация. SMM оно тоже умеет.
Если хочется чего-то более производительного — Minnowboard Max, там нет JTAG, и открытую прошивку обещают на днях, но не могут выпустить в течение полугода, но я надеюсь, что таки выпустят. А там уже обычный Atom со всеми его плюшками.
Про систему управления — да если бы. Половина SMM-кода занята эмуляцией всякой легасятины времен динозавров, другая — разные вендорские утилиты для прошивки БИОСа, получения информации о системе, управления подсветкой и т.п. То, что могли написать на AML, если бы у него был менее наркоманский синтаксис.
В этот раз пойдем немного другим путем и будем начинать не с точки входа, а с того места, где встречается сигнатура $HSS. Идем в Search -> Text… (или нажимаем Alt+T), вводим $HSS, ставим галку Find all occurences и… ничего не находим. Думаем немного и понимаем, что у нас LittleEndian-машина, и $HSS при загрузке в регистр будет выглядеть как SSH$ или 53534824h. Ищем этот вариант и вуаля, одно вхождение:

Так делать не стоит. Search -> Text… — это поиск в дизассемблированном листинге. Если соответствующую часть кода IDA по какой-то причине оставила в виде дампа db (например, процедура вызывается косвенно типа call dword ptr [eax+14h]), или если (условно) следующая версия IDA начнёт превращать такие константы в текст «cmp dword ptr [ebx], 'SSH$'», ничего не найдётся.
Лучше Search -> sequence of bytes..., оно понимает задание строки типа "$HSS" в кавычках.
Вот, спасибо. Я с IDA работал мало (хватало обычно objdump'а), поэтому иногда не знаю очевидных фишек.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации