Pull to refresh
313
0
Николай Шлей@CodeRush

Firmware Security Engineer

Send message
С другой строны, в качестве wear leveling'а отлично работает стратегия VSS, когда с предыдущей структуры снимается бит Valid, и в конец записывается следующая, не важно, большего там размера данные, меньшего или такого же. Дошли до конца — делаем сборку мусора. Подход AMI в данном случае лучше тем, что не нужно копировать имя и GUID, т.е. ресурс флеша все-таки экономится. Заодно становится понятно, зачем поле Next обновляют не в первой записи, а в последней — пара месяцев, и первую запись переменной MonitonicCounter или MemScrambleSeed затерло бы иначе просто до дыр, а так — все в порядке. В общем, тут все же больше экономия места на флеше, чем управление износом, на мой взгляд.
Может быть, не исключено, но можно придумать и менее хитрые способы, при которых хотя бы не нужно проходить по односвязным спискам до конца, чтобы до данных добраться.
Плат с «уставшим» SPI-чипом я тоже перевидал изрядно, причем симтомы там почти каждый раз разные, и сразу не поймешь, почему система сначала 5 лет работала в станке без сбоев, а потом начала на загрузке виснуть, на выключении виснуть, или вообще просто виснуть, без внешних причин. Никогда на SPI-чип не подумал бы, если бы его замена не решала бы проблему.
Потому что для Subzero.io используется обрезанная версия uefi-firmware-parser, в которую разбор NVRAM еще не портирован из UEFITool или CHIPSEC. Либо Тедди допилит UFP, либо мне хватит сил на libffsparser, но поддержка эта рано или поздно добавится.
На здоровье. Формат, конечно, полный песец. Ничего не мешало использовать формат VSS, который хоть и занимает побольше, зато прямой как палка и парсить его — одно удовольствие, но нет, если стандарт позволяет свободу в реализации, ей нужно пользовать именно таким образом.
Забыл сказать спасибо ребятам из проекта CHIPSEC за референсную реализацию парсига, на которую я частенько оглядывался, и тов. xvilka, который помогал с разбором NVAR и образами, и советами, и даже кодом.
Большое спасибо. Плюсанул бы вам в карму с удовольствием, но у вас статей нет. Напишите что-нибудь о верилоге и FPGA, если найдете время.
Я тут мимо проходил, и на верилоге почти не пишу, поэтому не могу сказать, где код ужасен, а где нет, но хотел бы научиться отличаться ужасный код от нормального и толковые комментарии от профессионалов могли бы в этом помочь. Вместо них у вас тут «и так понятно».
Посмотрите для примера на комментарии тов. khim, он тоже не терпит говнокода, но при этом не ленится пояснять почему конкретный код — говно и что с этим можно сделать. В итоге в выигрыше все, и автор, и комментатор, и читатели.
TL;DR: Критикуешь — предлагай.
Обычно хранилищ NVRAM делают два — основное и резервное, и в данном случае прошивка обнаружила повреждение основного хранилища, и переключилась на резервное. Ошибка же производителя в том, что «личные» данные конкретной платы в основное хранилище записали при начальной настройке, а в дополнительное — почему-то забыли. Восстановление после такого можно попробовать провернуть, сняв резервную копию сразу же и попытавшись вытащить данные из основного хранилища, возможно это получилось бы сделать, но через пару-тройку перезагрузок сработает сборщик мусора и тогда все, плакали наши данные.
С основной могла не запуститься потому, что воткнули новую память, понадобилось записать новые SPDData и MemCeiling, и на них не хватило места. Почему «протухла» резервная — понятно непросто, может сама SPI-микросхема попалась глючная, может еще что.
Мне как-то пришлось именно восстанавливать, т.к. на машине была куча крайне дорогого диагностического софта от нескольких автопроизводителей, который привязывается к данным DMI и упорно отказывается даже страртовать на «другой» машине. А потом на этом ноутбуке неожиданно развалился EVSA NVRAM, в котором половина данных DMI и хранилась, и софт отказался признавать ноутбук за сфоего после восстановления на программаторе. Повезло, что ребята сняли оригинальный дамп, с которым они ко мне и пришли. Посидел с часок, часть данных достал, нужны оказались System UUID и Motherboard Serial Number, которые получилось найти и перенести, после чего софт заработал снова.
Обновляют понемногу, но только для определенных ревизий, и только после подписания соглашений. Можно считать, что нет, в общем.
Уникальными должна быть комбинация «GUID + имя», но если дедупликация GUIDов еще имеет какой-то смысл (т.к. переменных с одним и тем же GUIDом довольно много, и это совершенно нормально), то с именами этот смысл уже практически не найти.
Да я и сам под впечатлением до сих пор, а парсер CMDB даже не смог заставить себя написать, т.к. гадость. Я подозреваю, что они просто раньше всех начали, еще со времен чипсетов пятой серии, и потому на тот момент просто не знали, как правильно пользоваться технологиями EFI вроде банального ReadFile. Поэтому пришлось реализовать свой собственный набор велосипедов, и с тех пор они перекатываются из одного reference tree в другой почти без изменений. Нужно отделить переменные SecureBoot от остальных — вот вам еще пара EVSA store специально под них. Нужны дефолты — вот еще два таких хранилища. Микрокоды надо грузить пораньше — и их в том NVRAM, единственный, содержимое которого можно выдумывать как угодно, и никакая спецификация PI тебе не указ!
Очень надеюсь, что они одумаются и откажутся от своих тюнингованных шоссейников в пользуй решений из EDKx, когда-нибудь. А пока имеем то что имеем — цирк-шапито на конной тяге.
Спасибо автору за отличное введение в KS, а тов. GreyCat за саму утилиту. Надо будет взять на вооружение, а то я так и продолжаю хранить все форматы в виде С-стуруктур и комментариев к ним, а парсеры писать вручную (вкривь и вкось).
На ассемблере для x86-64 пишу, когда совсем припрет. К счастью, в последнее время это случается все реже.
«Отключить» МЕ нужно так, чтобы он а) не мешал никому своими вотчдогами, б) ничего не писал на флеш (читает пусть сколько угодно) и в) система при этом не сильно проседала по производительности или возможностям. Понятно, что совсем честное отключение — это когда региона МЕ вообще нет, но на безрыбье народ согласен и на вышеперечисленное, хоть и добиться его становится сложнее с каждым поколением.
Мобильные тоже есть, eKabini (FT3) и более старые APU, но тенденция на внедрение fTPM 2.0 для Windows 10 никуда не девается, поэтому AMD может внедрить PSP в десктопные процессоры в любой момент.
Подвижки в сторону внедрения STM определенные есть, и его даже можно потестировать на Minnowboard Max, но в остальном ты кругом прав.

