Обновить
8K+
320
Николай Шлей@CodeRush

Firmware Security Engineer

29,1
Рейтинг
692
Подписчики
Отправить сообщение

Зависит от реализации, но в большинстве своем достаточно тупое, зато работающее "пишем в хранилище, пока оно не заполнилось, когда заполнилось - убираем мусор". Биты на NOR flash можно менять произвольно только с Erase Polarity (т.е. с 1) на 0, поэтому переменные делают так, чтобы их статут с "валидная" на "удалена" можно было менять сменой одного бита с 1 на 0, для этого обычно и используется поле State в заголовке, о котором вы спрашивали в соседней теме. Т.е. запись в переменную получается в виде "прошелся по всем переменным, если нашел уже одну с таким же именем, и она валидная - поставь ей признак "удаляется прямо сейчас", найди место под новую переменную в конце хранилища, если оно есть - пиши туда заголовок новой переменной, если записался - ставь признак "заголовок валидный", пиши новое тело переменной, если записалось, ставь признак "тело валидное", если все нормально - ставь в предыдущую переменную в заголовок признак "удалена", и так далее. Если место кончилось, можно все валидные переменные из хранилища по одной переписать в память, или в другую копию хранилища (обычно их не менее двух, потому что так они переживают повреждение заголовка у самого хранилища, а не только у переменных).

Надеюсь, что смог на пальцах пояснить, если нет - исходники стандартной реализации из EDK2 доступны для изучения:

  1. https://github.com/tianocore/edk2/blob/1f026ababf350746c6071c0873d9d1c8824029ca/MdeModulePkg/Universal/Variable/RuntimeDxe/VariableDxe.c и вокруг - драйвер для UEFI NVRAM.

  2. https://github.com/tianocore/edk2/blob/7c0ad2c33810ead45b7919f8f8d0e282dae52e71/MdeModulePkg/Universal/FaultTolerantWriteDxe/FaultTolerantWriteDxe.c - отдельный FTW-драйвер, используемый предыдущим для безопасной работы процедуры Reclaim, т.е. сборки мусора, для которой не нужно дополнительное хранилище такого же размера, а достаточно меньшего по размеру FTW-блока.

Не понял вопроса такой постановке. По поводу того, какие дополнительные фичи простого Non-Volatile Storage сделают его полноценной NVRAM - вот здесь писал.

https://github.com/tianocore/edk2/blob/7c0ad2c33810ead45b7919f8f8d0e282dae52e71/MdeModulePkg/Include/Guid/VariableFormat.h#L97

#define VAR_IN_DELETED_TRANSITION  0xfe     ///< Variable is in obsolete transition.
#define VAR_DELETED                0xfd     ///< Variable is obsolete.
#define VAR_HEADER_VALID_ONLY      0x7f     ///< Variable header has been valid.
#define VAR_ADDED                  0x3f     ///< Variable has been completely added.

Физический смысл: отделить валидные переменные от тех, которые пока еще не валидные (запись еще не закончена или была прервана по каким-то причинам) и тех, которые перестали быть валидными (в переменную было записано новое значение, а старое еще не убрали).

Как интерпретировать: https://github.com/tianocore/edk2/blob/7c0ad2c33810ead45b7919f8f8d0e282dae52e71/MdeModulePkg/Universal/Variable/RuntimeDxe/VariableParsing.c

Я не работаю над Asahi Linux (это было бы конфликтом интересов), но принимаю участие в обеспечении возможности загрузки нескольких ОС разных версий, запуска кастомных ядер и т.п.

Там забавно с MIA тоже, потому что внутри Intel по ее использованию нет консенсуса и потому в разных линейках там кто во что горазд, даже Arm завезли недавно. ISH аппаратно очень похож на МЕ и даже подключен примерно к тем же шинам (они его на замену отдельного EC планировали, и это даже используется на полутора хромобуках).

Про легенд и т.п.: не боги горшки обжигают, да и это все не мы с тобой придумали, и потому никакой разницы в этом смысле между нами нет, что один документацию повторяет, что второй, ну может у меня баек немного больше накопилось за все годы ныряния в эту субстанцию, но у тебя тоже они накопятся неминуемо, если продолжишь нырять.

Соседняя статья про плюс-минус то же самое (кучно пошло в этот раз): https://habr.com/ru/articles/730240/

