Skrývanie vecí na platforme Windows: Súborové systémy 1
V případě skrývání objektů v souborových systémech je situace oproti registru komplikovanější, zejména proto, že celá architektura se skládá z více vrstev a i způsob komunikace mezi jednotlivými aktéry probíhá odlišným způsobem. Než začneme diskutovat aspekty samotného skrývání, je třeba si o o těchto rozdílech trochu více rozepsat.
Objekty ovladačů a zařízení
Základní kameny v implementaci souborových systémů a okolního aparátu tvoří entity objektu ovladače (driver object) a objektu zařízení (device object). Ne že by se tyto entity neuplatňovaly i v jiných oblastech jádra, ale například v oblasti filtrování registrových operací je jejich použití takřka nulové.
Objekt ovladače je datová struktura uchovávající důležité informace o určitém ovladači. Jedná se například o polohu jeho namapovaného souboru v paměti, jeho jméno a seznam adres rutin, které má systém vyvolat, pokud je potřeba, aby ovladač obsloužil požadavek určitého typu.
Objekt zařízení reprezentuje jakousi schránku schopnou přijímat požadavky. Každý objekt zařízení je vlastněný některým objektem ovladače; ne všechny objekty ovladače ale musí vlastnit nějaké objekty zařízení, protože k provádění některých úkonů nejsou zapotřebí.
Přijímání požadavku objektem zařízení probíhá následujícím způsobem:
- požadavek je doručen zadanému objektu zařízení,
- jádro systému nalezne objekt ovladače, který cílové zařízení vlastní a
- předá řízení rutině uvedené v objektu ovladače pro obsluhu daného požadavku. Konkrétní rutina se vybírá podle jeho typu.
Objekt zařízení lze tedy chápat i jako jakési čidlo, které zaznamenává, co se v okolí děje. Objekt ovladače zprostředkovává spojení tohoto čidla s řídícím systémem (mozkem) tvořeným souborem příslušného ovladače.
Zásobníky zařízení
Celkem často při tvorbě ovladačů narazíte na nutnost vědět, jaké požadavky přicházejí na určité zařízení, jež ale vašemu ovladači nepatří. Nemusí se přitom jednat pouze o zlý úmysl (odposloucháváním, jaké požadavky přijímají zařízení klávesnic lze vytvořit poměrně dobře skrytý keylogger); nástroje šifrující obsah disků (TrueCrypt, Bitlocker aj.) musí nejen vědět, jaké požadavky na jimi šifrovaná zařízení přicházejí, ale dokonce potřebují takové požadavky i měnit (dešifrovat načtená data, šifrovat zapisovaná).
Jádro systému za tímto účelem exportuje mechanismus, který ovladačům dovoluje zavěšení nad cílové zařízení, čímž dojde k vytvoření tzv. zásobníku zařízení (device stack). Opakováním tohoto procesu může například vzniknout zásobník z obrázku 1.
Nová zařízení lze připojovat pouze na aktuální vrchol zásobníku. Obvykle ovladač, jehož zařízení se nachází na dně, plně implementuje určitou funkcionalitu (třeba souborový systém), kdežto ostatní ovladače se zařízeními nad ním plní roli tzv. filtrů; zajímají se pouze o určitou množinu požadavků a určitým směrem rozšiřují implementaci poskytovanou ovladačem na dně.
V případě, že určitá entita chce zaslat požadavek na určité zařízení, neměla by tak činit přímo. Místo toho by jí slušné chování mělo donutit předat požadavek zařízení na vrcholu zásobníku, kde se pravé cílové zařízení nachází. Jjak naznačuje předchozí věta, jdná se však spíše o dobrý zvyk, který se v drtivé většině případů dodržuje, než o neporušitelné pravidlo. Nic teoreticky nebrání ovladači zasílat požadavky přímo na určité zařízení a na vrchol zásobníku se neohlížet. Pak se samozřejmě ovladače se zařízeními umístěnými nad tím cílovým o takovém požadavku nedozví (nemohou jej ale ani pozměnit či zablokovat).
Aby zásobníky zařízení správně fungovaly, musí ovladače v nich zainteresované dodržovat velmi důležitou zásadu: požadavky, jež neumějí nebo nemohou obsloužit, musí být odeslány na zařízení nacházející se níže v zásobníku. V ideálním případě pak každý požadavek začíná svoji dráhu u zařízení na vrcholu zásobníku. Zásobníkem propadá, dokud se nenajde ovladač schopný jeho obsluhy. Následně zpráva o obsluze požadavku (ať už byla úspěšná či nikoliv) cestuje opačným směrem až na vrchol.
Obrázek 1: Schéma zásobníku zařízení
Ovladače zavěšené nad určitým zařízením mají nad požadavky jemu zasílané (ale ne zasílané přímo) absolutní kontrolu. Mohou je monitorovat, blokovat, měnit vstupní a výstupní parametry či emulovat. Situace je tedy podobná jako v případě manipulace s registrovými operacemi.
Manipulace se souborovými operacemi
Na obrázku 2 vidíte zásobníky zařízení, které se zapojují do akce u souborových a diskových operací. Požadavky jimi obvykle procházejí zleva doprava, ačkoliv je možné některé zásobníky úplně přeskočit. Aplikace může komunikovat přímo s diskovým zařízením, a tak se vyhnout ovladači souborového systému a správci svazků. Ovladače v zásadě mohou přeskočit až do zásobníku reprezentujícího hardware diskového zařízení nebo rozhraní, kterým je toto zařízení k počítači připojeno.
Požadavek na souborovou operaci je nejprve odeslán ovladači souborového systému, kde se nachází soubor či adresář, jehož se daná operace týká. Ovladač souborového systému (např. ntfs.sys pro NTFS či fastfat.sys pro FAT) je zodpovědný za provedení zadané operace. Pokud se do tohoto zásobníku zavěsí například zařízení ovladače útočníka, může pozměňovat výsledky operací tak, aby došlo ke skrytí určitých souborů a složek.
Pokud nelze požadavek obsloužit na místě, ovladač souborového systému jej pošle do zásobníku správce svazků. Správce svazků již nemá potuchy o souborech či adresářích. Většina jeho zařízení reprezentuje konkrétní svazky (diskové jednotky, potažmo oddíly, často bývají označené velkým písmenem jako A:, C: atd.), jejichž obsah interpretují právě ovladače souborových systémů. Ovladač souborového systému obvykle překládá souborové operace do série čtení a zápisů, případně jiných typů požadavků, kterým správce svazků (nebo některý z ovladačů v dalších zásobnících) rozumí.
Do zásobníku správce svazků se obvykle zavěšují například ovladače dovolující šifrování svazků a disků, protože mohou sledovat a modifikovat pokusy o čtení a zápis dat v rámci jednoho svazku. Patří mezi ně i Bitlocker. Neméně známý šifrovací nástroj TrueCrypt při šifrování disků a diskových oddílů postupuje jiným způsobem. Svá zařízení zavěšuje až do zásobníku reprezentujícího celé diskové zařízení (tedy všechny oddíly či jejich části na něm). V případě šifrovaných kontejnerů se správcem svazků stává sám ovladač TrueCryptu a po potřebných úkonech odesílá požadavky ovladači souborového systému, na kterém je příslušný kontejner umístěn.
Správce svazků upravuje přijaté požadavky tak, aby jim rozuměla zařízení v zásobníku reprezentujícímu celé diskové zařízení, na kterém se příslušný svazek nachází. Dolní část tohoto zásobníku se již odlišuje podle toho, jak je daný disk připojen (USB, ATA, SATA, SCSI aj.). Cílem ovladače se zařízením na dně zásobníku je opět přetransformovat požadavky tak, aby jim rozuměly ovladače v posledním zásobníku. V případě zásobníků na obrázku 2 se jedná o ovladače zodpovědné za obsluhu USB Mass Storage zařízení a USB hubu, ke kterému jsou tato zařízení připojena.
Obrázek 2: Zásobníky zařízení zainteresované v souborových operacích
A druhým obrázkem končí tento díl seriálu o skrývání věcí na platformě Windows. Následující díl se bude věnovat taktéž souborovým systémům a dozvíte se v něm, jaké nástrahy na útočníka čekají, pokud se rozhodna v této oblasti provádět nepěknosti, a jak tyto nástrahy může překonat.