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

Firmware Security Engineer

Send message
Это потому, что отладочный вывод в декодируемые на LPC IO-порты 0x2F8-0x2FF доступен очень рано и делается буквально парой ассемблерных команд, и это очень помогает в отладке прошивки. Более того, если производитель материнской платы устанавливает на нее EC или SuperIO, пара UART-портов ему достается бесплатно, а если даже не устанвливает — несколько HSUART-портов есть в любом чипсете и SoC специально для отладочных целей.
В данном случае символ это означает собаку и используется для того, чтобы упомянуть известное графическое макро с собакой, раздающей плохие советы.
SMM — настоящее кольцо, у него свои IDT/GDT, свои права на доступ к памяти и устройствам, своя виртуализация и свой набор MSR-регистров, некоторые из которых доступны только из SMM.
ME — не кольцо, а микроконтроллер со своей архитектурой и прошивкой, имеющий доступ к памяти x86 через DMA.
Отличная статья, спасибо.

Поправлю немного по примечаниям:
4. Выбрать загрузочное устройство в  Windows 8 и Windows 10 очень просто, даже не имея пароля. На стартовом экране есть кнопка Power, которая открывает меню с Power off/Standby/Restart. Если нажать на Restart удерживая Shift, вместо перезагрузки произойдет переход в меню Troubleshooting, откуда можно перейти сначала на Advanced Settings, а затем и на Startup Settigs, где и выбрать следующее загрузочное устройство. Пишу по памяти и не имею сейчас доступа к машине с Windows, но когда я пробовал вышеописанное в последний раз пару месяцев назад — работало.
5. Лучше не создавать больше одного ESP (и не создавать ESP меньше 200 Мб, ограничение не жесткое, но некоторым старым загрузчикам не нравится), а просто сложить все загрузчики на один раздел. Efibootmgr действительно лучше не пользоваться, а вот UEFI Shell намного чаще приходится загружать с внешнего носителя, т.к. встраивать его себе в прошивку — потенциальная проблема безопасности, и потому не очень рекомендуется.

