Du bist hier:Start»Wissen»UEFI BIOS

Ein Blick ins UEFI BIOS

24.05.2020

BIOS Chip

Das Basic Input Output System (BIOS) ist eine der ersten Komponenten, die beim Starten eines Computers ausgeführt werden. Das Unified Extensible Firmware Interface (kurz UEFI) versucht diesen Startvorgang zu vereinheitlichen. Die UEFI Programme und die Einstellungen des Computerstarts werden in einem Mikrochip (Flashspeicher) gespeichert. Weil das BIOS zunehmend dafür missbraucht wird, den Computernutzern ihre Rechte zu entziehen, lohnt es sich, ein wenig Wissen über das UEFI BIOS aufzubauen.

Disclaimer

ACHTUNG! Die Arbeit am BIOS Chip auf einem Mainboard kann dazu führen, dass der Computer nicht mehr startet. BIOS-Bearbeitung auf eigene Gefahr. Tests bevorzugt an gebrauchten, günstigen Computern durchführen. Einige Computer-Hersteller könnten das Mainboard so verschaltet haben, dass der BIOS-Chip zur Bearbeitung vom Mainboard abgelötet werden muss. Bei einigen Laptop-Modellen gibt es auch eine BIOS-Einstellung, die ein Öffnen der Bodenplatte des Laptops registrieren kann und der Computer nur dann wieder startet, wenn das BIOS-Passwort anschließend eingegeben wurde.

Hardware
Software
Flashrom unter der Lupe
Macronix MX25L25673G
Raspberry Pi
SPI mit Python simulieren
BIOS Updates
Security
BIOS Passwort
Links
Abkürzungen

Hardware

Aufgrund von Standardisierung wird das UEFI BIOS meist in einem Chip mit 8 äußeren Metallkontakten gespeichert. Das kann ein SOIC8-Chip (Small Outline Integrated Circuit) oder neuerdings ein 8-WSON-Package (Very-very-thin small-outline no-lead package) sein. Die meisten BIOS-Chips lassen sich über das "Serial Peripheral Interface" (SPI) beschreiben oder auslesen und sind indirekt mit der zentralen Recheneinheit des Computers (CPU) verbunden. Zum Auslesen des BIOS-Chips an einem anderen Computer habe ich mir den USB-Stick "Programmer CH341a" gekauft. Dieser USB-Stick kann das SPI-Protokoll auf eine USB-Schnittstelle umsetzen. An den USB-Stick wird ein Flachbandkabel mit SOIC8-Clip angeschlossen. ACHTUNG! Der USB-Stick CH341a benutzt 3,3 Volt. Vor dem Anschließen des SOIC8-Clips sollte die Spannung aus dem Datenblatt des BIOS-Chips verglichen werden (z.B. 2,7V bis 3,6V). Bei neueren Versionen des Programmers können auch andere Spannungen über einen Schalter eingestellt werden.

USB-Stick CH341a

USB-Stick CH341a

Es gibt nur zwei Möglichkeiten den SOIC8-Clip an den BIOS-Chip zu klammern. Die rot markierte Leitung muss auf die Seite, wo der Punkt auf dem Chip ist (Pin 1). Bei einem HP Probook 640 G2 sieht das zum Beispiel so aus:

BIOS-Chip im HP Probook 640 G2

BIOS-Chip von Winbond im HP Probook 640 G2

Um an den BIOS-Chip zu kommen, muss die Unterseite des HP Probooks aufgeschraubt werden. Der Chip befindet sich in diesem Fall auf dem Mainboard zwischen Netzwerkanschluß und Festplatte.

HP Probook 640 G2 Unterseite

HP Probook 640 G2 Unterseite

Dieser BIOS-Chip muss nicht ausgelötet werden. Stattdessen wird jetzt die SOIC8-Klammer so auf den BIOS-Chip gesetzt, dass die rote Leitung auf Pin 1 ist. ACHTUNG! Vorher sollte das Netzkabel vom Laptop gezogen und der Akku abgezogen oder herausgenommen werden.

