UEFI — хронология печали.

Posted: 2017-04-14 in Hardware, IT
Метки:, , ,

Начну с одной относительно малоизвестной цитаты.
«Вообще сама идея нажимать кнопки в том же самом месте, где должны появляться буквы (на экране) — нищебродна чуть более, чем полностью. На мой взгляд, совмещать устройство ввода и вывода — это как заваривать чай в унитазе.»

Это в качестве вступительной шутки.

Совмещать же в одной флеш-микросхеме критически важный загрузчик, код интерфейса и конфигурационные данные — кощунство ещё большее. Да, это дёшево в разработке. Да, так построены прошивки подавляющего большинства роутеров и прочих малых сетевых девайсов, типа камер, сетевых хранилищ и умных телевизоров.
Когда микросхема делится на партиции, в первую пишется загрузчик, во вторую — сама прошивка, в третью — конфиг, в четвертую — ещё что-то.
И это даже работает. Но ровно до того момента, пока ЭТО серьёзно не трогают или не начинают там находить уязвимости пачками.
Сейчас взломанными роутерами и спамящими IP-камерами никого не удивить. Но там само устройство относительно простое (относительно!!), прошивка не сильно крупная, и кроме этой прошивки на таком девайсе ничего больше не запускается, или же набор софта сильно ограничен и имеет свою специфику.

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

1980-е / начало 90-х.
Изначально загрузочный код для материнской платы писался в ПЗУ — писался один раз на заводе, и поменять его можно было только стерев микросхему ультрафиолетом/на программаторе. Настройки либо не были предусмотрены вообще (совсем древние машинки типа реликтовых ныне XT), либо хранились в очень маленькой дополнительной микросхеме RAM, питаемой отдельной батарейкой. Важнейшие из них — последовательность загрузки, время, пароли, настройки диска, портов COM/LPT и прочего.

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

Поэтому уже во второй половине 90-х прошивка стала размешаться в перезаписываемой памяти — Flash-микросхеме BIOS. Все настройки хранились по-прежнему отдельно (CMOS) и поддерживались батарейкой. Однако тогда маркетологи ещё не допускались к разработке, и микросхема c прошивкой биос была аппаратно защищена от записи перемычкой. Это было гениальное в своей простоте ! Хочешь обновить биос-прошивку — переткни перемычку, разрешив запись. Прошей, и переткни назад. Это было абсолютно надёжно. Испортить прошивку на системе, где перемычка стояла в  RO — можно было разве что выстрелом из дробовика в упор. Но уже тогда производители положили первую мину — по-дефолту перемычка могла стоять в RW, а писать грозные алярмы о незазщищённом биосе и стопаться при загрузке, если перемычка была в RW — так никто и не придумал. Потом решили, что это слишком сложно, и вместо перемычки сделали опцию «Flash BIOS Write Protect» прямо в настройках. Некоторые особо параноидальные личности уже тогда подняли шухер, что добром это не кончится — софтовая настройка в CMOS могла быть переписана, и при следующей загрузке защита могла быть теоретически преодолена.

И гром таки грянул — написанный ещё в июне 1998 года вирус «Чернобыль» через примерно год, как раз на 26 апреля 1999-го, массово сработал примерно на  пол миллионе машин. Там, где был доступный на запись биос — машинка превратилась в тыкву. До кучи данная вирусня убивала данные на жёстком диске. Было это во времена расцвета Windows 9x (сейчас, в 2017, уже есть люди, которые даже не знают, как это нечто выглядело), и когда интернет был жутко медленный и жутко дорогой, и только по модему. Причём модем был ни разу не 4G, а траффик учитывался покилобайтно и приходил медленнее, чем работал дисковод на 5 дюймов =)
Уже тогда вирусы прекрасно ходили по машинам, хотя масштабы интернетов были несопоставимы с сегодняшними.

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

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

Прошло ещё несколько лет, и у микрософта ко второй половине 2000-х резко зачесалось выйти на стремительно проёбываемый мобильный рынок. Однако все их усилия, как мне показалось, были сосредоточены вовсе не на том, чтобы сделать клиентам хорошо, а исключительно на том, чтобы на их любимых девайсах с четырехцветным логотипом работала только виндовс и ничего кроме виндовс.
А то не дай бог, туда какой нерд/гик/фрик NetBSD впилит, и будет пугать неофитов микрософта ч0рной консолью =)  Под это дело МС вложила изрядное количество усилий в продвижение UEFI/EFI и ключевой для них фишки — SecureBoot.  Срач это вызвало нешуточный, и относительно утих он только тогда, когда стало понятно, что мобильный рынок проёбан для МС окончательно и поделен между гуглом и, как ни странно, ябблом. На десктопе они тоже мутили — были в продаже ноуты с трудноотключаемым секуре-бутом, куда поставить что-то отличное от виндовс было зело затруднительно. Случаи мани-бека по этой причине точно были.

В 2011 параноики снова обеспокоились — новомодная загрузка вызывала очевидные вопросы с безопасностью. А дальше как прорвало.

В 2013 шорох пошёл совсем уж фантасчиеский, и назывался он badBIOS. Сейчас, после Stuxnet и Duqu, удивление уже не столь сильно, но дыма без огня не бывает. Открытый на запись биос, несмотря на всю проприетарность, уже был почвой для развтия всяких изощрённых атак.

Ещё через два года уязвимости в UEFI стали находить пачками.

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

Один из любознательных пользователей Arch Linux столкнулся с непредвиденной проблемой, пытаясь провести эксперимент по выполнению «rm -rf —no-preserve-root /» на ноутбуке MSI GP60. Перед плановой переразбивкой диска пользователь решил понаблюдать как поведёт себя система в случае выполнения «rm -rf /», после чего ноутбук пришёл в неработоспособное состояние и перестал подавать признаки жизни, даже не пытаясь вывести что-то на экран при включении.

Проблема оказалась в монтировании в режиме записи псевдо-ФС efivarfs, предоставляющей доступ к переменным UEFI. Таким образом, при выполнении «rm -rf /» удалялось и содержимое директории /sys/firmware/efi/efivars, что приводило к очистке и повреждению конфигурации UEFI.

То есть даже не потребовалось никаких специальных инструментов. Окирпичить ноут удалось одной стандартной командой.

А буквально на этой неделе новость совсем «радостная» появилась:
Появился полноценный UEFi-троян, работающий на материнках жижабуте.

Вот так за ~30 лет дубовая и надёжная, как автомат Калашникова, система загрузки превратилась в хрупкое хипстерно-гламурное говно с троянами, системой FAT и открытыми на запись переменными аппаратной конфигурации.

Обсуждение закрыто.