Coreboot practical usage lesson 01 [RUS]
Testing Coreboot on Thinkpad x201 practical task.
Language: Russian
! WARNING ! |
---|
* Данная информация была опубликована в Jun/2015 и скорее всего устарела. * На данный момент я только сконвертировал формат и внёс несколько мелких изменений. * Планируется выпуск продолжения с учётом новой информации. Напишите в комментариях если тема Вам интересна что бы ускорить процесс подготовки второй части.* Прошу обратить внимание: автор не несёт ответственности за порчу оборудования и не даёт гарантий работособоности system firmware на вашем оборудовании.* Если вы нашли ошибку или неточность - напишите мне об этом, если не трудно. |
План⌗
План выступления:
- why
- internals
- howto
- demo
Coreboot – Зачем?⌗
Для чего человеку в 201x году думать о system firmware (System BIOS):\
- баги на уровне firmware;
- желание расширить возможности firmware;
- желание иметь свободную firmware;
- security;
Coreboot – Зачем?⌗
Что должен сделать System BIOS:
- инициализировать аппаратное обеспечение;
- инициализировать нормальную работу SMM и ACPI;
- предоставить базовые функции для Legacy OS;
- загрузить
ROMBASICОС; - иногда - предоставить функции собственной ОС UEFI;
- иногда - предоставить идентификационные данные для некоторых ОС (OEM);
- иногда - предоставить функции восстановления себя и/или предустановленной ОС;
Coreboot – Зачем? Сравнение основных BIOS’ов⌗
Основные представители System BIOS для x86:
PC BIOS (legacy) | (U)EFI | Coreboot/LibreBoot | |
---|---|---|---|
language | Assembly | many | 96% ANSI C, 1% asm - rest shell |
mode | real | protected | protected |
license | Proprietary | Open partially | GPL |
Coreboot – Зачем? - Сложность темы:⌗
- нет подстраховки (no one will catch your exceptions)
- множество аппаратно-зависимой vendor specific информации\
- программирование без RAM;
- программирование без стека;
- ассемблер, ANSI C;
- real mode programming;
- тестирование;
Coreboot – Зачем? - Некоторые security векторы:⌗
- System BIOS имеет неограниченный доступ к hardware;
- при cold reboot RAM не очищается;
- код обработчика SMM выплняется на уровне > ядра ОС и НЕ является частью ОС;
- в env ОС UEFI можно записать из user space;
- GPU умеет ходить в RAM в обход CPU через DMA;
- BadBios
ADDED 2017/Nov:
- Уязвимость в UEFI-прошивках, позволяющая выполнить код в режиме SMM
- TinkPwn Git repo
- Geektimes - bloatware оказалось встроенным в BIOS ноутбуков компани Lenovo
- Wikipedia - known vulnerabilities and Exploits of IntelME
Coreboot – Зачем?⌗
Решение некоторых секурити проблем:
использовать бумагу и печатную машинку, а всю компьютерную технику сжечь- Использовать Свободную firmware;
- Разрабатывать свободные альтернативы проприетарного инициализирующего кода и проприетарных драйверов
- Развивать идею Secure Linux Boot
Coreboot – internals⌗
Первые шаги загрузки Coreboot(LINUXBIOS) v0.01 (1999)
- перейти в protected mode
- скопировать initramfs с GNU/Linux в RAM
- jump
Coreboot – internals⌗
Первые шаги загрузки Coreboot(LINUXBIOS) v0.01 (1999)
Coreboot – internals⌗
Первые шаги загрузки Coreboot(LINUXBIOS) v0.01 (1999)
Плюсы:
- Busybox with BASH shell in BIOS
- Protected mode “из коробки”
- Native Linux file systems support
- Меньше задач на Coreboot, больше на Linux
- Меньше задач - меньше кода
- Меньше кода - меньше багов
Coreboot – internals⌗
Первые шаги загрузки Coreboot(LINUXBIOS) v0.01 (1999)
Минусы:
- не работает на “современном” железе из-за Vendor specific условий инициализации RAM, South Bridge
- не работают PCI устройства из-за необходимости их дополнительно инициализировать
Coreboot – internals⌗
“Современный” вариант загрузки Coreboot(LINUXBIOS) v3 и v4 для Intel архитектуры x86
- переход в Protected Mode
- mainboard init 1 (FPU enable, SSE enable, Cache as RAM)
- mainboard init 2 (Vendor Specific code, Southbridge, init RAM (ROM stage)
- copy decompressed Coreboot in RAM
- jump to RAM entry point (start RAM stage)
- Initialize console, enumerate devices, ACPI Table, SMM handler (RAM stage)
- jump to payload entry
Кратко:
Исходя из чего, нужно понять, что Coreboot != BIOS/UEFI. Он предназначен для загрузки Payload (полезной нагрузки), где и будет происходить основная активность (загрузка ОС, сама ОС и т.д.)
Coreboot – internals - Payloads⌗
Payloads:
- SeaBIOS (old name - ADLO);
- OpenBIOS;
- OpenFirmware;
- GRUB2, FILO;
- TianoCore (UEFI);
- Etherboot / GPXE / iPXE;
- OS as payload: Linux, NetBSD, PLAN9;
- Depthcharge, Uboot, Explorer (Chromebooks payloads);
- Games: Tint, Invaders;
- Tests and info: Memtest86, Memtest86+, CoreInfo, nvramcui;
- Bayou (load menu for multiple payloads);
- Libpayload;
Coreboot – internals - example of “Hello world” payload⌗
Own Payload with libpayload:
#include <libpayload.h>
int main(void)
{
printf("Hello, world!\n");
halt();
return 0;
}
Coreboot – internals - history⌗
История проекта CoreBoot:
- существует с 1999 года как свободная GPLv2 firmware для кластерных решений (LINUXBIOS);
- 95,7% - ANSI C, 1,4% - Assembly, rest - C++, Perl, Shell, text files
- May/2015 219 new commits per 30 days (7.3 commits/day, 1 commit every 197 mins)
- с 2008 называется CoreBoot т.к. может загружать не только Linux, но и BSD и PLAN9
- с 2010 разрабатывается для Google для Chrome буков под x86
- http://coreboot.org
Coreboot – internals - supported hardware⌗
Заявленное поддерживаемое оборудование в CoreBoot v4 на May/2015:
- x86, x86_64, ARM, ARM64, MIPS
- 61 desktop MB
- 39 server MB
- 30 laptop MB (and some Apple)
- 33 embedded boards
- 17 Mini-ITX / Micro-ITX / Nano-ITX
- 7 Set-top-boxes / Thin clients
- QEMU
- more
Coreboot – HowTO - before start⌗
Будет не лишним напомнить:
Автор не несёт ответственности за возможные повреждения оборудования,
упущенную выгоду, разрушенную психику и отсутствие удачи в столь
нелёгком деле;
Coreboot – HowTO⌗
Что потребуется для установки CoreBoot?
удачанайти MB в списке поддерживаемого оборудования;- обновить оригинальный проприетарный BIOS до последней версии;
- ROM datasheet и руководство по разборке устройства;
- программный программатор - flashrom (иногда работает);
- аппаратный программатор (когда не работает программный);
- паяльная станция (когда аппаратный нельзя подключить через ISP);
- документации по offset для модулей в оригинальном проприетарном BIOS/UEFI;
- git, GCC, binutils + некоторые other dependencies;
- CoreBoot source code;
Coreboot – HowTO⌗
Общий алгоритм для установки CoreBoot на устройство:
- Прочитать из ПЗУ оригинальный проприетарный System BIOS;
- Извлечь жизненно необходимые модули для которых нет свободной замены;
- Собрать Coreboot с модулями;
- Записать build/coreboot.rom в ПЗУ;
Coreboot – HowTO⌗
Thinkpad x201 - Разборка и локализация ПЗУ
Coreboot – HowTO⌗
Thinkpad x201 - Разборка и локализация ПЗУ
Coreboot – HowTO⌗
Thinkpad x201 - Разборка и локализация ПЗУ
MX25L6445E
Coreboot – HowTO⌗
магия извлечения ME.bin и descriptor.bin для Thinkpad x201:\
dd if=flash.bin of=descriptor.bin count=12288 bs=1M\
iflag=count_bytes
dd if=flash.bin of=me.bin skip=12288 count=5230592\
bs=1M iflag=count_bytes,skip_bytes
cat /proc/iomem | grep 'Video ROM' | (read m; \
m=${m/ :*}; s=${m/-*}; e=${m/*-}; dd if=/dev/mem\
of=vgabios.bin bs=1c skip=$[0x$s] \
count=$[$[0x$e]-$[0x$s]+1]
Coreboot – HowTO⌗
Собираем Coreboot для Thinkpad x201: важные параметры сборки
make menuconfig
- MX25L6445E
- LENOVO x201
- ME.bin
- descriptor.bin
- videorom.bin
Coreboot – HowTO⌗
make
Coreboot – HowTO⌗
Подключение программатора к ПЗУ ноутбка:
Coreboot – HowTO - write in ROM⌗
Запись в ПЗУ:
Coreboot – demo⌗
Video⌗
P.S.: REMARKS (исправления)⌗
- 23:43 - “есть ещё один проект который не работает (…) LibreBoot”
– Конечно же, LibreBoot, в целом, работает, как проект, но тут имеелось в виду, что он не применим конкретно с моим ноутбуком и с железом от Intel over 2010, работающим с использованием IntelME в новых её версиях; Это важно отметить т.к. есть много другого более старого железа - где LibreBoot успешно работает; – Так же разработчики LibreBoot заявляют, что они не форк CoreBoot “Libreboot is not a fork of coreboot”, но судя по ссылкам и документации, а так же коду - проект является форком, хотя настаивать на такой позции я не буду;
- 29:54 - “OLPC - да это LibreBoot (…)” – Тут я несу чушь. :( Судя по их wiki about build OLPC firmware к LibreBoot не имеет никакого отношения;
P.S.: Links (дополнительные ссылки)⌗
- Hackaday - neutralizing intelME
- SecurityLab - Боремся с дистанционным контролем: как отключить Intel ME