Bij de veiligheid van je computer denk je vaak aan het besturingssysteem en de applicaties. Anders gezegd, de aandacht gaat vaak alleen uit naar veiligheid wanneer de computer al is opgestart. Maar ook het opstarten zelf is een softwareproces dat voor veiligheidslekken kan zorgen. In dit artikel kijken we eerst naar de oude vertrouwde manier van booten via het BIOS en vervolgens naar de huidige manier via UEFI. Tot slot lichten we Secure Boot toe als middel om het bootproces te beveiligen.

 

 Het opstarten van je computer volgt een vast stramien (zie afbeelding 1). Als eerste voert de PC de code van de firmware uit. Die test en initialiseert hardwarecomponenten, zoals het geheugen, de harde schijf en het toetsenbord. Daarna gaat de firmware op zoek naar de bootloader. Als de firmware die vindt, krijgt de bootloader de controle. Op zijn beurt heeft de bootloader de belangrijke taak om het besturingssysteem op te starten. De bootloader vormt de brug tussen de firmware en het besturingssysteem. De firmware is namelijk min of meer standaard op alle PC’s en heeft geen kennis van allerlei bestandssystemen en details van de kernel om een besturingssysteem op te starten.

 

  

 BIOS

 

Al sinds de eerste PC’s van begin jaren ‘80 is het BIOS de standaard firmware. Het BIOS gebruikt een lijst van boot devices. Dat zijn apparaten, zoals harde schijven en CD drives die het BIOS moet testen op de aanwezigheid van een bootloader. Het aanpassen van die lijst is beperkt tot het kiezen van een volgorde of het al dan niet gebruiken van bijvoorbeeld USB sticks.

 

 MBR

 

Om een bootloader op een harde schijf te vinden, probeert het BIOS de eerste sector ervan in het geheugen te laden. Die eerste sector heet het master boot record (MBR). Behalve de bootloader bevat het MBR ook de partitietabel van de harde schijf. Als het laden slaagt, geeft het BIOS de processor opdracht om de code van het MBR uit te voeren. Omdat het BIOS niets controleert en de processor de code van het MBR zonder pardon uitvoert, bestaat de mogelijkheid om een virus in het MBR te plaatsen.

 

 

Het MBR is maar 512 byte groot wat gewoonlijk te klein is voor de volledige bootloader. De code in het MBR zoekt daarom op specifieke plekken op de harde schijf naar de rest van de bootloader. Dit bij elkaar rapen van de bootloader is gebaseerd op redelijke aannames, maar niet op een eenduidige specificatie. Een ander nadeel is dat het MBR niet op een bestandssysteem staat. Daarom heb je speciale software nodig om het te lezen en schrijven.

 

 UEFI

 

