Hlavní navigace

TRESOR: šifrujte bezpečně mimo RAM

21. 6. 2011
Doba čtení: 6 minut

Sdílet

Běžné implementace šifrovacích algoritmů spoléhají na ukládání šifrovacích klíčů i algoritmů v paměti RAM. To je sice standardní způsob, má ale svá úskalí a bezpečnostní nedostatky. Šifrovací klíče je možné z paměti několika způsoby dostat, a pak máme velký bezpečnostní problém. TRESOR na to jde jinak.

V paměti není bezpečno

Šifrovací algoritmy dnešních operačních systémů jsou léty prověřené a můžeme je směle považovat za bezpečné. I ony ale mají svou slabinu – udržují šifrovací klíče v paměti RAM. V minulosti už bylo předvedeno několik technik, které umožňují klíče z paměti násilím dostat.

Nejznámější je takzvaný cold boot attack, při kterém je běžící počítač restartován a z externího média je načten miniaturní operační systém, který uloží obsah paměti. Jelikož se obvykle paměť při tvrdém resetu nemaže, můžeme se takto jednoduše ke klíčům dostat. Ještě jistější varianta tohoto útoku spočívá v podchlazení paměťových modulů a jejich přenesení do jiného počítače i s daty.

Druhou zajímavou možnost nabízejí FireWire porty, které mají mnoho let známou zranitelnost – pomocí přímého přístupu do paměti (DMA) obcházejí jakoukoliv hardwarovou bezpečnostní politiku a dovolují útočníkovi libovolně načítat i modifikovat obsah paměti. Existují hotová řešení v podobě „FireWire flash disků s tlačítkem“, které stačí do počítače zasunout a ony se postarají o rychlé stažení obsahu paměti.

Tyto (a další) útoky vyžadují fyzický přístup k počítači, ale stejně tak je možné skrze bezpečnostní díru v systému získat práva roota a opět si klíče několika způsoby z paměti přečíst. Tyto útoky demonstrují, že šifrovací klíče v paměti RAM nejsou uchovány zcela bezpečně. To si uvědomili pánové z univerzity v německém Erlangenu a připravili implementaci AES, která v paměti RAM neuchovává vůbec nic.

Zamkneme klíče v trezoru

Výsledkem je TRESOR – patch do linuxového jádra, který využívá rozšířené instrukční sady AES-NI. Tu výrobci (Intel i AMD) dávají do svých nejnovějších 64bitových procesorů. Intel do Core i5 a i7, AMD do procesorů řady Bulldozer. Primárním cílem této technologie je hardwarová akcelerace AES šifrování. Zároveň ale umožňuje zcela zrušit tradiční softwarové šifrování v paměti RAM.

Na místo toho jsou všechny kritické informace uloženy přímo v ladících registrech procesoru. Ty jsou netradičně využity jako datové úložiště, které je schopno pojmout klíče o délce 128, 192 i plných 256 bitů. Díky hardwarové podpoře nedochází k žádnému úbytku výkonu proti jiným implementacím udržujícím klíče v RAM.

TRESOR je možné využít i na procesorech, které nedisponují AES-NI instrukcemi. Postačí, že podporují instrukční sadu SSE2, která je v procesorech už téměř deset let. V takovém případě se ale budete muset smířit jen se 128bitovým AES a připravit se na výrazný pokles výkonu – až na šestinu původní „softwarové“ hodnoty.

TRESOR pak provádí veškeré šifrování a všechny datové struktury, klíče, ale i samotný AES algoritmus uchovává přímo (a pouze) v procesoru. Jak už jsme si řekli, software je implementován jako patch do jádra. V uživatelském prostoru by nemohl běžet ze dvou důvodů: jednak je zde riziko, že by se při přepnutí kontextu objevil obsah registrů v RAM a především je třeba zajistit, aby se běžné procesy k citlivým registrům nedostaly ani přímo. Jakákoliv aplikace by si pak mohla klíče přečíst. Proto k nim může jen jádro.

Samozřejmě klíče musí být na začátku nějak získány, než jsou přeneseny do chráněných registrů v procesoru. K tomu je samozřejmě použita paměť RAM, ale jen na kratičký okamžik. Vše navíc proběhne v kernel space odděleně od aplikací. Pak jsou klíče z paměti odstraněny, takže při běžném provozu už není možné se k nim dostat.

Použití v praxi

