Podepisování 64bitových ovladačů pro Windows

Ve článku Authenticode – jak podepisovat programy padl dotaz, jestli jde popisovaný postup použít i pro ovladače do 64bitových Windows. Nemaje žádné praktické zkušenosti jsem si tipnul, že ano. Ale mýlil jsem se – jak jsem si nedávno v souvislosti s druhým pokusem o oblíbení Windows 7 a potřebou lehce upravit ovladač TrueCryptu v praxi ověřil. Nicméně – „cesty jsou“, abych parafrázoval V. Špidlu.

Omlouvám se těm z vás, kdo čtou mé články kvůli občasným jedovatým komentářům – už už jsem se chystal psát spalující úvodní odstaveček o „výhodách“ čtyřiašedesátibitových edicí Windows (a že tam toho ke kritizování je!), ale nakonec jsem se rozhodl, že radši budu pokračovat v budování dojmu serioznosti. Pustíme se tedy přímo do díla.

Pokud máte některá Windows v 64bitové edici (dále W64) a potřebu pracovat s hardwarem pochybných a/nebo zkrachovalých výrobců, případně s hardwarem vlastní výroby, asi už jste narazili na jednu problematickou vlastnost W64: všechny čtyřiašedesátibitové ovladače musí být podepsány důvěryhodnou autoritou, nebo nepůjdou spustit. O důvodech, které Microsoft k tomuto rozhodnutí vedly, by se dalo polemizovat, zde se spokojme s konstatováním, že to tak je. Stejně by vám sebevětší hádka nijak nepomohla v situaci, kdy nějaký nepodepsaný ovladač použít musíte, ať už z jakýchkoliv důvodů.

Reálně máte dvě možnosti:

  1. Testsigning režim Windows
  2. Získání důvěryhodného certifikátu

Když trochu zapátráte po netu, zjistíte, že existuje celá řada alternativních přístupů. Bohužel vás musím zarazit v rozletu – všechna tato „řešení“ (nebo aspoň všechna, která se mi podařilo najít, a nebylo jich zrovna málo) jsou buď analogická jednomu ze dvou výše uvedených (jen postupů pro aktivaci testsigning režimu je nejméně šest), čistě teoretická (možnost vnutit Windowsům svůj vlastní certifikát jako důvěryhodný), nefunkční (cokoliv kolem programu Driver Verifier, který sice na povrchu vypadá jako dokonalé řešení, jenže jen pro 32bitové systémy) a nebo zcela mýtická („je třeba projít Microsoftím WHQL programem“ – kolem podepisování se postupně vyvinulo neskutečné množství legend a rituálů1)). Nevylučuji, že se časem nějaké funkční alternativní řešení objeví, nebo že dokonce už existuje, ale v současné době žádné veřejně dostupné neexistuje.

Pozn. 1: Pozor na to, že některá řešení mohou vypadat, jako že fungují – ale většinou je to dané opět jen špatným pochopením. Například se často dozvíte, že Windows nedovolí nainstalovat nepodepsaný 64bitový ovladač. Když se tedy ovladač nějakým postupem nainstalovat podaří, můžete snadno podlehnout dojmu, že ten postup funguje. Ne, nefunguje – Windows nemají celkem nic proti instalaci nepodepsaných ovladačů, ale nedovolí tyto ovladače spustit.

Testsigning režim Windows

Microsoft si byl dobře vědom toho, že jakkoliv je nucené podepisování ovladačů teoreticky vhodné pro běžného uživatele, je také značně nepraktické pro kohokoliv, kdo ze škatulky „běžného uživatelství“ vypadne – třeba proto, že je tak neuvědomělý, že chce i nadále používat nějaký starší hardware. Zabudoval proto do Windows tzv. testsigning režim, který dovoluje spouštět ovladače podepsané libovolnou certifikační autoritou – zejména tedy self-signed ovladače.