SOIC8-Clip auf dem BIOS-Chip

SOIC8-Clip auf dem BIOS-Chip

Anfangs hatte ich noch Bedenken wegen des langen Flachbandkabels. Aber das hat ohne Probleme funktioniert. Sollte vom BIOS-Chip keine Rückmeldung kommen, so muss die Klammer noch einmal neu auf den Chip gesetzt werden.

Der SOIC8-Clip passt nicht auf jeden BIOS-Chip. Bei einem WSON Package helfen zum Beispiel die Nadeln "PCBite" von Sensepeek.

Alternative zum SOIC8-Clip

Alternative zum SOIC8-Clip

Der Standfuß von PCBite ist magnetisch und hält zum Beispiel an einer Schraubzwinge. Leider haben die Abtaster PCBite auch einige Nachteile (neben dem hohen Preis): an einigen Stellen sind sie zu breit, so dass sie nicht gut nebeneinander an den Chip passen. Außerdem ist der untere Bereich mit den Nadeln nicht isoliert, so dass es bei unvorsichtigem Umgang zu einem Kurzschluss kommen könnte.

Abtastnadeln PCBite auf dem BIOS Chip

Abtastnadeln PCBite auf dem BIOS Chip

Abtastnadeln PCBite auf einem SOIC8

Abtastnadeln PCBite auf einem SOIC8

Die Abtastnadeln PCBite von Sensepeek ermöglichen Flexibilität, sind aber durch die breiten Fassungen auch schwer zu handhaben, wenn sie nebeneinander platziert werden müssen. Eine andere Variante könnte ein spezialisierter "WSON Clip" sein, der mit Federkontaktstiften (auch Pogo Pin genannt) von oben auf den Flashchip gedrückt werden kann. WSON-Clips gibt es unter anderem bei AliExpress, wobei auf den richtigen Abstand der Pins zu achten ist.

WSON Clip mit Federkontaktstiften

WSON Clip mit Federkontaktstiften

Eine Alternative zum USB-Stick CH341a ist zum Beispiel der Raspberry Pi mit seinen GPIO Pins (siehe unten).
ACHTUNG! Es ist nicht bei allen Computern möglich, das BIOS auf dem Mainboard auszulesen. Es ist sicherer, den Flash-Chip vom Mainboard abzulöten oder mit einer Heißluftpistole zu entfernen.

Software

Um den Programmer CH341a unter dem Betriebssystem Linux Mint anzusprechen, gibt es das Programm "flashrom".

# install flashrom and libraries for development
apt install flashrom libpci-dev libusb-1.0-0-dev libftdi1-dev libftdi1-dev libjaylink-dev

# download the flashrom source code
wget https://download.flashrom.org/releases/flashrom-v1.3.0.tar.bz2

# extract
tar xvf flashrom-v1.3.0.tar.bz2

# build
cd flashrom-v1.3.0
make CONFIG_ENABLE_LIBUSB1_PROGRAMMERS=yes
# or just make

sudo make install

# become root
sudo bash

# scan which BIOS chip this could be
flashrom --programmer ch341a_spi

# if you know which chip, then you can use verbose mode
flashrom -V --programmer ch341a_spi -c W25Q128.V

# read the BIOS contents
flashrom --programmer ch341a_spi -r backup.bin

Nach dem Lesen des BIOS-Speichers mit flashrom, zeigt das UEFI Tool den Inhalt an. Das UEFITool kann man hier herunterladen. Eine ältere Version von UEFITool, die noch mit QT5 funktionert, gibt's hier:

# download UEFI tool
wget https://www.torsten-traenkner.de/wissen/bios/UEFITool_NE_A52_linux_x86_64.zip

# extract
unzip UEFITool_NE_A52_linux_x86_64.zip

# start UEFI tool
./UEFITool

