1. BURMALDA20.04.2024 в 04:34от
Загрузка...

Замена BIOS на Coreboot(Копипаст полезный)

Тема в разделе "Защита ПК", создана пользователем unknown84, 22.05.2019.

  1. unknown84

    Memento mori
    unknown84

    Статус:
    Оффлайн
    Регистрация:
    30.05.13
    Сообщения:
    324
    Репутация:
    511 +/-
    Речь пойдет про устранение закладок которые таит в себе современное железо, которые нельзя обойти просто используя открытую операционную систему. Обсуждение было в отдельной теме на форуме, вот еще неполный список возможных угроз. Конечно можно купить ноутбук без 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 CPUS=$(nproc)
    2. Программатор CH341A с проводом-прищепкой-SOIC8

    Смотрим Видео по работе с программатором (тысячи их там же), самое важное соблюдать нумерацию, все 1 (они же — единицы, они же — ключи) подключать между собой. То есть:
    [​IMG]
    Красный провод идущий к прищепке это 1.
    Площадка к которой крепится провод также содержит нумерацию и красный провод должен быть соединен к 1 на площадке.
    Затем, смотрим на программатор (USB разъем смотрит влево): на программаторе снизу справа есть выбор 25XX или 24XX, справа вверху — будет 1, как указано в подсказке там же), поднимаем лапку вверх и площадку устанавливаем в левую часть, надежно вставили и опустили лапку вниз. Смотрите видео если вдруг непонятно.
    Также 1 это ключ (выемка или углубление) чипа на материнской плате ноутбука (в который зашит BIOS), соответственно 1 к 1 т. е. красный провод прищепки должен соединяться к ножке рядом с этой выемкой.
    [​IMG]
    И последнее что важно помнить, сначала убеждаемся, что на устройстве которое мы собрались прошить нет питания (отсоединена внешняя батарея, зарядка, внутренняя батарейка), потом подключаем прищепку к чипу, только после этого вставляем программатор в 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. Их два, находятся примерно под тачпадом. Выглядят вот так:
    [​IMG]
    Верхний на 4 МБ, нижний на 8 МБ. Считывать и прошивать будем оба.

    7) Считайте своими глазами (опционально: с помощью лупы, а если чипы заляпаны аккуратно протрите их тканью) и запишите где-нибудь буквы и цифры которые указаны на этих чипах, например "MX25L3206E" и "MX25L6406E", они нам понадобятся на следующем этапе.
    Процесс прошивки
    Многие команды терминала взяты отсюда. Видеопроцесс прошивки через Raspberry.

    1. Делаем backup ВЕРХНЕГО чипа заводской прошивки
    Присоединяем прищепку к верхнему чипу. Помним, что красным проводом к выемке на чипе и все остальное о чем сказано выше. Как только соединение выглядит надежно вставляем программатор в порт нынешнего ноутбука или ПК. Выглядеть это будет примерно так:
    [​IMG]
    (отличие будет только в способе крепления прищепки к программатору)
    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:~$ cp ~/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) Устанавливаем следующие настройки, сохраняем и выходим:
    [​IMG]
    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
    И сверяем вывод с этой таблицей:
    [​IMG]
    Если результат такой же как в первой колонке («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.