Teoreticky tedy stačí zapnout testsigning režim, podepsat ovladač libovolným certifikátem (viz článek o Authenticode) a mít pokoj. Bohužel, testsigning má několik nepříjemných ale:

  1. Jak už název říká, testsigning je určen pro testování. Už samotné zapnutí režimu je proto poněkud krkolomné: očekává se, že v průběhu bootu Windows zmáčknete klávesu F8 a v bootovacím menu si testsigning režim pro tento jeden start systému zapnete. To je samozřejmě dost nepohodlné, hlavně pokud chcete ovladač používat trvale (tzn. musíte při každém startu systému zapínat testsigning režim).

    Tento problém je naštěstí snadno řešitelný. Postupem času vykoumali chytří lidé spoustu způsobů, jak dosáhnout trvalého zapnutí testsigning režimu, včetně přepsání relevantní části paměti za běhu. Nejjednodušší je ovšem využít toho, co připravil samotný Microsoft: pod administrátorským účtem (důležité! Nestačí povýšení práv pomocí UAC!) spusťte příkazový řádek a napište do něj příkaz bcdedit -set TESTSIGNING ON (pro vypnutí režimu použijete bcdedit -set TESTSIGNING OFF). Stačí reset a je hotovo.

  2. V testsigning režimu cpou Windows do rohů pracovní plochy upozornění, že Windows běží v testsigning režimu (něco podobného, jako znáte z Nouzového režimu).

    Řešení tradičně zahrnuje modifikaci souboru user32.dll. Nezkoušel jsem to, nevím, jestli to ještě pořád funguje (nedivil bych se, kdyby se tato možnost týkala jen betaverzí Windows 7), a celkově vzato bych doporučoval se radši s nápisem smířit. Samozřejmě to poněkud limituje možnost dát svůj vlastní ovladač někomu dalšímu.

  3. Poměrně zásadní problém je, že testsigning režim nijak nediskriminuje a dovoluje paušálně spouštět všechny podepsané ovladače, ať už jejich podpisům důvěřujete nebo ne. Podle všeho neexistuje způsob, jak zapnout testsigning jen pro jeden soubor nebo jednu certifikační autoritu; režim běží podle zásady „všechno nebo nic“. Prakticky to znamená, že při zapnutém testsigningu přicházíte o veškerou ochranu z podpisů plynoucí, protože vlastnoručně podepsané ovladače pak může aktivovat i kdokoliv další, kdo na vašem počítači dokáže získat administrátorská práva.

  4. Tohle nemám ověřené, poněvadž nejsem příslušně vybaven, ale z logiky věci tomu věřím: Tvrdí se, že testsigning režim není slučitelný s HDCP ochranami; pokud je zapnutý, nedovolí Windows přehrávání chráněných médií ve vysokém rozlišení.

Plus je tu samozřejmě ten drobný detail, že jakmile vypnete testsigning režim, přestane váš ovladač fungovat.

Použití důvěryhodného certifikátu

Doporučované, spolehlivé a trvanlivé řešení spočívá v použití důvěryhodného certifikátu, kterým ovladač podepíšete a ten pak bude fungovat „sám od sebe“. Dokonce, na rozdíl od časů nedávno minulých, už dnes může mít důvěryhodný certifikát prakticky každý, aniž by se musel obracet na Microsoft a podstupovat martyrium WHQL. Bohužel jsou tu dva „drobné“ problémky: Prvním je cena a druhým soukromí.

Na rozdíl od starších Windows zvolil Microsoft v moderních 64bitových systémech zásadně odlišný způsob získání důvěryhodnosti. Nemusíte už posílat svůj ovladač Microsoftu, aby ho rozebral na kousky, vytáhl si z něj vaše know-how a pak vám ho vrátil jako nestabilní. Dnes vám stačí vlastnit jeden z podporovaných komerčních certifikátů, kterými svůj ovladač podepíšete (opět odkazuji na článek o Authenticode) a poté ho podepíšete tzv. cross-signing certifikátem Microsoftu. Co je to „cross-signing certifikát“? To je certifikát, kterým jedna autorita (v tomto případě Microsoft) podepsala veřejný klíč certifikátu jiné autority, a tím vytvořila určitý vztah mezi sebou a touto autoritou; prakticky to znamená, že cross-signing umožňuje „propůjčit“ autoritu jednoho certifikátu další autoritě – a následně i certifikátům této „další autority“.

A o to právě při podepisování ovladačů jde – Microsoft si určil několik autorit, kterým důvěřuje, vytvořil pro ně cross-signing certifikáty a tím umožnil každému, kdo si pořídí certifikát od těchto důvěryhodných autorit, aby bez omezení podepisoval svoje ovladače.

Důvěryhodných autorit, pro které existují cross-signing certifikáty Microsoftu, je celkem šest (viz Cross-Certificates for Kernel Mode Code Signing) a aby to bylo jednodušší, čtyři z těchto autorit už neexistují. Pokud tedy chcete podepsiovat ovladače, můžete si vybrat, jestli si chcete koupit Code-Signing certifikát od Verisign nebo Code-Signing certifikát od GlobalSign. Žádný jiný certifikát nejde použít, protože k němu neexistuje cross-signing certifikát!