Про MITM - посмотрите вот эту презентацию, она как раз про MITM-атаку через эмулятор SPI-флеша и про то, что именно BootGuard сломать не вышло - его писали люди, которые в курсе, а вот все, что было сразу за ним - сломалось без проблем.

Это особенности реализации, мало кому интересные по сути.

Можно подключить вместо настоящей флешки эмулятор вроде Samedisk ZC25128 или DediProg EM100, включить в нем логирование доступа, и посмотреть самому. Есть еще открытый эмулятор SpiSpy за авторством товарища Треммела Хадсона с презентацией на видео, из которой можно достать вот эту отличную картинку:

На ней нет предшествующего всем шагам опроса SFDP, потому что она именно про доступ к физическим адресам, но он там подразумевается, т.к. современные процессоры с архитектурой х86 с флешей без поддержки SFDP не стартуют начиная с приблизительно 2011 года.

Поправлю немного про МЕ, потому что там не 486, а т.н. Minute IA (это такой переписанный на верилоге с нуля гибрид 586 и 686 с несколькими неработающими из за бага префиксами, на той же архитектуре в свое время выпускали Intel Quark SoC). На MIA (и ядро, основанное на MINIX) перешли в поколении Skylake, до этого использовали архитектуру ARCompact и ОСРВ ThreadX.

Это достигается путем маппинг flash-памяти в адресном пространстве процессора

Вот тут согласование потерялось немного, лучше исправить на что-то вроде "путем отображения в адресное пространство процессора".

Немного подробностей про AMD на днях опубликовали вот в этом посте, openSIL тоже пока ждем.

Если кто заинтересовался подробностями, настойчиво посоветую пройти бесплатные курсы OpenSecurityTraining2, там отличные и материалы, и преподаватели (автор большей части курсов - Xeno Kovah, мой бывший тимлид, очень сильный специалист по безопасности прошивок и прочих низкоуровневых штук, а курс по UEFI ведет Piotr Krol, глава 3mdeb). Лучше материалов в сети практически нет.

Почему все такое ублюдское? Потому что озвучено профессиональными программистами.

Дело в том, что Линукс, если не считать ядро, которое пишут десяток корпораций поменьше, объединившись для того, чтобы их не съели другие две корпорации побольше (авторы остальных двух популярных ОС), написан практически целиком силами энтузиастов и для других таких же энтузиастов. Люди пилят миллиард своих маленьких проектов в этом лоскутном одеяле потому, что пилить свой проект - это весело. При этом веселее заниматься новым, чем поддерживать старое, веселее заниматься своим, чем поддерживать чужое, и самое главное - веселее бросить надоевшую в определенный момент идею ради реализации новой, более привлекательной.

Для того, чтобы сделать первые 80% работы, мотивация зачастую не требуется никакая, кроме внутренней ("йо-хо-хо, а давайте запилим свой DE!"). Оставшиеся 80% работы (это сарказм такой, если что) требуют экспоненциально растущей мотивации, на которую у энтузиастов нет ни времени, ни денег.

"Пилить хорошую реализацию" на последних этапах превращения "интересного нового ПО" в "хорошее работающее ПО" - это крайне скучное занятие для творческого ума, это бесконечные переписывания неудачных решений, борьба с затыками с производительностью, борьба с ошибками в UI и UX, борьба с нетривиальными багами, которые не проявляются сразу, а сидят молча и портят пользователями жизнь, и т.п. Бесплатно практически никто этим заниматься не станет - это тяжелая работа, с джаст-фор-фаном никак не связанная.

Все упомянутые вами технологии не были разработаны Васянами с горы, пишушими по праздникам у себя из подвала. X11 - MIT/DEC/IBM, ELF - AT&T Unix SVR4, Git - Linus Torvalds, Qt - Trolltech/Nokia/QtCompany. Чуете подвох?

Основные причины: репутационные потери от незакрытых известных уязвимостей, требования регуляторов, abundance of caution, оно же по русски дутье на воду после ожога на молоке.

Spectre V2 тоже в практическом смысле совершенно не опасная уязвимость с точки зрения пользователя, но защиту от нее таки включили во всех мейнстримовых ОС по умолчанию, даже если это привело к существенной потере производительности.