# newer versions of uefitool require QT6
# apt install libqt6*-dev
UEFI Tool zeigt VSS2 Store an

UEFI Tool zeigt VSS2 Store an

Das UEFI-Tool kann die Startadresse und die Größe des VSS2 Stores anzeigen. VSS ist der Variable Storage Space. In diesem VSS2-Bereich sind nicht-flüchtige also dauerhafte Daten (NVRAM, non volatile random access memory) gespeichert. Im oberen Beispiel des HP BIOS ist die hexadezimale Startadresse 0xB10048 und die Größe dieses Speicherbereichs ist 122808 Byte (Full size). Computerspezifische Variablen, wie zum Beispiel die Seriennummer, SKU-Nummer (Stock Keeping Unit), CT-Nummer der Systemplatine (configuration tag) und UUID des Laptops (Universal Unique Identifier) stehen bei HP in dem VSS Eintrag "HP_MUD" (Machine Unique Data). Das "Feature-Byte" steht im VSS-Eintrag "FactoryConfig".

Einige UEFI-Variablen lassen sich auch unter Linux auslesen.

ls /sys/firmware/efi/efivars/
hexdump -C /sys/firmware/efi/efivars/HP_MUD-20ab3eb1-3c8f-4a4c-b87e-372426066d97
strings -e l /sys/firmware/efi/efivars/HP_MUD-20ab3eb1-3c8f-4a4c-b87e-372426066d97

Außerdem kann das Linux-Programm dmidecode Informationen übers BIOS darstellen:

sudo dmidecode | less -i

# example output
Handle 0x0001, DMI type 0, 26 bytes
BIOS Information
  Vendor: HP
  Version: R70 Ver. 01.22.00
  Release Date: 10/14/2022
  Address: 0xF0000
  Runtime Size: 64 kB
  ROM Size: 32 MB
...

Flashrom unter der Lupe

Die USB-Kommunikation mit dem Programmer CH341a läßt sich mit dem Programm "Wireshark" erkunden.

# become root
sudo bash

# add module for USB monitoring
modprobe usbmon

# list usb devices
lsusb

Bus 002 Device 005: ID 1a86:5512 QinHeng Electronics CH341 in EPP/MEM/I2C mode, EPP/I2C adapter

# if the USB Bus is 002, then use usbmon2 in wireshark
wireshark &

flashrom -V --programmer ch341a_spi -c W25Q128.V

Für den Chip Winbond W25Q128 stehen im Datenblatt (data sheet) die Befehle, um die Status Register auszulesen:

# Winbond has 3 status registers:
# read Status Register-1 (05h)
# read Status Register-2 (35h) and
# read Status Register-3 (15h)

status register 1 is command:
0x05 == 0000 0101 b

# reverse bit order
1010 0000 b == 0xa0

Um den Hersteller des Chips auszulesen, gibt es den Befehl "Read JEDEC ID":

# read JEDEC ID (9Fh)
0x9f == 1001 1111 b

# reverse bit order
1111 1001 b == 0xf9

# response: Manufacturer ID byte for Winbond (EFh)
0xef == 1110 1111 b

# reverse bit order
1111 0111 b == 0xf7

# Device ID W25Q128FV (SPI Mode)
0x40 18 == 0100 0000, 0001 1000 b

# reverse bit order
0000 0010, 0001 1000 b == 0x02 18

Hexdumps aus Wireshark:

# read JEDEC ID (0xf9):
ab b7 b7 b7 b6 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 a8 f9 ff ff ff

# response: 0xf7 == Winbond, 0x02 18 == W25Q128FV (SPI Mode)
ff f7 02 18

# read first status register
ab b7 b7 b7 b6 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 a8 a0 ff ff

# response:
ff 00 00

So wie es aussieht gibt die Anzahl der 0xff Bytes an, wieviel Bytes der Programmer CH341a lesen soll. Der gesamte Winbond Flashchip wird in mehreren 4 Kilobyte-Blöcken ausgelesen. Der Befehl zum Lesen des ersten Statusregisters gibt 2 Bytes zurück - eigentlich ist das Status-Register nur ein Byte groß.