UEFI is ontwikkeld als antwoord op deze beperkingen en bestaat uit de volgende onderdelen:

 

 Firmware voor je PC;

  • GPT partitionering;

  • De boot manager.

     

    De firmware heeft een interface die je net als bij het BIOS oproept door tijdens het opstarten op een bepaalde toets te drukken. Vaak is dat Delete of F2. De UEFI firmware heeft uitgebreidere functionaliteit dan het BIOS. Zo ondersteunt het zelfs een beperkte shell. De fabrikant levert dit soort functionaliteit echter niet altijd mee in de firmware van je PC.

     

    GPT

    Anders dan het BIOS heeft de UEFI firmware door GPT partitionering kennis van partities. GPT staat voor GUID Partition Table. Het GUID, Global Unique Identifier, is een identificatie die partities krijgen door GPT te gebruiken. UEFI zoekt standaard naar partities met een specifiek GUID om een bootloader te vinden. Die partitie heet EFI System Partition (ESP) en bevat een FAT bestandssysteem. UEFI gebruikt vervolgens een standaard pad en naam om de bootloader te vinden. Op een 64-bits machine is dat:

     

    ***********start listing**********

     

    /EFI/BOOT/BOOTX64.EFI

     

    ***********eind listing**********

     

    De bootloader is dus een regulier bestand en niet een stukje code op een verborgen plek op de harde schijf, zoals het MBR. Groot voordeel is dat je vanuit je vertrouwde Linux omgeving een ESP kunt aanmaken, formatteren en mounten. Formatteren als FAT32 is het veiligst omwille van de compatibiliteit met sommige moederborden. Als je een dual boot systeem met Windows wil, moet je zelfs FAT32 gebruiken. Het installeren van een bootloader is vervolgens niet meer dan het kopiëren van een bestand.

     

    Boot manager

    Het is gebruikelijk dat besturingssystemen de bootloader in de volgende directory van het ESP plaatsen:

     

    ***********start listing**********

     

    /EFI/<os_naam>

     

    ***********eind listing**********

     

    Zo is dit de standaard bootloader voor 64-bits Fedora:

     

    ***********start listing**********

     

    /EFI/fedora/grubx64.efi

     

    ***********eind listing**********

     

    De firmware stel je hiervan op de hoogte door de boot manager te configureren. De boot manager speelt een vergelijkbare rol als de lijst van boot devices in BIOS. In tegenstelling tot het BIOS heeft het besturingssysteem bij UEFI wel toegang tot de firmware. In Linux gebruik je het commando efibootmgr om de boot manager te configureren. Soms is efibootmgr zelfs een betere optie dan de niet altijd even gebruikersvriendelijke UEFI interface.

     

    Secure boot

    Secure Boot is een methode om het boot proces te beveiligen. Hiertoe bevat de UEFI firmware een publieke sleutel. De firmware start vervolgens alleen nog bootloaders op die gesigneerd zijn met de bijbehorende privésleutel.

     

    Zelf installeren van sleutels in de firmware van je computer is niet eenvoudig. Voor het gebruiksgemak moet de benodigde sleutel dus al bij aanschaf op de PC aanwezig zijn. Sinds Windows 8 eist Microsoft dat PC’s, die zijn uitgerust met haar besturingssysteem, Secure Boot gebruiken en de publieke sleutel van Microsoft aan boord hebben. Gezien haar marktpositie is Microsoft de enige die dit kan afdwingen bij fabrikanten.

     

    Een oplossing voor Linux distributies is om de bootloader te laten signeren met de privésleutel van Microsoft. Dat klinkt als vloeken in de kerk, maar het is inmiddels werkelijkheid (afbeelding 2A). Steeds meer distributies, waaronder Fedora, openSUSE en Ubuntu, gebruiken de bootloader shim en laten die signeren met de privésleutel van Microsoft. Eigenlijk is shim een pre-bootloader met als enig doel dat Secure Boot de bootloader accepteert en je computer niet vroegtijdig stopt met booten. Vervolgens laadt shim de feitelijke bootloader, zoals GRUB. Deze omweg via shim is nodig, omdat Microsoft geen software onder de GPL licentie, zoals GRUB, signeert. Shim heeft daarentegen een BSD licentie.

     

    Om Secure Boot compleet te maken, signeren distributies, zoals Fedora, openSUSE en Ubuntu zowel GRUB als de kernel met hun eigen sleutel (afbeelding 2B). Shim verifieert eerst de signatuur van GRUB alvorens de controle hieraan over te dragen. GRUB op zijn beurt doet dat voor de kernel. Pas dan is er een volledig cryptografisch beveiligde keten van firmware tot en met de kernel. Niet alle distributies doen dit. Zij gebruiken alleen shim, zodat je computer met hun systeem in ieder geval opstart in het geval Secure Boot geactiveerd is in de firmware.

     
    Tot slot

    Secure Boot biedt de mogelijkheid om het bootproces tot en met het opstarten van het besturingssysteem te beveiligen. Helaas zijn er in de praktijk nog veel haken en ogen. Bovendien is het beheer van sleutels complex. Ook blijft het risico aanwezig dat Microsoft op enig moment besluit dat Secure Boot alleen nog maar Windows mag booten.