TRESOR je dodáván jako patch proti jádru 2.6.36. To bylo v době jeho vzniku nejnovější a zatím není k dispozici verze pro novější jádra. TRESOR je integrován do jaderného Crypto API a umožňuje tak bezproblémové využití v různých aplikacích, které toto API používají. Pokud například šifrujete disk pomocí dm-crypt, můžete výhod TRESORu využít. Naopak třeba populární TrueCrypt Crypto API nevyužívá.

V rámci jádra je možné zavádět jednotlivé šifrovací algoritmy jako samostatné moduly. Tvůrci TRESORu se rozhodli nechat klasický AES modul být a zavedli zcela nový šifrovací modul. Obě implementace AES je tak možné mít v jádře najednou a třeba porovnávat jejich výkony.

Pokud si chcete TRESOR vyzkoušet, stáhněte si z jeho domovské stránky příslušný patch. K dispozici jsou dvě verze – pro procesory s podporou AES-NI a bez ní. Oba mají okolo 40 KB. Kromě tohoto patche budete potřebovat také zdrojové kódy jádra 2.6.36, které získáte třeba na Kernel.org. Poté jádro rozbalte (standardně do /usr/src/linux-2.6.36 a aplikujte patch:

# patch --directory /usr/src/linux-2.6.36 -p1 < tresor-patch-2.6.36

Poté proveďte konfiguraci a překlad jádra. Nezapomeňte v sekci Cryptographic API povolit AES algoritmus TRESOR. Poté jádro nainstalujte do systému a restartujte do něj.

Systém se vás při startu zeptá na heslo. To je použito k vygenerování klíčů a jejich následnému uložení do registrů procesoru. Pokud navíc počítač uspíte, klíče budou automaticky zahozeny a během probuzení se vás jádro (respektive TRESOR) zeptá na heslo znovu. Jeho správnost (aby se nerozbily připojené disky vlivem změny klíčů) je kontrolována pomocí hashe, který je uložen normálně v RAM.

Po startu systému už můžete rovnou vytvořit šifrovaný oddíl a použít jej. Například takto:

# cryptsetup create tresor /dev/sdb1 --cipher tresor --key-size 256
# mkfs.ext3 /dev/mapper/tr
# mount /dev/mapper/tr /mnt/bezpecno

Data na novém disku jsou automaticky transparentně šifrována pomocí TRESORu.

Je to opravdu bezpečné?

Zásadní je pro nás otázka, zda se skutečně jedná o stoprocentně bezpečnou technologii. Z hlediska zmíněných i nezmíněných útoků na paměť RAM je to ochrana absolutní. Z paměti jednoduše nezjistíte nic. Nabízí se ale otázka, zda není možné podobným (nebo jiným) způsobem zaútočit na obsah registrů v procesoru.

Existují dva teoretické způsoby, jak se pokusit údaje vydolovat. Běžný uživatel se k nim nedostane, ale pokud by útočník získal práva roota, mohl by zavést vlastní jaderný modul, který by byl schopen data získat. Stejně tak by bylo možné využít /dev/kmem a propašovat do jaderného prostoru svůj vlastní kód. Tato hrozba je naprosto reálná.

Existuje ale řešení – pokud byste připravili vlastní jádro bez podpory LKM a KMEM, ani root by pak neměl možnost klíče z procesoru dostat nebo je vyměnit. Klíč by pak byl nastavitelný jen při startu počítače a už by nebylo možné na něj bez restartu sahat.

Samozřejmě ještě existuje teoretická možnost útoku na hardware samotný. Mohla by se objevit metoda čtení registrů z elektromagne­tického pole počítače nebo třeba proměřováním signálů na základní desce. Zatím ale nic konkrétního k dispozici není, i když není možné vyloučit, že časem někdo zajímavý a účinný útok nevymyslí.

CS24_early

Zatím jako ukázka

TRESOR je zatím jen takový proof of concept a ukazuje, že je možné se na běžnou problematiku podívat ze zcela jiného úhlu. Faktem je, že je to ukázka plně funkční a využitelná. V praxi vám pravděpodobně bude vadit především závislost na jediné verzi linuxového jádra a nedostatečná prověřenost této technologie včetně možných bezpečnostních problémů.

Že to není myšlenka nezajímavá, dokazuje fakt, že se o ni zdaleka nezajímají jen autoři TRESORu, ale existují i konkurenční implementace, jako například Loop-Amnesia. Třeba se ale jednoho dne dočkáme integrace něčeho podobného přímo do jádra.

Byl pro vás článek přínosný?

Autor článku

Petr Krčmář pracuje jako šéfredaktor serveru Root.cz. Studoval počítače a média, takže je rozpolcen mezi dva obory. Snaží se dělat obojí, jak nejlépe umí.