Sociálne siete

SecIT.sk na Facebooku SecIT.sk na Google+ SecIT.sk na Twitteri

Podporte nás


V prípade, že Vám obsah nášho portálu niekedy nejakým spôsobom pomohol, či bol pre Vás prínosom prosím podporte jeho chod ľubovoľnou čiastkou. Ďakujeme!

Štítky

Vyhľadávanie

You are here

Domov
Upozornenie: Obsah je licenčne chránený a bez písomných súhlasov autora článku a vlastníka webovej stránky nesmie byť v žiadnej forme ďalej kopírovaný a šírený v pôvodnom, či v akokoľvek upravenom stave.

Proč jsou čísla procesů dělitelná čtyřmi

Možná jste si toho při pohledu do Správce úloh ani nevšimli, ale je to tak. Identifikační čísla procesů (PID) jsou od Windows 2000 vždy dělitelná čtyřmi. Otázka, proč tomu tak je, může mnohým připadat zbytečná, avšak není tomu tak docela. Abychom si na ni odpověděli, musíme lehce nakouknout do jádra operačního systému.

Vstupním bodem našeho hledání může být třeba funkce OpenProcess, která se používá pro záskání handle procesu s určitým PID. Implmlementace této rutiny nám může napovědět, jak systém s čísly procesů pracuje. Záhy zjistíme, že hlavní náplní funkce je volání NtOpenProcess z knihovny ntdll.dll. NtOpenProcess je jen jakási maketa, obal, který název služby překonvertuje na index do System Service Descriptor Table a následně se postará o přepnutí do režimu jádra, kde dojde k volání rutiny NtOpenProcess (ale teď už v hlavním modulu jádra, ne v ntdll.dll).

V pořadí již druhá funkce NtOpenProcess ve většině případů zavolá na zadané ID procesu PsLookupProcessByProcessId. A tady to začíná být zajímavé - PsLookupProcessByProcessId zachází s PID číslem jako s handle nějakého objektu - pokusí se vyhledat příslušný objekt ve struktuře zvané pspCidTable, což je v podstatě tabulka obsahující ID čísla všech procesů a vláken. Tabulka pspCidTable má stejnou strukturu jako tabulka handlů procesu, a tak nepřekvapí, že pro manipulaci s ní se používají totožné funkce. Toto pozorování implikuje, že čísla procesů (PID), čísla vláken (TID) a hodnoty handle objektů mají podobné vlastnosti. Pokud tedy prokážeme, že čísla PID jsou vždy dělitelná čtyřmi, bude to platit i o TID a také o handlech.

Pokud nahlédneme do jádra ještě trochu hlouběji, zjistíme, že tam se s hodnotou handle pracuje jako s typem EXHANDLE, jehož definice je následující:


typedef struct _EXHANDLE {
  union {
    struct {   
      ULONG TagBits : 2;
      ULONG Index : 30;
    };
    HANDLE GenericHandleOverlay;
  };
} EXHANDLE, *PEXHANDLE;

Interní funkce jádra však manipulují povětšinou s položkou Index, ostatní položky tak maximálně vynulují. Z toho vyplývá, že obsah dvou dolních bitů neovlivní to, zda se určitý proces podaří otevřít, či ne. Protože tyto bity jsou standardně nulovány, jsou handly, PID a TID dělitelné čtyřmi.

Teď Vás jistě napadne vzít PID nějakého procesu, naplnit jeho dolní dva bity a zkusit tuto hodnotu předat funkci OpenProcess. A opravdu to bude fungovat - při zpracovávání parametru se spodní bity vynulují, vznikne původní PID procesu, tudíž příčinou selhání OpenProcess rozhodně nebude neplatné PID. Z tohoto faktu může vyvstat bezpečnostní problém. Představme si například proces s PID 0x400, jenž je chráněn systémem HIPS. Pokud se pokusíme získat přístup k tomuto procesu tak, že například zavoláme OpenProcess s PID 0x401, HIPS může být ošálen, pokud si jeho programátoři nebyli vědomi interní implementace hnadlů. Kód ověřovací rutiny potom může vypadat třeba takto:


if (PID == HlidanePID)
   OdepritPristup();
else PovolitPristup();

Jistě už vidíte, v čem je problém. PID 0x401 hladce proklouzne do větve "else" a přístup k procesu je povolen.

Na tuto "featuru" jsem nepřišel sám, ačkoliv jsem již dlouho tušil, že něco takového bude fungovat. Na stopu mne přivedly stránky www.matousec.com.


Podporte nás


Páčil sa Vám tento článok? Ak áno, prosím podporte nás ľubovoľnou čiastkou. Ďakujeme!


ITC manažer Security-portal.cz Soom.cz
Hoax.cz Antivirove centrum Crypto-world.info