Если коротко, до пользователя конечного мало кому есть дело, он процессоры вагонами не закупает и потому корпорации интересен мало. Исправления эти полезны операторам дата-центров и облаков, а то, что они цепляют всех остальных - ну вот так, се ля ви, не нравится - у конкурента покупайте, какие могут быть вопросы.

Задача исследователей была как раз в том, чтобы вывести процессор на такие закритические режимы, чтобы его нормально работающие при нормальных условиях механизмы безопасности буквально сошли с ума от недостатка питания. И процессор им это позволил без проблем, в чем собственно уязвимость и состоит.

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

Если же вопрос в том, почему нельзя разрешить, скажем, андервольт на 0.1В, и запретить какие-то совсем неадекватные значения - непонятно, по какой границе проходит эта самая адекватность, и как доказать, что она проходит именно по ней. В результате выбрали режим "по умолчанию", да так и оставили, а если атакующие найдут способ добиться каких-то заметных результатов повышением напряжения - по умолчанию запретят и его, если еще не запретили.

Так и есть, но за безопасность от пользователя платят другие корпорации, а платят они потому, что иначе поставщики контента этот самый контент будут доставлять в низком разрешении и с низким битрейтом, если будут вообще. Устройство, на котором не работают стриминговые сервисы - это в нынешнее время практически бесполезный кусок железа для огромного количества пользователей, поэтому DRM, TDX, и прочая защита корпораций от пользователя - они производителям железа фактически навязаны производителями контента. Не будут брать - отключим газ.

Вообще, практика показывает, что устройства с закрытыми экосистемами, в которых пользователь является атакующим по умолчанию - они в некоторых нишах не только прибыльны, но и буквально выдавливают из них более открытых конкурентов. Xbox Series X, который с точки зрения железа - практически обычный ПК, а с точки зрения ОС - практически обычный ПК с Windows и HyperV, стоит 500 долларов (т.е. продается в убыток), а аналогичный по производительность игровой ПК стоит уже 1500 долларов (и продается 5% наценкой хорошо если). На ПК при этом не нужно платить за онлайн-подписку, игры можно пиратить или покупать в десятке разных сторов на распродажах сильно дешевле, в онлайн-играх можно читерить, в оффлайн-играх можно редактировать память и собирать все ачивки одной кнопкой, в общем полная свобода и анархия, гуляй рванина! И несмотря на это все, консоли остаются популярными даже если на них практически не осталось эксклюзивов (не говоря уже про японские Sony и Nintendo, которые эксклюзивами в основном и интересны). Люди готовы платить деньги за удобство, отсутствие вирусов и читеров, и даже низкий фреймрейт и невозможность тонкой настройки игр и железа их не пугает.

Мне самому эта ситуация очень сильно не нравится, и я всеми силами стараюсь сохранить системы, над которыми работаю, максимально открытыми для изменений. Пока что получается, и Asahi Linux - хорошее практическое доказательство этому. Тем не менее, работы еще непочатый край, и вести ее с каждым годом легче не становится, потому что закрытые экосистемы - это контроль, контроль - это деньги, а деньги очень нужны держателям акций, ради блага которых работает при капитализме любая корпорация, даже самая добрая, волшебная и социальная.

Ну с андервольтингом конкретно проблемы возникли после широко известной в узких кругах уязвимости Plundervolt, которую действительно на существующих процессорах иначе чем запретами не получится решить. И не реагировать на нее тоже нельзя - это репутационные потери, проблемы с государственными заказчиками (которые требуют при закупках закрытия известных уязвимостей), и т.п. В итоге пострадали в основном простые пользователи, у которых отобрали удобную фичу во имя безопасности, тот самый security-convenience-tradeoff, в перекосом то в одну сторону, то в другую.

Брюки превращаются... превращаются брюки... в элегантные шорты!

На машинах HP поновее можно было бы наткнуться на SureStart, который на замену одного МЕ региона на другой скорее всего начал бы громко ругаться, и пришлось бы либо шить две микросхемы вместо одной, либо пояснить EC, у кого здесь паяльник и ружье.

Спасибо Intel за то, что не фьюзит эти настройки намертво, не слишком яростно скрывает свой инженерный софт, и иным образом закрывает глаза на подобного рода вещи.