Я тоже опасаюсь за будущее SGX, но по несколько другим причинам: технология банально слишком сложная для реализации даже очень опытным разработчиком, поэтому (даже если, по счастливой случайности, в ее реализации не окажется дыр, и твой способ атаки не сработает по каким-то гипотетическим причинам) большая часть софта просто не будет его использовать, плюс еще доступна она буквально на двух с половиной процессорах, требует поддержки со стороны прошивки (но там только память под кэши выделить, ничего сложного), имеет мутный лицензионный статус (так до конца и непонятно, кто кому какие ключи подписывает) и так далее.

Много вы видели софта, который использовал бы AVX2? Я видел полторы оптимизированные вручную опенсорсные утилиты и дорогущий интеловский компилятор. А ведь набору инструкций уже больше трех лет, и он простой как валенок.

Не могу сказать, что SGX вот прямо совсем мертворожденая фигня, как TXT, но в истории с ним очень четко прослеживается тенденция, которую я называю «много развожу, и много вешаю»: на каждом новом поколении Intel пробует какие-то новые технологии, часть которых «выстреливает» и их начинают поддерживать и использовать все (NX bit, SMEP, SMAP те же), а другая тихо уходит в небытие после 2-3 поколений. При этом презентуют их все с максимальной помпой, т.к. Инновации и Технологическое Лидерство. А потом приходят ребята вроде тебя или Рафаля и портят маркетингу всю малину. :)
Какой-то своеобразный юмор, борюсь с желанием положить под спойлер известную картинку с ничего не понявшим летчиком.
Вот это — юмор, а тут статья похожа на самооправдание, мол, да не нужны программисту всякие заумные концепции, а то ведь на PHP надо жахать уже вот прямо сейчас. И Хаскель космосом обозвали, и по ФП прошлись.
«Все, что я не понимаю — не нужно» — это не юмор, это грустно.
МЕ нынче просто так не отключишь, так что нужен он домашнему пользователю или нет — Интел за него уже все решил.
Платы, не стартующие из за мусора в CMOS, я тоже видел, причем иногда они даже но кнопку питания не реагируют, до того залипли. С NVRAM шансы на такой исход пониже, все-таки там форматы поинтереснее, чем голый SRAM, и валидация похитрее.
Польностью защищенную систему стоит собирать на процессоре AMD без PSP (на eKabini, например), вместо BIOS лучше использовать Coreboot/Libreboot с reproducible builds, а NVRAM не использовать вообще, задавая все настройки при компиляции.
Почему не пользуются защитой отдельных регионов? Никто заморачиваться не хочет, т.к. тот же уровень защиты обеспечивают PR-регистры чипсета, которые при этом намного проще программируются и от производителя SPI-чипа не зависят.
Стандартно через FITC, да. Если там выбрать два чипа (и развести их правильно, по соотвествующему SPI_CSx на каждый), то чипсет их отображает друг за другом в непрерывное адресное пространство в конце четвертого гигабайта, а дальше просто оставляем все, кроме томов PEI и DXE, по адресам первой микросхемы, а на вторую после прошивки ставим RO через регистр STATUS и вывод #WP.

По поводу МЕ — NDA мешает рассказывать, что Intel сказал нам, могу только сказать, что на рынке Embedded и Industrial достаточно плат с отключенным МЕ, только танцев с бубном вокруг его отключения и работы системы без него с каждым поколением становится все больше.
Пожалуйста. Я бы сказал, что даже нужно, но сделать её получится нормально только на весьма небольшом количестве систем, т.к. кроме UEFI на том же чипе у нас еще хранятся данные ME (который тоже без устали пишет в свой NVRAM), GbE (этот переживает RO без проблем) и EC (это тоже). Проще всего разделить код и данные на две разных микросхемы, оставив МЕ и NVRAM в первой, а все исполняемые компоненты — во второй, которую и защитить от записи аппаратно (или, на крайний случай, джампером на выводе #WP).
У меня такая система уже есть и работает, но в ней изначально задумывалось посадочное место под второй чип. Можно сделать такую же конфигарацию на системах AMD с одним чипом, либо договариваться с Intel об отключении ME, но тут мне уже NDA не позволяет продолжать.

Information

Rating
Does not participate
Date of birth
Registered
Activity

Specialization

Инженер встраиваемых систем, Системный инженер
Ведущий