Macronix MX25L25673G

Der Flashchip Macronix MXIC "MX25L25673G" ist in der Liste der von Flashrom unterstützen Flashchips nicht aufgeführt. Ein Blick ins Datenblatt des MX25L25673G zeigt aber, dass er dieselbe Chip-ID wie der unterstützte "MX25L25635F" hat (0xC2 20 19). Also funktioniert folgender Befehl mit Flashrom Version 1.3:

flashrom -V --programmer ch341a_spi -c "MX25L25635F/MX25L25645G"

# output: Probing for Macronix MX25L25635F/MX25L25645G, 32768 kB: compare_id: id1 0xc2, id2 0x2019

Beim Auslesen von 16 MB Flashchips reicht der SPI-Befehl Read (0x03) mit einer 3 Byte Adresse. Für einen 32 MB Flashchip wie den "MX25L25673G" wird der Befehl 0x13 mit einer 4 Byte Adresse benutzt. Das Auslesen der 32 MB dauert mit dem Programmer CH341a etwa 5 Minuten. Beim Raspberry Pi lässt sich die SPI-Geschwindigkeit über den Parameter "spispeed" in Kilohertz einstellen und der Flashchip dadurch deutlich schneller auslesen als mit dem Programmer CH341a. Bei 15 MHz dauert das Auslesen etwa 20 Sekunden.

flashrom -V --programmer linux_spi:dev=/dev/spidev0.0,spispeed=15000 -c "MX25L25635F/MX25L25645G" -r macronix.bin

Raspberry Pi

Für etwas mehr Kontrolle über die einzelnen SPI-Leitungen kann auch ein Raspberry Pi mit seinen GPIO Pins benutzt werden.

Raspberry Pi verbunden über GPIO Pins mit einem BIOS Chip

Raspberry Pi verbunden über GPIO Pins mit einem BIOS Chip (zum Vergrößern klicken)

Das obere Bild ist mit der Layout-Software Fritzing erstellt. This image was created with Fritzing.

Winbond BIOS Chip mit seinen Pins

Winbond BIOS Chip mit seinen Pins

Wie bereits beschrieben, ist Pin 1 da, wo der kleine Punkt auf dem BIOS Chip ist. Anschließend werden die Pins gegen den Uhrzeigersinn nummeriert. Die Beschaltung der Pins findet sich im Datenblatt des jeweiligen Chips. Die zusätzlichen Zahlen hinter der Beschriftung geben die Input / Output Leitung im Quad SPI Modus an.

ACHTUNG! Die oben beschriebene Verkabelung ist für eigene Tests mit Python gedacht. Die Verschaltung für flashrom "linux_spi:dev=/dev/spidev0.0" sieht anders aus.

SPI mit Python simulieren

Im folgenden Listing ist ein Python-Programm "read_jedec_id.py" für den Raspberry Pi zu sehen, das die Programmbibliothek "GPIO Zero" benutzt, um SPI zu simulieren.

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

from gpiozero import LED, Button
from time import sleep
import array

clock = LED(24)
mosi = LED(23)
miso = Button(27)
select = LED(22)
hold_reset = LED(25)
write_protect = LED(17)

PAUSE = 0.01

# Winbond commands
READ_JEDEC_ID = 0x9f
READ_STATUS_REGISTER_BYTES = array.array('I', [0x05, 0x35, 0x15])
WRITE_STATUS_REGISTER_BYTES = array.array('I', [0x01, 0x31, 0x11])
WRITE_ENABLE = 0x06
WRITE_DISABLE = 0x04

def prepare_SPI_lines():
  print("preparing the SPI lines")

  select.on()
  clock.off()
  mosi.off();

  # hold is low active
  hold_reset.on();
  # write protect is low active
  write_protect.on();

