A Windows Integrity Control (WIC) régebbi nevén Mandatory Integrity Control (MIC) az a mechanizmus a Vistában és a Windows 2008-ban, amely miatt egy alacsonyabb szinte besorolt processz nem tud Windows üzeneteket küldeni egy magasabb szinten futó processznek. A klasszikus probléma ami miatt ezt bevezették az interaktív szervizek hekkelése volt. Ha egy System account alatt futó szerviznek van Interact with the Desktop beállítása, akkor ki tud rakni ablakot az interaktívan bejelentkezett felhasználó asztalára. Ez látszólag ártatlan dolog. Azonban a magas jogosultságokkal futó szerviz GUI-nak tudunk mi, kis privilégiumú felhasználók üzeneteket küldeni. Ez azt jelenti, hogy ha pl. a textboxok tartalmát a szerviz nem ellenőrzi jól, egy jól irányzott hosszú szöveggel buffer overrunt okozhatunk a szervizben, megfelelő ügyességgel a szövegben elrejtett bináris kódot végrehajtatva vele. Ez az alapprobléma, ezzel nem lehet mit kezdeni Vista előtt, együtt kell élni vele. Gáz, de ez van. Sokszor mondták, ne írjunk ilyen szervizt, de egyszerűbb volt ezt csinálni, mint külön írni egy szervizt és egy sima userként futó klienst, ami mondjuk named pipe-on vagy egyéb IPC-n keresztül kommunikál egymással, biztonságosan.
Vistában egy szerviz magas integritási szinten fut, míg egy nemadmin felhasználó (aki lehet, hogy admin, de az UAC miatt nem admin, mint én is) az közepesen. (Érdekességképpen, egy protected módban futó IE7 esetén az általa elindított folyamtok alacsony szinten futnak.)
A WIC miatt egy közepes folyamat (sima user, sima app) nem tud üzenetet küldeni egy magas szinten futó folyamatnak (szerviz), így az előbbi hekkelési probléma megoldott.
No, aminek apropóján írom ezt, az a következő. A céges VPN-t egy Citrix Firebox SSL programmal érjük el. Ezt adminként kell futtatni, hogy meg tudja változtatni a hálózati beállításokat. Adminként így ő magas integritási szinten fut. Hogy a jelszót ne kelljen begépelnem előszeretettel használom a KeePass automatikus gépelő szolgáltatását, így CTRL-ALT-A-ra az ablak címe alapján benyom olyan billentyűkombinációt a célablakba, amit megálmodtunk. Ez viszont természetesen nem megy az előbbi helyzetben, mert a KeePass nemadminként, így közepes integritású szinten fut. Az integritási szinteket a process explorer mutatja meg, egy processznél a security fülön.
Ellenpróbaként adminként futtattam KeePasst, így egyből gépelt.
Ugyanez a probléma jött elő, csak rejtettebb módon, amikor proteced módban futó IE alatt fejlesztett AddInból adtam ki OutputDebugString hívást (ezt hívja meg a DefaultTraceListener is .NET-ben). A DebugView elvileg az ilyen hívások kimenetét adja vissza, de nem jött meg bele semmilyen üzenet. Utánanéztem, ilyenkor is üzenetek formájában mennek át a szövegek, ergo megint a WIC köpött a levesbe. A megoldás az volt, hogy alacsony integritási szinten kellett futtatni a DebugView-t. Erre írtam egy kis programocskát (ez alapján), ami egy processzt egy adott integritási szinten indít el. A PsExectől várnék el valami ilyesmit. Ha valaki tud ilyen kész utilt, akkor kérem jelezze.
Update: megválaszolom magamnak, a psexec -l Low Integrity-vel indít el egy processzt. :)
Could you hire me? Contact me if you like what I’ve done in this article and think I can create value for your company with my skills.
LEAVE A COMMENT
3 COMMENTS
Soci,
A gyári icacls / setintegritylevel-lel is megy a dolog.
???
Az a fájlok ACL-ében állítja be, hogy az adott integrity levelen futó processz elérheti-e azt. Ez hasznos adalék, de én arról beszélek, hogy hogyan lehet elindítani egy processzt adott integrity levelen? Erre jó a psexec.
Sima user: medium.
Psexec -l: low
Psexec -s: system (system account nevében fut)
Elevated account alatt (run as administrator): high.
Így minden integrity levelen tudunk indítani processzeket.