Defeating Secure Boot With Linux Kexec

Matthew has long been dealing with UEFI/SecureBoot issues and his latest blog post is entitled Subverting security with kexec. Garrett noted, "The beauty of this approach is that it doesn't rely on any kernel bugs - it's using kernel functionality that was explicitly designed to let you do this kind of thing (ie, run arbitrary code in ring 0). There's not really any way to fix it beyond adding a new system call that has rather tighter restrictions on the binaries that can be loaded. If you're using signed modules but still permit kexec, you're not really adding any additional security. But that's not the most interesting way to use kexec. If you can load arbitrary code into the kernel, you can load anything. Including, say, the Windows kernel. ReactOS provides a bootloader that's able to boot the Windows 2003 kernel, and it shouldn't be too difficult for a sufficiently enterprising individual to work out how to get Windows 8 booting. Things are a little trickier on UEFI - you need to tell the firmware which virtual -> physical map to use, and you can only do it once. If Linux has already done that, it's going to be difficult to set up a different map for Windows. Thankfully, there's an easy workaround. Just boot with the 'noefi' kernel argument and the kernel will skip UEFI setup, letting you set up your own map."
The post is interesting and certainly worth reading in full. For those wanting some background information on Kexec, stop by Wikipedia.
29 Comments