Нужно бежать на работу, потом допишу еще пару замечаний, когда смогу прочитать статью вдумчиво, а не на бегу.
Деваться им в этой ситуации некуда, так что пойдут как миленькие. У меня сейчас нет тестовой системы с Windows, чтобы проверить это утверждение, но я обязательно вернусь к этому вопросу, когда она появится.
Устраняется эта «неустранимая» уязвимость на всех машинах с ключом Microsoft KEK тем же обновлением, который закрывает уязвимость в загрузчике, путем добавления хешей уязвимых загрузчиков в переменную dbx, что запрещает их загрузку. Если же у вас свой собственный ключ в KEK — добавьте эти хеши самостоятельно.
В вашем примере нет модальности в интерфейсе. Кнопка приседания означает только приседание и ничего больше. А вот если у вас есть какая-то кнопка «мета», при нажатии на которую кнопка «приседание» теперь кнопка «сменить оружие на пистолет» — вот тут модальность в интерфейсе и появляется. На клавиатуре у нас такими оказываются CapsLock (на нем у меня смена раскладки), NumLock (всегда включен) и Scroll Lock (почти не пользуюсь). При этом, если раскладок становится больше двух (три, например, немецкая еще), то переключать их циклически, как предлагает ОС по умолчанию — это просто кошмар.
Ваша уверенность в том, что я не пробовал VIM и EMACS и не отказался от них сознательно — ни на чем не основана. Пробовал, остановился на альтернативах. Да, режимы в интерфейсах терпеть не могу и стараюсь избавляться от них там, где это возможно.
Не хотите спорить — дело ваше, вам удобно — на здоровье.
Стараюсь называть вещи своими именами. Модальная ерунда — это модальная ерунда, будь она хоть в любимом редакторе, хоть в интерфейсе микроволновой печи, хоть где-то еще. Любые режимы увеличивают когнитивную нагрузку, точка. Если вы готовы с этим мириться ради экономии времени на перенос руки на мышь или нажатие стрелок — имеете полное право. Более того, переход «ты ругаешь утилиту, ей пользуются люди и им нравится, значит ты ругаешь и этих людей тоже» — это демагогия, которая не имеет под собой логической основы.
Я живу и работаю в Баварии, в нашем офисе около 20 разработчиков железа, специалистов по board bring-up и разработчиков драйверов — ни VIM, ни EMACS я не видел нигде. Посещал офисы Bosch, Siemens, Vector и многих других — примерно та же ситуация. Откройте любой мало-мальски уважаемый редактор — и по умолчанию там никаких режимов нет, и VIM-режим там тоже никто по умолчанию не включает.
Спасибо за переход на личности первым же сообщением, отличный аргумент. Вы, конечно, понимаете и за себя, и за меня.
Все эти редакторы не вымерли, просто они такие же артефакты из прошлого, как sed и awk. Мощно? Не вопрос. Просто? Еще как. Нужно кому-нибудь? Конечно. Сколько людей пользуется сейчас для написания нового кода? Два с половиной.
Если у вас вот это перечисленное требует когнитивной нагрузки и выполняется сознанием — не завидую. В противном случае — не понимаю вашего сарказма. Любые режимы в интерфейсах — несомненое зло, и если их можно искоренить — их нужно искоренить.
Любая модальная ерунда — это повышение когнитивной нагрузки на пустом месте, ибо теперь нужно помнить не только то, какое именно действие выполняется по нажатию каждой клавиши, а еще и в каком режиме мы сейчас находимся, в какой режим мы теперь хотим, и как нам перейти в него. Кратковременной памяти мало и так, и в итоге шутка о том, что VIM, на самом деле, имеет два режима — «бибикать» и «портить всё» — уже не кажется смешной.
Более того, программирование от ввода текста отличается очень сильно, и от интегрированной среды разработки в первую очередь требуется не экономия на перемещении курсора, а интеллектуальный подсказки, итеграция с отладчиком, профилировщиком, анализаторами, системами управления версиями и остальными утилитами, необходимыми разработчику даже больше, чем собственно текстовый редактор. В IDE для разработки UEFI-совместимых прошивок AMI Visual eBIOS, например, есть мастер IRQ routing'а, генератор GUIDов, интерфейс для быстрой настройки PCI/SMBus/IOAPIC-устройств, интерфейс для управления build-токенами и другие вещи, нужные именно для разработки прошивки. Понятно, что все это можно добавить и в VIM или EMACS, только вот почему-то пока никто не собрался…
UEFI 2.1 трехлетней давности, в которой даже SecureBoot'а нет, а о безопасности какой-то слыхом не слыхивали. Вот тебе и производитель решений для индустрии…
Изините, господа, но нет.
Axiomtek — производитель, в первую очередь, CoMов, а SBC — это просто диверсификация.
И это только один чип, а не SoC с десятком встроенных устройств, двумя IOAPIC, IOMMU, контролером DDR4, который инициализирует встроенное ARM-ядро PMU с закрытой и подписанной прошивкой, с мостом PCI2PCI на каждой внешней PCIe-линии, и так далее, и тому подобное…
По поводу оплаты — Ланиту, я слышал, очень нужны сейчас специалисты по прошивкам, UEFI, U-boot'у и вот этому всему.
Дим, у всех продуктов, которые затронуты, EOL либо уже позади, либо завтра наступит. Это не SHNMV, это бизнес и ничего личного. Да и смысл реагировать на любые уязвимости в EDK1+, если там и без них — решето…
Не, Дим, по исходнику все же искать проще, поверь моему опыту. :) Если знать, что искать, на обнаружение совсем уж вопиющих случаев вроде твоего уйдет меньше пары минут, ибо синхронные SMI — все-таки пока еще звери довольно редкие, а во времена EDK1+ — вообще штук 5 на всю прошивку.
После того, как SAGE загнулась, я очень переживаю за судьбу этого во всех отношениях замечательного проекта. Когда-то давно некие люди из AMD обещали нам клятвенно поддержку coreboot в каждом релизе AGESA. Где она теперь…
Ученый в очередной раз изнасиловал журналиста, к сожалению.
Я не спорю, что баг серьезный, и этот конкретный баг — только первая ласточка среди всех проблем с синхронными SMI, которые ждут своего часа. Дело в том, что, как и в свое время а ассинхронными SMI, никто из разработчиков технологии не воспринимал её как вектор атаки, и потому ревью кода обработчиков синхронных SMI практически не проводилось, ибо все считали, что вызвать эти самые обработчики атакующий не сможет, он ведь не знает нужного хендла (SmmBase->Communicate) или GUIDа (SmmCommunicate->Communicate), и формат буфера ему тоже неизвестен, да и вообще, кому это надо все. А потом пришел Дима и не просто все сломал, а еще и выложил все карты на стол.
Но вернемся к изнасилованию: в нынешнем виде эксплоит является приложением для UEFI shell, т.е. этот шелл нужно еще запустить как-то, т.е. нужен физический доступ к машине и отключенный SecureBoot (привет коментаторам, которые его костерят). Чтобы обойти это ограничение, нужна собственная реализация Communicate, которая тоже будет работать только из UEFI OS (для legacy OS обработчики синхронных SMI диспетчером не вызываются вообще, такая своеобразная защита от дурака). Сделать это можно, и я не сомневаюсь ни на секунду, что Дима это рано или поздно сделает, но сейчас поводов для паники нет никаких.
Более того, на платах Gigabyte, Asrock, ASUS, и прочих десктопных платах такого рода этот конкретный эксплоит вообще не имеет значения, ибо там можно достичь того же эффекта (получить полный доступ к SPI flash) значительно более простыми способами, так что эксплоит, даже если он на этих устаревших платах и работает, опасности для них не представляет, ибо нет смысла просачиваться через вентиляцию, когда у тебя либо двери вообще нет, либо ключ от нее — под ковриком.
Отдельно хочу возразить людям, которые в очередной раз убеждают меня в том, что современное железо буквально само инициализируется и там хватит микрокода на пару килобайт, а остальное все Великий и Открытый Линукс сделает за нас. Почти год, ребята. Почти год своей жизни, работая 40 часов в неделю, я потратил на то, чтобы довести плату conga-TR3 из состояния голое мертвое железо до состояния прошла все тесты и готова к массовому производству, имея при этом всю документацию, референсную реализацию UEFI и поддержку со стороны AMI и AMD. Если вы можете сделать то же самое хотя бы за полгода — подавайте резюме в любую компанию, Apple/Microsoft/Dell/HP/Lenovo/etc, любую — и вас там оторвут с руками, предложив не меньше $200к в год, релокацию, жилье, шахматы и поэтесс. И напишите мне оттуда потом, чтобы я еще сильнее загрустил, что тормоз такой.

Information

Rating
Does not participate
Date of birth
Registered
Activity

Specialization

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