На большинстве материнок есть штатный разъем для программирования SPI NOR, либо подсистема для его программирования через EC или другой какой-либо управляющий чип. ASUS BIOS Flashback, Asrock Flashback, имя им легион. В крайнем случае можно заменить микросхему на подходящий для нее ZIF-сокет, если по высоте пройдет. На ноутбуках я всей этой фигней заниматься все равно не рекомендую, они нынче очень плотно упакованы и лишний раз их даже открывать опасно - оторвешь какие-нибудь пластиковые лапки, или шлейф толщиной в десятую миллиметра порвешь...

Почему сломались перед фирмварью: очень мало смысла что-то делать с ПО, которое практически полностью умирает, отработав. Да, от него остаются всякие ACPI-таблицы, рантайм сервисы и прочие данные SMBIOS и обработчики SMI, но по факту для ОС, если она не собирается с прошивкой разговаривать каким-либо образом, прошивка все также прозрачна. Да, какие-то куски памяти помечены как "занято тут", но оно и раньше так было, и теперь карту памяти не нужно получать через int 15h. В итоге Линукс, в основном, и так нормально загружается, что сразу уменьшает количество желающих ковыряться в прошивке раз примерно в сто. Дальше там вступает в игру тот факт, что нижняя часть прошивки, та, что память тренирует и железо основное инициализирует - она документированна, но так, что от этого никакого толку. Вся тренировка - это нынче проприетарная магия-магия-магия-магия, опа, память нашлась. Причем на современных процессорах AMD эту тренировку проводит прошивка Platform Security Processor'а, которая подписана и зашифрована. Все эти вопросы - решаемые, понятно, но к моменту, когда они решены, платформа успевает устареть на 3-5-10 лет, и больше не нужна никому, кроме самых отбитых энтузиастов открытости всего на свете. Рекомендую посмотреть на список железа, поддерживаемого проектом libreboot, который является форком coreboot без единого проприетарного компонента.

Я не могу сказать, что coreboot, LinuxBoot, oreboot и прочие альтернативы UEFI провалились, и я сам с 2019 года участвую в разработке прошивки для Apple Silicon HW, в которой от UEFI нет ничего вообще, и мой кусок мне нравится намного больше, чем UEFI SecureBoot, и авторы Asahi Linux согласны, по пока что всем альтернативам сильно не хватает того уровня стандартизации и поддержки индустрией, которую Intel сотоварищи обеспечили за прошедшие 20 лет для UEFI. "Безобразно, но единообразно". Более того, UEFI, как уже писал выше, это просто интерфейс, и реализовывать его может хоть PI-совместимая прошивка на базе EDK2 (как сейчас на большей части х86-машин сделано), так и любая другая, у Asahi этим U-Boot занимается, например.

Про UEFI с точки зрения ОС: по сути именно в ОС (т.е. не в загрузчике) там доступны только UEFI Runtime Services, которых немного, и они после UEFI 2.8 опциональные решительно все. Почитайте там про них сами, там немного совсем, а то этот коммент еще больше делать придется.

Про программаторы и т.п. - там UEFI вообще не участвует никак, потому что с точки зрения записи на флешку, что там сейчас на ней волнует очень мало кого. Есть у меня статейка про CH341A, но там с тех пор и софт сильно улучшился, и во flashrom поддержку этого программатора добавили, и вообще жизнь стала лучше и веселее. Вообще рекомендую пойти на Win-Raid и почитать там все подряд.

С точки зрения любой нормальной ОС, чем меньше приходится полагаться на непонятный кусок потенциально глючного и сильно устаревшего говна - тем лучше, поэтому они продолжают инициализировать все железо сами, кроме того, до которого не могут по каким-то причинам дотянуться. Никаким "драйверами" из UEFI, кроме супер-специальных случаев Platform Reset'а, ACPI Sleep States, и прочих подобных, ОС не пользуются, потому что на них надёжа - как на ёжа.

Давайте по порядку, начиная с буткитов: буткиты для BIOS были ничуть не менее задорные, и для их распространения можно было вообще не заморачиваться записью на флеш (а она была перезаписываемой давно уже, просто туда действительно меньше писали в те времена, когда на все настройки хватало 128 байт CMOS SRAM). UEFI - это просто интерфейс, причем интерфейс объективно неплохой, по сравнению с тем 16-битным уебищем, которое он заменил. Да, можно было намного лучше, и жуткую дрянь заменили на чуть менее жуткую, но прогресс там очень заметный, в смысле безопасности практической тоже.

