Jak vyřešit podepisování jaderných modulů v prostředí UEFI Secure Boot?

Poznámka: Článek vyšel původně na blogu Matthew Garretta jako Supporting third-party keys in a Secure Boot world.

Nabootovat systém s UEFI Secure Boot pomocí nástroje Shim nebo natahovače od Linux Foundation je docela snadné a distribuce, které používají buď LF natahovač, nebo běžnou verzi Shimu, se nemusí starat o nic dalšího. Fyzicky přítomný uživatel musel nainstalovat nové klíče a hashe, což znamená, že už se nemusíte starat o bezpečnostní pravidla Microsoftu nebo (za předpokladu, že nejsou zneužitelné chyby přímo v bootloaderu) se obávat zneplatnění klíčů.

Ale co když jste distribuce, které záleží na tom, aby mohl uživatel bootovat, aniž by musel instalovat klíče? Existuje řada důvodů, proč to chtít (pohodlí pro naivní uživatele, možnost bootování přes síť a podobně), ale má to tu nevýhodu, že lze pak váš systém využít jako útočný vektor proti jiným operačním systémům. Záleží vám na tom? To se odvíjí od toho, jako hodnotíte rizika. Nejprve by váš systém někdo musel použít k útoku na jiné. Zadruhé, Microsoft by se musel natolik starat, aby váš podpis zneplatnil. To první se ještě nestalo, takže nemáme tušení, jak pravděpodobné je to druhé. Nicméně, nezdá se přehnaně nepravděpodobné, že by byl Microsoft ochotný zneplatnit podpis distribuce, pokud by tato distribuce byla použita k útoku na Windows.

Jak tomu předejít? Zahrnuje to několik kousků bezpečnostní práce, ale jedním z nich je vyžadovat, aby byly podepsané všechny vaše jaderné moduly. To je snadné pro moduly v distribuci, protože je všechny podepíšete před vydáním. Ale moduly třetích stran? Jsou tři možnosti:

  • nepodporovat na systémech se Secure Boot moduly třetích stran
  • podepisovat moduly na úrovní distribuce
  • podepisovat moduly na úrovni dodavatele

První možnost je snadná, ale uživatele asi nepotěší. Prodejce hardwaru také ne. Žádná sláva.

Druhá možnost je otravná z několika důvodů a jeden dost důležitý se týká licencování. Pokud podepíšete modul, znamená to, že ho podporujete? Znamenalo by podepsání ovladače nvidia, že nevidíte žádné licenční nejasnosti? Ale i bez ohledu na to, jak se rozhodnete, čí ovladače podepsat? Asi můžeme předpokládat, že firmy jako AMD a nvidia jsou docela důvěryhodné, ale co Ovladačové království čestného Honzy? Ověřování něčí identity je neuvěřitelně nákladné, pokud to děláte sami, a ne o moc levnější, když si na toho někoho najmete. Otravné je to také pro dodavatele ovladače, který by potřeboval samostatný podpis pro každou podporovanou distribuci. Takže, i když schůdná, ani tato možnost není lákavá.

Třetí možnost hází odpovědnost na jiné lidi – a vždycky je fajn, když můžete nechat pracovat jiné místo sebe. Problém je pak v určování, kterým klíčům věřit. Můžete to hodit na uživatele, ale to není moc přátelské. Alternativou je věřit všem klíčům podepsaným důvěryhodným klíčem. Ale co je důvěryhodný klíč? Má-li klíče podepisovat distribuce, dostáváme se zpátky k možnosti č. 2 – musíte u každého ověřit identitu a oni budou potřebovat samostatný podepisovací klíč pro každou distribuci, kterou chtějí podporovat. V ideálním světě by existoval klíč, kterému už bychom věřili a který by vlastnil někdo, kdo by byl ochoten s ním věci podepisovat.

Dobrá zpráva je, že takový klíč existuje. Špatná zpráva je, že ho vlastní Microsoft.

Nedávná debata na LKML se točila kolem sady patchů, která jádru umožňovala instalovat nové klíče, pokud byly v binárce PE/COFF podepsané důvěryhodným klíčem. Stojí za zdůraznění, že tyto patche neměnily sadu klíčů, které již jádro věří – jádro věří klíčům, které jsou nainstalované ve firmwaru vašeho systému, takže pokud váš firmware věří klíči od Microsoftu, jádro také. Zdůvodnění je velmi přímočaré. Pokud váš firmware věří věcem podepsaným Microsoftem a pokud se útočníkovi podaří nechat si věci Microsoftem podepsat, může vám dát rovnou narušený bootloader. Takže když lidi necháte podepisovat jaderné moduly, nezmění se nijak moc, kterou už tak nad vaším systémem mají. Microsoft podepíše binárky PE/COFF, takže dodavateli stačí se zaregistrovat u Microsoftu, zaplatit Symantecu 99 dolarů za ověření identity, zabalit klíč do binárky PE/COFF a nechat Microsoftem podepsat. Jádro pozná, že byl objekt podepsán důvěryhodným klíčem, a klíč vybalí a nainstaluje.

Linus z toho, mírně řečeno, není nadšený. Do jádra to přidává složitost v podobě binárního parseru, který by se používal jen pro natahování klíčů z uživatelského prostoru, a jádro už pro to rozhraní má – certifikáty X509. Potíž je v tom, že Microsoft certifikáty X509 nepodepíše a neexistuje způsob, jak převést podpis PE/COFF na certifikát X509. Někdo by klíče musel znovu podepsat, což by nás opět vrátilo na možnost č. 2. Dalo by se to obejít tak, že bychom měli automatizovanou službu, která by přijímala objekty PE/COFF, ověřovala, že byly podepsány Microsoftem, extrahovala klíče, znovu je podepsala novým soukromým klíčem a vyplivla certifikát X509. Tím by se zabránilo přidávání nového kódu do jádra, ale znamenalo by to, že by tu službu někdo musel provozovat a jejich veřejnému klíči by muselo jádro automaticky věřit.

Kdo by to mohl být? Logickou volbou by mohla být Linux Foundation, ale protože někteří členové Technického poradního panelu Linux Foundation říkají, že není nutné moduly podepisovat a že neexistuje opravdové nebezpečí vypovězení platnosti klíčů, není pravděpodobné, že by se do toho hrnuli. Mohla by to dělat některá distribuce, ale došlo by k dohadům kvůli tomu, že by jedna distribuce byla ve významnější pozici než ostatní. Nikdo se zatím nepřihlásil.

Možná to dopadne tak, že distribuce, kterým na podepisování modulů záleží, tuto sadu patchů nakonec začlení, kdežto ty ostatní ne. Někteří to nejspíš budou vykládat jako přílišné spoléhání na Microsoft, ale stojí za zmínku, že v tomto ohledu tyto patche nic nemění – pokud Microsoftu věří váš firmware, tak vy také. A pokud Microsoftu firmware nevěří, tyto patche nezpůsobí, že by Microsoftu začalo věřit jádro. Pokud jste si založili vlastní řetěz důvěry, cokoliv podepsaného Microsoftem bude odmítnuto.

Co bude dál? Moc by mě nepřekvapilo, kdyby se nic nedělo až do chvíle, kdy někdo předvede, jak využít podepsaný linuxový systém k útoku na Windows. Reakce Microsoftu patrně rozhodne, jestli se o to někdo začne zajímat.