Паранойя на марше: замена BIOS на Coreboot ¶
By: PRSG on 2019-03-12 11 ч.
Паранойя на марше: замена BIOS на Coreboot
Пара вступительных слов
Приветствую, форумчане! По не самым радужным причинам почти два года не имел возможности сюда зайти. За это время пришлось переосмыслить самые разные жизненные аспекты, и многое пересмотреть. На день рождения Runion захотелось чем-то с вами поделиться. Электронщики 80lvl вряд ли найдут здесь нечто новое, но надеюсь сподвигну среднепродвинутого пользователя на устранение серьезной дыры в безопасности. Скромно замечу, что на русском языке не нашел ничего подобного и настолько подробного.
Речь пойдет про устранение закладок которые таит в себе современное железо, которые нельзя обойти просто используя открытую операционную систему. Обсуждение было в отдельной теме на форуме, вот еще неполный список возможных угроз. Конечно можно купить ноутбук без Intel ME, но помимо него в заводском BIOS остается иной закрытый код вида "незнамочо". Много лет назад до этого додумались хорошие люди и разработали свободные альтернативы BIOS: Coreboot и Libreboot.
"Рыночек порешал", в продаже есть проошитые ноутбуки. Однако, по множеству причин это лучше делать самому. От "зачем кормить барыг" и все равно когда выйдет обновление придется изучать процесс чтобы перешивать самостоятельно. До например, вы не можете идти на почту и банковской карты у вас тоже нет. Также, если в вас дух исследоваталя и экспериментатора сильнее сиюминутной потребительской страсти, предлагаю к ознакомлению и повторению эту статью.
Подбор компонентов
Все необходимое у вас либо уже есть, либо свободно продается в местных магазинах крупных городов. Нам понадобятся:
1. Ваш нынешний ноутбук или ПК
2. Программатор CH341A с проводом-прищепкой-SOIC8
Во многих мануалах используются Raspberry, но с программатором процесс на мой взгляд обстоит намного проще. Провод с прищепкой может быть дешевый китайский (как на фото ниже) или модные Pomona, разницы при редком использовании нет, берите какой найдете.
3. Малая крестовая отвертка и пластиковая карточка (например любая скидочная) для разборки ноутбука.
(опционально: тюбик термопасты, кисточка смахнуть пыль внутри, еще пригодится лупа если зрение не очень. Также если вы привыкли к такому подходу или если делаете устройство для кого-то, то пара нитриловых перчаток)
4. Прямые руки, внимательность, запас терпения и времени
5. Устройство, которое мы будем прошивать — я выбрал ноутбук. Для удобства далее он иногда будет именоваться "ноутбук-пациент"
Большой Брат позаботился о нас настолько, что заменить проприетарный BIOS и заодно отключить Intel ME можно на очень небольшом списке устройств.
Примерный список подходящих ноутбуков выглядит так:
Coreboot: Lenovo ThinkPad X201, X220, X230, T420, T430 (полный список устройств здесь)
Libreboot: Lenovo ThinkPad X60, X60s, X60 Tablet, X200, X200 Tablet, R400, T400, T500, Apple MacBook 1.1 и 2.1, Asus Chromebook C201 (полный список устройств здесь)
(не все устройства из списков и железо в них поддерживаются полностью, подробнее узнаете там же по ссылкам)
Разница между ними следующая:
Coreboot — свободная альтернатива BIOS с открытым исходным кодом, лишь некоторые небольшие участки кода берутся из заводского BIOS ("блобы", степень их опасности и подробности здесь).
Libreboot — тоже самое, но без этих блобов, т. е. только полностью открытый код и чуть более простой процесс прошивки. Минус в том, что железо которое он поддерживает менее производительное и его сложнее найти в приемлимом состоянии. Еще он не поддерживает Windows, если вам вдруг это важно.
По итогу полученные профиты от перепрошивки:
открытый код
выпиливается Intel ME
загрузка ОС происходит быстрее
возрастает безопасность, в обращении с ОЗУ например
удаляется "одобренный список" Wi-Fi адаптеров присутствующий во многих ThinkPad, т. е. появится возможность использовать адаптеры с открытыми драйверами
полнодисковое шифрование становится действительно таковым, /boot раздел также можно зашифровать (нужно выбрать GRUB в качестве Payload)
код Coreboot/Libreboot занимает существенно меньше места, в освободившееся место можно воткнуть небольшую ОС типа KolibriOS, или игры вроде тетриса (основная причина почему я вообще в это ввязался) т. е. загрузить их можно без флешек и жестких дисков
Изначально я хотел именно Libreboot, но не нашел подходящей для него модели в приличном состоянии. Я искал с живучей батареей и, на всякий случай, с процессором который не поддерживает Intel vPro (проверить — вбить модель в этот поиск), попался под руку Lenovo ThinkPad X230. Для него подойдет Coreboot и после прошивания останутся несколько блобов и будет возможность запуска Windows (с внешнего диска, например) если выбрать SeaBIOS. Именно на примере X230+Coreboot будет описано данное руководство. Когда-нибудь и этот ноутбук придется менять и я дополню статью таким же опытом уже с Libreboot, будем надеяться у меня будет такая возможность.
Подготовка компонентов
1. Ваш нынешний ноутбук или ПК
Я использовал live образ Debian 9, возможно подойдут и другие дистрибутивы, проверяйте сами. Открываем терминал.
(Напоминаю для новичков, что команду нужно копировать после значка "$" и затем вставлять в терминал).
1) Устанавливаем необходимые пакеты:
user@debian:~$ sudo apt update && sudo apt upgrade
user@debian:~$ sudo apt install -y bison build-essential curl flashrom flex git gnat libncurses5-dev m4 zlib1g-dev
2) Создаем 2 папки:
user@debian:~$ mkdir -p ~/X230/bios-backup
3) Готовим Coreboot:
user@debian:~$ cd ~/X230/
user@debian:~/X230$ git clone https://review.coreboot.org/coreboot
user@debian:~/X230$ cd coreboot
user@debian:~/X230/coreboot$ git submodule update --init --checkout
user@debian:~/X230/coreboot$ make crossgcc-i386 *****US=$(nproc)
2. Программатор CH341A с проводом-прищепкой-SOIC8
Смотрим Видео по работе с программатором (тысячи их там же), самое важное соблюдать нумерацию, все 1 (они же — единицы, они же — ключи) подключать между собой. То есть:
Красный провод идущий к прищепке это 1.
Площадка к которой крепится провод также содержит нумерацию и красный провод должен быть соединен к 1 на площадке.
Затем, смотрим на программатор (USB разъем смотрит влево): на программаторе снизу справа есть выбор 25XX или 24XX, справа вверху — будет 1, как указано в подсказке там же), поднимаем лапку вверх и площадку устанавливаем в левую часть, надежно вставили и опустили лапку вниз. Смотрите видео если вдруг непонятно.
Также 1 это ключ (выемка или углубление) чипа на материнской плате ноутбука (в который зашит BIOS), соответственно 1 к 1 т. е. красный провод прищепки должен соединяться к ножке рядом с этой выемкой.
И последнее что важно помнить, сначала убеждаемся, что на устройстве которое мы собрались прошить нет питания (отсоединена внешняя батарея, зарядка, внутренняя батарейка), потом подключаем прищепку к чипу, только после этого вставляем программатор в USB-разъем текущего ноутбука или ПК. Отключение в обратном порядке — вытаскиваем программатор, затем снимаем прищепку.
3. Ноутбук-пациент для прошивки
1) Первым делом обновляем заводской BIOS до последней официальной версии.
(необязательно, но на всякий случай я это сделал: настройки BIOS сбросил на заводские и разрешил прошивку)
2) (опционально) Если хотите сделать апгрейд железа лучше всего для начала протестировать работу новых компонентов на заводском BIOS. И только после этого приступать к прошивке Coreboot.
3) Отсоединяем зарядку и батарею, после этого (опционально: одеваем перчатки) приступаем к разборке ноутбука:
Видео по разборке (тысячи их)
Официальные мануалы:
User Guide
Hardware Maintenance Manual (ниже указаны страницы по оглавлению)
4) Разобрав ноутбук-пациент выкидываем из него лишние детали (не во всех исполнениях все это есть):
WLAN — с. 68 — все встроенные варианты Wi-Fi адаптеров этого ноутбука требуют проприетарные драйвера, они будут работать на том же Tails (привет "параноикам") так как там полно блобов для поддержки различного оборудования, но не заработают на чистом Debian. Заменить их на адаптеры использующие свободные драйвера и поддерживающие смену MAC адреса, это или адаптеры фирмы Atheros (AR9285, AR9382 и т. п.), или USB-адаптеры (различных размеров и функционала на любой вкус).
WWAN — с. 70
Bluetooth — с. 74
Сканер отпечатков пальца — расположен рядом с тачпадом, откручивается элементарно или просто отсоединяется шлейф.
Микрофоны — с. 88 — их два, находятся на планке вместе со светодиодами. Удаляются вместе с планкой.
Камера — с. 86
(опционально: удаляем кисточкой пыль, меняем термопасту)
5) Отсоединяем внутреннюю батарейку (с. 65).
6) Находим чипы в которых записан текущий BIOS. Их два, находятся примерно под тачпадом. Выглядят вот так:
Верхний на 4 МБ, нижний на 8 МБ. Считывать и прошивать будем оба.
7) Считайте своими глазами (опционально: с помощью лупы, а если чипы заляпаны аккуратно протрите их тканью) и запишите где-нибудь буквы и цифры которые указаны на этих чипах, например "MX25L3206E" и "MX25L6406E", они нам понадобятся на следующем этапе.
Процесс прошивки
Многие команды терминала взяты отсюда. Видеопроцесс прошивки через Raspberry.
1. Делаем backup ВЕРХНЕГО чипа заводской прошивки
Присоединяем прищепку к верхнему чипу. Помним, что красным проводом к выемке на чипе и все остальное о чем сказано выше. Как только соединение выглядит надежно вставляем программатор в порт нынешнего ноутбука или ПК. Выглядеть это будет примерно так:
(отличие будет только в способе крепления прищепки к программатору)
1) Идем в папку:
user@debian:~$ cd ~/X230/bios-backup
2) Читаем (пока только читаем) ВЕРХНИЙ чип:
user@debian:~/X230/bios-backup$ sudo flashrom -p ch341a_spi
3) Вывод должен быть таким:
Calibrating delay loop... OK.
Found Macronix flash chip "MX25L3205(A)" (4096 kB, SPI) on ch341a_spi.
Found Macronix flash chip "MX25L3205D/MX25L3208D" (4096 kB, SPI) on ch341a_spi.
Found Macronix flash chip "MX25L3206E/MX25L3208E" (4096 kB, SPI) on ch341a_spi.
Found Macronix flash chip "MX25L3273E" (4096 kB, SPI) on ch341a_spi.
Multiple flash chip definitions match the detected chip(s): "MX25L3205(A)", "MX25L3205D/MX25L3208D", "MX25L3206E/MX25L3208E", "MX25L3273E"
Please specify which chip definition to use with the -c <chipname> option.
(Если вывод другой, значит вы что-то сделали не так, скорее всего нужно отсоединить программатор и проверить соединение прищепки к чипу. Потом снова повторить чтение).
Смотрим какое обозначение мы считали своими глазами с чипа, выбираем его группу из этого списка ("MX25L3205(A)", "MX25L3205D/MX25L3208D", "MX25L3206E/MX25L3208E", "MX25L3273E") и эту группу дальше вставляем вместо моей.
4) Делаем ПЕРВЫЙ дамп ВЕРХНЕГО чипа:
user@debian:~/X230/bios-backup$ sudo flashrom -p ch341a_spi -r factory_top-1.bin -c "MX25L3206E/MX25L3208E"
5) Делаем ВТОРОЙ дамп ВЕРХНЕГО чипа:
user@debian:~/X230/bios-backup$ sudo flashrom -p ch341a_spi -r factory_top-2.bin -c "MX25L3206E/MX25L3208E"
6) Сверяем контрольные суммы дампов:
user@debian:~/X230/bios-backup$ sha512sum factory_top-*
Если суммы совпадают значит считали верно и идем к следующему шагу, если нет — начинаем все заново.
7) Вытаскиваем программатор, снимаем прищепку и переходим к следующему шагу
2. Делаем backup НИЖНЕГО чипа заводской прошивки
1) Читаем (пока только читаем) НИЖНИЙ чип:
user@debian:~/X230/bios-backup$ sudo flashrom -p ch341a_spi
2) Вывод должен быть таким:
Calibrating delay loop... OK.
Found Macronix flash chip "MX25L6405" (8192 kB, SPI) on ch341a_spi.
Found Macronix flash chip "MX25L6405D" (8192 kB, SPI) on ch341a_spi.
Found Macronix flash chip "MX25L6406E/MX25L6408E" (8192 kB, SPI) on ch341a_spi.
Found Macronix flash chip "MX25L6436E/MX25L6445E/MX25L6465E/MX25L6473E" (8192 kB, SPI) on ch341a_spi.
Multiple flash chip definitions match the detected chip(s): "MX25L6405", "MX25L6405D", "MX25L6406E/MX25L6408E", "MX25L6436E/MX25L6445E/MX25L6465E/MX25L6473E"
Please specify which chip definition to use with the -c <chipname> option.
(Если вывод другой, значит вы что-то сделали не так, скорее всего нужно отсоединить программатор и проверить соединение прищепки к чипу. Потом снова повторить чтение).
Смотрим какое обозначение мы считали своими глазами с чипа, выбираем его группу из этого списка ("MX25L6405", "MX25L6405D", "MX25L6406E/MX25L6408E", "MX25L6436E/MX25L6445E/MX25L6465E/MX25L6473E") и эту группу дальше вставляем вместо моей.
3) Делаем ПЕРВЫЙ дамп НИЖНЕГО чипа:
user@debian:~/X230/bios-backup$ sudo flashrom -p ch341a_spi -r factory_bottom-1.bin -c "MX25L6406E/MX25L6408E"
4) Делаем ВТОРОЙ дамп НИЖНЕГО чипа:
user@debian:~/X230/bios-backup$ sudo flashrom -p ch341a_spi -r factory_bottom-2.bin -c "MX25L6406E/MX25L6408E"
5) Сверяем контрольные суммы дампов:
user@debian:~/X230/bios-backup$ sha512sum factory_bottom-*
Если суммы совпадают значит считали верно.
6) Вытаскиваем программатор, снимаем прищепку и переходим к следующему шагу
3. Сохраняем всю папку /bios-backup в надежное место, на случай если дальше что-то пойдет не так
4. Готовим прошивку Coreboot
1) Соединяем 2 дампа в один файл:
user@debian:~/X230/bios-backup$ cat factory_bottom-1.bin factory_top-1.bin > X230-bios.rom
2) Берем блобы из заводского BIOS для дальнейшего использования:
user@debian:~/X230/bios-backup$ cd ~
user@debian:~$ ***** ~/X230/bios-backup/X230-bios.rom ~/X230/coreboot/util/ifdtool/
user@debian:~$ cd ~/X230/coreboot/util/ifdtool/
user@debian:~/X230/coreboot/util/ifdtool$ make
user@debian:~/X230/coreboot/util/ifdtool$ ./ifdtool -x X230-bios.rom
user@debian:~/X230/coreboot/util/ifdtool$ mkdir -p ~/X230/coreboot/3rdparty/blobs/mainboard/lenovo/x230
user@debian:~/X230/coreboot/util/ifdtool$ mv ~/X230/coreboot/util/ifdtool/*.bin ~/X230/coreboot/3rdparty/blobs/mainboard/lenovo/x230
user@debian:~/X230/coreboot/util/ifdtool$ cd ~/X230/coreboot/3rdparty/blobs/mainboard/lenovo/x230
user@debian:~/X230/coreboot/3rdparty/blobs/mainboard/lenovo/x230$ rename 's/.{14}//' *.bin
user@debian:~/X230/coreboot/3rdparty/blobs/mainboard/lenovo/x230$ mv flashdescriptor.bin descriptor.bin
user@debian:~/X230/coreboot/3rdparty/blobs/mainboard/lenovo/x230$ mv intel_me.bin me.bin
user@debian:~/X230/coreboot/3rdparty/blobs/mainboard/lenovo/x230$ cd ~/X230/coreboot/
3) Компилируем нашу новую прошивку:
3.1) Выполняем команду:
user@debian:~/X230/coreboot$ make nconfig
3.2) Устанавливаем следующие настройки, сохраняем и выходим:
3.3) Выполняем команду:
user@debian:~/X230/coreboot$ make
(опционально) 4) Добавляем приоритет загрузки
После прошивки у нас не будет привычных настроек BIOS (все будет выглядеть совершенно иначе) например, необходимый мне приоритет загрузки нужно сформировать заранее и добавить в .rom до прошивки. Итак, в моем случае, приоритет по порядку: порты USB3.0, порт USB2.0, SATAIII, SATAII (слот WWAN в него можно установить SSD диск). Для этого:
4.1) Создаем файл:
user@debian:~$ nano ~/X230/coreboot/mybootlist.txt
4.2) Записываем в него и сохраняем:
/pci@i0cf8/usb@1d/hub@1/storage@1/*@0/*@0,0
/pci@i0cf8/usb@1d/hub@1/usb-*@1
/pci@i0cf8/usb@1d/hub@1/storage@2/*@0/*@0,0
/pci@i0cf8/usb@1d/hub@1/usb-*@2
/pci@i0cf8/usb@1a/hub@1/storage@2/*@0/*@0,0
/pci@i0cf8/usb@1a/hub@1/usb-*@2
/pci@i0cf8/*@1f,2/drive@0/disk@0
/pci@i0cf8/*@1f,2/drive@2/disk@0
4.3) Выполняем команды:
user@debian:~$ cd ~/X230/coreboot/util/cbfstool/
user@debian:~/X230/coreboot/util/cbfstool$ make
user@debian:~/X230/coreboot/util/cbfstool$ cd ~/X230/coreboot/
user@debian:~/X230/coreboot$ ./build/cbfstool build/coreboot.rom add -f mybootlist.txt -n bootorder -t raw
4.4) Проверим добавление:
user@debian:~/X230/coreboot$ ./build/cbfstool build/coreboot.rom print
Должна появиться строка "bootorder" ближе к концу списка.
5) Делим созданный .rom на две части (для каждого чипа свой .rom):
user@debian:~$ cd ~/X230/coreboot/build
user@debian:~/X230/coreboot/build$ dd if=coreboot.rom of=coreboot-bottom.rom bs=1M count=8
user@debian:~/X230/coreboot/build$ dd if=coreboot.rom of=coreboot-top.rom bs=1M skip=8
5. Прошиваем Coreboot
ВЕРХНИЙ ЧИП:
1) Читаем (пока только читаем) ВЕРХНИЙ чип:
user@debian:~/X230/coreboot/build$ sudo flashrom -p ch341a_spi
2) Если он не считался — проверяем соединение и т. д., если считался — прошиваем:
user@debian:~/X230/coreboot/build$ sudo flashrom --chip "MX25L3206E/MX25L3208E" --programmer ch341a_spi --write coreboot-top.rom
3) Вывод должен быть таким:
Calibrating delay loop... OK.
Found Macronix flash chip "MX25L3206E/MX25L3208E" (4096 kB, SPI) on ch341a_spi.
Reading old flash chip contents... done.
Erasing and writing flash chip... Erase/write done.
Verifying flash... VERIFIED.
4) Вытаскиваем программатор, снимаем прищепку и переходим к следующему шагу
НИЖНИЙ ЧИП:
1) Читаем (пока только читаем) НИЖНИЙ чип:
user@debian:~/X230/coreboot/build$ sudo flashrom -p ch341a_spi
2) Если он не считался — проверяем соединение и т. д., если считался — прошиваем:
user@debian:~/X230/coreboot/build$ sudo flashrom --chip "MX25L6406E/MX25L6408E" --programmer ch341a_spi --write coreboot-bottom.rom
3) Вывод должен быть таким:
Calibrating delay loop... OK.
Found Macronix flash chip "MX25L6406E/MX25L6408E" (8192 kB, SPI) on ch341a_spi.
Reading old flash chip contents... done.
Erasing and writing flash chip... Erase/write done.
Verifying flash... VERIFIED.
4) Вытаскиваем программатор, снимаем прищепку и переходим к следующему шагу
При последующих перепрошивках (в рамках Coreboot) нижний чип повторно прошивать не нужно, он остается без изменений. Также после первой прошивки чипы можно будет прошить без программатора, напрямую из системы, как в точности это делать пока не разбирался.
Проверка и дополнительные настройки
1) Соединяем клавиатуру, ОЗУ, батарею и проверяем включение ноутбука.
2) Теперь, дабы узнать це зрада чи перемога?" статус Intel ME, на прошитом ноутбуке-пациенте загружаемся в Debian (так как в моем примере live образ, то нужно снова установить необходимые пакеты и скачать код).
Выполняем следующие команды:
user@debian:~$ sudo apt update && sudo apt upgrade
user@debian:~$ sudo apt install -y git libpci-dev zlib1g-dev
user@debian:~$ git clone --depth=1 https://review.coreboot.org/coreboot
user@debian:~$ cd ~/coreboot/util/intelmetool
user@debian:~/coreboot/util/intelmetool$ make
user@debian:~/coreboot/util/intelmetool$ sudo ./intelmetool -m
И сверяем вывод с этой таблицей:
Если результат такой же как в первой колонке («Stock firmware») — ровняйте руки и начинайте процесс прошивки заново. Значения как в 3 и 4 колонках — Intel ME отключен.
3) Можно заодно проверить наличие и работу Intel AMT:
user@debian:~$ git clone https://github.com/mjg59/mei-amt-check
user@debian:~$ cd ~/mei-amt-check/
user@debian:~/mei-amt-check$ make
user@debian:~/mei-amt-check$ sudo modprobe mei_me
user@debian:~/mei-amt-check$ sudo ./mei-amt-check
В случае успеха должно выдать:
Unable to find a Management Engine interface - run sudo modprobe mei_me and retry.
If you receive the same error, this system does not have AMT
4) Если проверки пройдены успешно — отключаем ноутбук и полностью его собираем.
5) (опционально) Если часто работаете от сети и хотите как можно дольше сохранять ресурс батареи установите пороги зарядки батареи: зарядка начнется ниже 40% и продлится до 70%:
user@debian:~$ cd ~/coreboot/util/ectool
user@debian:~/coreboot/util/ectool$ make
user@debian:~/coreboot/util/ectool$ sudo ./ectool -w 0xb0 -z 0x28
user@debian:~/coreboot/util/ectool$ sudo ./ectool -w 0xb1 -z 0x46
Как задать иные пороги смотрим здесь. При отсоединении батареи эти настройки перестанут работать и нужно выполнять их заново или писать скрипт на автовыполнение.
6) (опционально) При включении ноутбука можно нажать клавишу Esc и выбрать цифрой "Payload [nvramcui]", в нем есть немного настроек, я применил такие:
gfx_uma_size=224M
wwan=Disable
bluetooth=Disable
fn_ctrl_swap=Enable
Для сохранения и выхода нажать F1.
7) Прежний Debian установленный на другом ноутбуке или свежеустановленный на этом ноутбуке (проверял дважды) — отказывается запускаться, нужно загрузить его с другого ноутбука и выполнить в терминале:
user@debian:~$ echo "i915" | sudo tee -a /etc/initramfs-tools/modules
user@debian:~$ sudo update-initramfs -u
Если у вас есть более элегантное решение без использования другого ноутбука, пожалуйста, поделитесь им.
8) (опционально) Если вместо SeaBIOS выбрали GRUB, можно установить дистрибутив с полнодисковым шифрованием включая раздел /boot.
Послесловие
Дописав я прошил снова заводской BIOS из снятых дампов и повторил снова уже по этой статье чтобы убедиться в ее работоспособности. Прошивка и проверка прошли успешно.
Критика и поправки строго приветствуются, наверняка можно сделать команды изящнее или я где-то ошибся в определениях, я только учусь.
Готов к тапкам в мой огород и к вашим вопросам.
Pseudo Random Shit Generator
Если вдруг кому-то в голову взбредет меня поблагодарить,
напишите в ящик, напишу btc адрес. Мой ключ прежний.