Nadat ik zelf eerder deze week met een oudere freeware
versie van IDAPro GDI32.DLL had gedisassembleerd, en
probeerde te snappen hoe de WMF "SetAbortProc" exploit
precies werkt (maar daar nog niet uit ben), heeft notabene
de auteur van IDAPro, Ilfak Guilfanov, een patch gemaakt!
Voor de geinteresseerden uitleg hoe e.e.a. werkt.
"Escape" functies in de Windows GDI (Graphics Device
Interface) worden vooral voor printen gebruikt maar komen
ook veel voor in metafiles om een soort "comments" mee op te
slaan. De Escape functie kent meerdere subfuncties,
waaronder "SetAbortProc" waarmee je een routine aanmeldt die
wordt aangeroepen bij printer storingen. Daarbij wordt
code in de metafile opgenomen. Die aanpak stamt uit
de Windows 3.x tijd, en wordt, voor zover ik weet, onder
Win32 niet meer gebruikt. Microsoft's GDI32.dll bevat onder
andere de code die uiteindelijk metafiles interprteert.
Ik weet (nog) niet zeker of Microsoft het
uitvoeren van
code in metafiles heeft uitgeschakeld in Win32, en dat
dit hier omzeild wordt door een andere bug,
of dat
Microsoft hier een
megablunder heeft begaan. In elk
geval is dit het probleem waar de WMF exploits gebruik van
maken.
Ilfak's patch werkt als volgt. Na installatie in
c:windowssystem32 wordt zijn wmfhotfix.dll aangemeld in de
registry onder AppInit_DLLs (een normaal gesproken wel
bestaande maar lege string value); zie
http://support.microsoft.com/default.aspx?scid=kb;en-us;197571voor meer info. N.B. de kans bestaat dat antivirus of
antispyware deze patch na reboot als een gevaar bestempelt
(Google naar AppInit_DLLs). RootkitExplorer (SysInternals)
en Rootkit Analyzer (Resplendence) vermelden hem echter niet.
Na reboot zal elk proces (programma) dat Microsoft's
User32.dll inlaadt (en dat doen in de praktijk alle
processen), tevens wmfhotfix.dll inladen en initialiseren
(een routine er in aanroepen). Die wmfhotfix.dll routine
laadt vervolgens
zelf (d.w.z.
voordat door jou
gestartte programma's dit doen) GDI32.dll in het geheugen.
Daarna maakt wmfhotfix.dll een kleine wijziging in de (nu in
het geheugen gelaadde) code van GDI32.dll: aanroepen naar de
Escape functie worden omgeleid naar een "thunk" routine in
wmfhotfix.dll. Die routine checkt of het Escape subfunctie 9
betreft (SetAbortProc); zo ja wordt een foutcode
geretourneerd (en exploits vermeden), zo nee wordt de
oorspronkelijke GDI Escape routine aangeroepen. Door deze
aanpak wordt het bestand GDI32.DLL op je schijf
zelfniet gewijzigd. Als jouw programma daarna GDI32 functies
nodig heeft zal deze de dll niet opnieuw van schijf laden,
omdat de code reeds in "zijn" geheugen aanwezig is.
Installeren en de-installeren van de gisteren gepubliceerde
versie op een volledig gepatchte Engelstalige XP-SP2 werkte
bij mij probleemloos. Ik kon er gelukkig niets in ontdekken
dat wees op taal-afhankelijkheden (NL XP zal ook werken), en
ik verwacht ook geen problemen met XP SP1. Of deze patch ook
echt werkt tegen de actuele WMF exploits heb ik nog
niet getest, maar ik vermoed van wel.
Op
http://isc.sans.org/diary.php?date=2006-01-01kun je op dit moment een door Tom Liston geteste versie 1.1
downloaden (met tevens Win2000 support). Op
http://www.hexblog.com/2005/12/wmf_vuln.htmlstelt Ilfak Guilfanov een versie 1.2 beschikbaar die
voorkomt dat je de patch per ongeluk 2x installeert (ik heb
alleen de eerste versie getest).
Erik van Straten