Про статью: непонятно, про что там писать в этой статье. Образ современной прошивки для Intel и AMD делится на регионы, и на одной микросхеме SPI NOR Flash хранится несколько прошивок для разных устройств, часть их которых имеют свои собственные перезаписываемые регионы, в которых хранят всякие настройки, результаты тренировок, и прочие данные, которые медленно или неудобно каждый раз при загрузке генерировать заново. У UEFI PI-части это NVRAM, у CSME - MFS, у PSP - PSP_NV_AREA, и т.п.

Про перерезание дорожек: система ваша тут же станет колом и загружаться перестанет, дорожки придется восстанавливать. Сделать так, чтобы прошивка современная могла жить на RO-флеше - это сложная инженерная задача, и перезанием дорожек она не решается. Нужна ранняя эмуляция NVRAM, отключение ME через HAP-бит, и прочие танцы с бубном, чтобы система вообще смогла загрузиться, а потом еще придется как-то ей пояснять, откуда именно грузиться, потому что стандартный механизм BootOrder/BootXXXX как раз на перезаписываемом NVRAMе и основан. Можно сделать - можно, стоит ли овчина выделки - на мой взгляд, нет, если условия не специальные. Если интересно, посмотрите слайды к моей перезентации на ZN2015, там я делал плюс-минус похожую модификацию, но до полного RO дело доводить не стал - неудобно уже и так.

Про coreboot: Dasharo недавно смогли портировать его на относительно современную материнскую плату на Z690, не без помощи Intel Firmware Support Package, который им там память и тренирует, собственно, но тем не менее. Почему разработка заглохла - проект этот очень затратный с точки зрения времени и квалификации разработчиков, и при этом объективно мало кому нужен вне серверного рынка. Энтузиасты открытых технологий, зачастую, не имеют средств для оплаты труда этих самых разработчиков, а на одном энтузиазме такие проекты обречены на поддержку двух с половиной устаревших плат, и тех же двух с половиной OpenCompute-совместимых блейдов из недр Google, которые за coreboot на них могут заплатить.

Парадокс основной в том, что прошивка - это такое ПО, которое с точки зрения пользователя "ничего не делает", но при этом от его работы напрямую зависит, будет эта груда железа перед ним компьютером, или останется грудой железа. Т.к. потребительских свойств кроме "не ебет мозги" у продукта нет, то и конкуренции нет, и развития никакого нет, и те же самые проблемы с безопасностью, стабильностью, усталостью флеша, записью данных пес знает куда и т.д. и т.п., с которыми я воевал в 2013 году - они все еще с нами в 2023, и будут там еще лет 20, а то и 50. Предыдущий 16-битный ассемблерный пиздец тоже 30 лет похоронить не могли, и сейчас еще кое-где CSM по умолчанию включают...

Решал ту же задачу в октябре прошлого года, решил ее так:
1. https://openwrt.org/tag/802.11ax?do=showtag&tag=802.11ax - список всех устройств с WiFi 6, про которые на OpenWrt Wiki что-то написано. Его можно отфильтровать от неподдерживаемых, а затем выбрать то, что подходит по цене и фичам.
2. Остановился в итоге на Belkin RT3200, который стоял в Walmart на распродаже за $40 или около того. 5 портов Gigabit Ethernet, один порт USB 2.0, MT7622BV/MT7531BE, 1.35Ghz armv8, 512MB DRAM, 128 MB NAND.

Добавлю к уже сказанному, что к проблемам по ссылке выше недавно добавились еще и известные эксплуатируемые уязвимости в загрузчиках Windows, которые MS отказывается отзывать (при том, что загрузчики других ОС они при похожих условиях отзывали массово). Т.е. мало того, что SecureBoot и так никто не включал, кроме полутора анонимусов, так теперь еще и его конфигурация по умолчанию перестала выполнять свою основную функцию - защищать от выполнения вредоносного кода. Отлично, мужики, замечательная безопасная загрузка, и конкурсы интересные…

Информация

В рейтинге
320-й
Дата рождения
Зарегистрирован
Активность

Специализация

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