def select_chip():
  # low active
  select.off()

def unselect_chip():
  select.on()

# send the byte bit by bit
def write_byte(single_byte):
  print("Writing byte: " + '0x{:02X}'.format(single_byte))

  for i in range(7, -1, -1):
    mosi.value = (single_byte >> i) & 1
    clock.on()
    sleep(PAUSE)
    clock.off()
    sleep(PAUSE)

# read some bytes
def read_bytes(number_of_bytes):
  return_value = 0
  for i in range(number_of_bytes * 8):
    clock.on()
    # read on rising edge, button value is inverted
    return_value = (return_value << 1) | (miso.value ^ 1)
    sleep(PAUSE)
    clock.off()
    sleep(PAUSE)
  return return_value

def read_jedec_id():
  print()
  select_chip()

  write_byte(READ_JEDEC_ID)
  # receive the 3 byte Jedec ID
  jedec_id = read_bytes(3)

  unselect_chip()

  print("JEDEC ID: " + '0x{:02X}'.format(jedec_id))

##### main #####

if __name__ == "__main__":
  prepare_SPI_lines()
  read_jedec_id()

Mit den GPIO-Leitungen des Raspberry Pis lässt sich auch Quad PI benutzen. Allerdings müssen dann die Zuweisungen mit "LED" und "Button" jeweils beim Lesen und Schreiben umgeschaltet werden (z.B. durch "del miso" löschbar). Beispiel: quadpi_experiment.py.

Der Quad PI Modus ist nach einem Power Off und On des BIOS Chips wieder gelöscht. So wie es aussieht lässt sich das QE-Bit beim Winbond Chip nicht zurücksetzen.

BIOS Updates

Beispiel für BIOS Updates von Hewlett-Packard: https://support.hp.com/de-de/document/c06504749

# for example HP ProBook 640 G2, N76 Version 1.44
wget https://ftp.hp.com/pub/softpaq/sp99501-100000/sp99971.exe
wine sp99971.exe
hexedit ~/.wine/drive_c/SWSetup/SP99971/N76_0144.bin

Security

In den letzten Jahren haben sich Microsoft, Intel, BIOS-Hersteller und Hersteller von Flashchips wie Winbond zusammengesetzt und einige Maßnahmen umgesetzt, die die Sicherheit des Start-Vorgangs eines Computers verbessern sollten (secure boot process). Dabei wurden unterhalb des Betriebssystems Sicherheitsebenen eingeführt, durch die ein direktes Beschreiben des Flashchips im laufenden System unterbunden wird. Normalerweise werden diese Sicherheitsebenen als Ringe dargestellt. Ich habe sie hier als Schichten gezeichnet:

Sicherheitsebenen eines Computers, CPU rings

Sicherheitsebenen eines Computers

In der Wikipedia sind die Sicherheitsebenen eines Computers detailliert erklärt. Die Trennung in Software und Hardware stimmt nicht ganz, da Firmware letztendlich auch Software ist. Die zusätzlichen Sicherheitsebenen können Schreibzugriffe auf den Flashchip im laufenden System verhindern.

flashrom -V --programmer internal -c _chip_

Warning: BIOS region SMM protection is enabled!

Die zusätzliche Firmware bietet allerdings auch weitere Angriffsfläche für Schadsoftware. Dadurch werden BIOS-Updates zu einer regelmäßigen Pflicht wie Software-Updates.

Flash Image mit ME und SMM Code

Flash Image mit ME und SMM Code

Das Flash-Image im UEFI BIOS enthält den Code für den System Management Mode (SMM module) und die Intel Management Engine (ME region). Bei einer Secure Boot Chain könnten diese Bereiche signiert sein und nicht einfach geändert werden.

Im Jahr 2018 hat Winbond angekündigt, einen Flashchip mit Sicherheitsfunktionen (Winbond W25R) wie zum Beispiel "Replay-Protected Monotonic Counter" (RPMC) auf den Markt zu bringen.