Koupíte si tedy certifikát od zvolené autority, podepíšete ovladač podle mého článku, nainstalujete, spustíte a… stejně to nebude fungovat. Zapomněli jste totiž na cross-signing certifikát. Potřebný postup je:

  1. Pořiďte si certifikát od jedné z autorit uvedených výše.
  2. Ze stránky Cross-Certificates for Kernel Mode Code Signing si stáhněte jemu odpovídající cross-signing certifikát a rozbalte ho.
  3. Použijte v zásadě obdobný postup pro podepisování jako v mém článku o Authenticode, s jednou změnou: až dojde na vlastní podepsání, doplňte původní příkaz signtool sign /f soubor_pfx /v soubor_k_podepsání další_soubor_k_podepsání ... na signtool sign /f soubor_pfx
    /ac cross_signing_certifikát /v soubor_k_podepsání další_soubor_k_podepsání ...
    – nová je ta část /ac cross_signing_certifikát, která právě říká, že se má ovladač podepsat ještě dalším podpisem.
  4. Pokud chcete mít uživatelsky přívětivou instalaci ovladače, potřebujete ještě vytvořit .cat soubor a také ho podepsat. Jak se to dělá nemám vyzkoušené, já se nahrazování souborů ve Windows nebojím :-). Tudíž vás odkážu na článek The Practical Truth About x64 Kernel Driver Signing, podle kterého jsem všechny svoje pokusy s podepisováním dělal a věřím, že jako všechno ostatní je i část o podepisování .cat souborů plně funkční – viz sekce „The .cat File“ asi v polovině stránky.

Levněji/pohodlněji by to nešlo?

Verisign ani GlobalSign nepatří ke zrovna levným autoritám (500 USD za rok u Verisign, 230 USD za rok u GlobalSign – nenechte se zmást akční cenou 100 USD za rok, ta je jen pro obyvatele USA) a pokud je popis jejich ověřování identity zákazníka přesný, tak není o co stát – tedy aspoň já jsem se rozhodl, že s tím nechci mít nic společného (230 USD bych snad ještě oželel, ale než se nechat takhle lustrovat, to radši zařadím code-signing certifikáty do kolonky „nepoužívat“ hned vedle letů letadlem). Možná vás bude zajímat, jestli jsou nějaké alternativy.

No, jsou. Tedy přesněji, je. Jedna. Plus mínus. A není to žádná radost: Můžete zkusit najít někoho, kdo už potřebný certifikát má a bude ochoten váš ovladač podepsat. První část („najít někoho, kdo certifikát má“) je celkem jednoduchá, o to složitější je část druhá („bude ochoten vám ovladač podepsat“) – potíž je v důvěře:

  1. Podepsáním stvrzuje podepisující, že za daným kódem stojí. Pokud by se později ukázalo, že podepsaný ovladač obsahuje nějaký zlomyslný nebo dokonce zločinný kód, bude mít podepisující hodně velkou práci před případným soudem dokázat, že pachatelem není on, ale někdo jiný. Prakticky s jistotou musíte počítat s tím, že bude chtít vidět zdrojový kód (ne že by mu to bylo něco platné, viz článek Open-source a backdoory) a dost možná celá akce spadne prostě na tom, že těch pár korun, co mu nabídnete (asi to sotva bude víc než těch 230 USD za GlobalSign, že…), nepokryje ani náklady na prozkoumání toho ovladače, natož snad na rizika hrozící ze zneužití.
  2. I když tohle všechno bude splněno – kde berete vy (zákazník) důvěru, že podepisující skutečně jenom podepsal váš kód, ale nepřidal k němu něco svého (posílání hesel na e-mail apod.)? Nemáte praktickou možnost, jak to ověřit – ve zdrojáku ten přidaný kód nebude a porovnání binárních souborů nevede nikam, pokud se vámi a podepisujícím použité verze kompilačních nástrojů sebeméně liší (a mnohdy, i když jsou stejné).

Nicméně, pokud vám nevadí bod 2 a splníte několik podmínek (např. to, že váš ovladač je open source, je napsaný v jednom z podporovaných prostředí a splňuje několik dalších podmínek), můžete zkusit využít nabídky ReactOS Foundaction, která open-source projektům nabízí podepsání ovladače ReactOSím certifikátem. Bude to však chtít, aby váš projekt byl aspoň trochu významný – například moje úprava TrueCryptového ovladače byla zamítnuta 🙁 (upřímně řečeno, ani se nedivím).

Rád bych na tomto místě ještě jednou poděkoval uživateli V. z Okouna, který mi ten TrueCrypt podepsal způsobem, který mi umožnil ověřit integritu kódu (důvěra, bod 2), ale o to nebezpečnějším pro sebe (bod 1). Slibuji, že tato důvěra nebude zklamána a podepsaný ovladač neopustí můj počítač.

 

Pokud někdo bude chtít vyzkoušet tento postup v praxi a projde si i nepopsanými částmi (vlastní získání certifikátu, podepsání .cat souboru), velmi bych uvítal zmínku v komentářích, jak to probíhalo. Děkuji.

Podobné příspěvky:

One Response to “Podepisování 64bitových ovladačů pro Windows”

  1. avatar michal zobec napsal:

    díky, za další článek na toto pro mne zajímavé téma. p.s.: zrovna jsem si požádal o certifikát k podepisování programového kódu tak se pak svěřím se zkušenostmi 😉

Leave a Reply

Themocracy iconWordPress Themes

css.php