Sicherheitsforscher

Mit der Sicherheit des Startvorgangs bzw. mit dem SPI-Flash haben sich unter anderem: Alex Matrosov, Nikolaj Schlej, Rafal Wojtczuk, Trammell Hudson, Xeno Kovah, Peter Bosch oder Shubham Dubey (Nixhacker) beschäftigt. Es kann sich lohnen ihre Vorträge oder Webseiten anzusehen.

BIOS Passwort

Beim HP Probook 640 G2 wird die Information für das BIOS-Passwort im SPI Flash-Chip in den UEFI-Variablen im Variable Storage Space gespeichert (VSS2). Dort gibt es die Variable "UserCred" mit dem Bezeichner (GUID) F66687FF-8CF3-4A19-B4AC-F5F0B78E4D18. Der Speicherbereich kann entweder mit dem UEFITool oder unter Linux wie folgt angesehen werden:

hexdump -C /sys/firmware/efi/efivars/UserCred-f66687ff-8cf3-4a19-b4ac-f5f0b78e4d18

Wenn dort die Zeichenkette "AdminPW" zu finden ist, dann wurde ein BIOS Administrator Passwort gesetzt. Im Internet gibt es einige Anleitungen, wie das Passwort zurückgesetzt werden kann.
Das Repair Forum badcaps.net hat mehr Details zum BIOS und Embedded Controller (EC). Das Programm RCUnlocker, das im Repair Forum zu finden ist, überschreibt offenbar nur den Bereich der Variable "UserCred" und löscht dort den Eintrag mit "AdminPW" raus.

Bei einigen Laptop-Modellen kann es auch sein, dass das Passwort im Embedded Controller (EC) gespeichert wird.

TODO

Ich arbeite noch an dem Thema. Offene Punkte: RWEverything, ChipSec, Passwort-Reset, BIOS-Einstellungen ändern, ...

Abkürzungen im Zusammenhang mit UEFI

$$OsAdmin Admin user in the operating system who can access parts of Intel AMT
ACM Authenticated Code Module
AMT Intel Active Management Technology (remote management)
BIOS Basic Input Output System
CoA Certificate of Authenticity (25 character Windows key)
CT configuration tag (mainboard number on HP systems)
Intel CSME Converged Security and Management Engine (firmware in the PCH)
DER Distinguished Encoding Rules (encoding for certificates)
DMI Desktop Management Interface (several meanings)
DMI Direct Media Interface (Intel specific)
DXE Driver Execution Environment
EC Embedded Controller
EFI Extensible Firmware Interface
FFS Firmware File System
FIT Firmware Interface Table
fTPM Firmware Trusted Platform Module
FTW Fault Tolerant Write
GbE Gigabit Ethernet region (Intel)
GUID Globally Unique IDentifier, 16 Byte long
HP Hewlett Packard (company)
JEDEC Joint Electron Device Engineering Council
ME Management Engine
MEI Management Engine Interface
MOK Machine Owner Key
MUD Machine Unique Data
OA3 OEM Activation 3.0
OEM Original Equipment Manufacturer
PCH Platform Controller Hub (between CPU and BIOS flash chip)
PCR Platform Configuration Register
PE Portable Executable
PEI Pre EFI Initialization
PI Platform Initialization
PXE Preboot Execution Environment
RPMC Replay-Protected Monotonic Counter
SKU Stock Keeping Unit
SMBIOS System Management BIOS
SMI System Management Interrupt
SMM System Management Mode
SOIC Small Outline Integrated Circuit
SOIC8 Small Outline Integrated Circuit with 8 pins
SPI Serial Peripheral Interface
TPM Trusted Platform Module
TSSOP Thin Shrink Small Outline Package
UEFI Unified Extensible Firmware Interface
VSS Variable Storage Space
WSON Very-very-thin small-outline no-lead package

Letzte Änderung: 2024-02-25