CWDIllegalInDLLSearch toch nodigMicrosoft stelt mij opnieuw teleur: als de registernaam "
CWDIllegalInDLLSearch"
niet bestaat in de registersleutel "HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\" (1 spatie tussen Session en Manager) dan kunnen
onveilig geprogrammeerde programma's ook in de "Current Working Directory" (CWD) naar DLL's en dergelijke zoeken - namelijk als ze zo'n DLL niet op andere,
logische, plaatsen kunnen vinden.
En standaard bestaat "
CWDIllegalInDLLSearch" niet in Windows 10. Mijn advies is om deze toe te voegen (type DWORD) met waarde 0xFFFFFFFF, maar zoals ik in mijn vorige bijdrage schreef zijn sommige programma's zo slecht geprogrammeerd dat ze dan niet meer werken.
Nb. na het toevoegen van die value-name of het wijzigen van de waarde ervan, moest ik wel elke keer Windows helemaal opnieuw opstarten om het gewenste effect te krijgen.
Ernstige kwetsbaarheid?Is het een drama dat CWDIllegalInDLLSearch niet bestaat en onveilig geprogrammeerde programma's tot DLL hijacking kunnen leiden? Niet als je netjes werkt, geen domme dingen doet, en in Verkenner (Explorer) "hidden" en "system files" zichtbaar maakt evenals bestandsextensies (of een programma zoals Total Commander gebruikt waarin je dat doet). Zie ook onderaan deze post.
Is dit een vulnerability in de ogen van Microsoft? Nee, omdat zij er waarschijnlijk vanuit gaat dat je in de eerste plaats moet voorkómen dat je kwaadaardige uitvoerbare code op je schijf zet.
Is het een risico? Ja, want je kunt misleid worden, vooral als je een rommeltje van je systeem maakt (uitvoerbare bestanden in jouw mappen, d.w.z. waar je schrijfrechten hebt, laat staan).
Eén van de redenen daarvoor is dat als een programma DLL's laadt, Windows
niet kijkt of het "Mark of the Web" (MotW, zie
https://security.nl/posting/647385) gezet is op die DLL's (voor zover MotW überhaupt een betrouwbaar systeem is). Je krijgt dus nooit een waarschuwing als een DLL, gedownload vanaf internet, zo'n MotW heeft en door een programma geladen en uitgevoerd wordt.
Echter, zoals ik verderop laat zien, "CWDIllegalInDLLSearch=0xFFFFFFFF" voorkomt niet
al dit soort problemen.
Alternatieve uitleg (Windows)Door Anoniem: Erik van Straten, dank voor de uitgebreide uitleg. Ik zal het nog een paar keer moeten lezen.
Misschien helpt een iets andere uitleg.
Nb. ik schrijf achter directories en registry keys zoveel mogelijk een \ om verwarring met bestanden en name/value paren te voorkómen. Het is m.i. een blunder dat die er niet altijd achter staat (en dat geldt ook voor de / in Linux e.d.). Helaas slikken veel programma's zo'n trailing backslash (Linux: slash) niet.
Stel je de volgende situatie voor:
• Jouw Windows gebruikersnaam is Henk;
• Er staat geen Word op jouw systeem, of je hebt hersteld dat
*.RTF files in WordPad openen;
(effectief in "C:\Windows\System32\Write.exe", maar die start door met "C:\Program Files (x86)\Windows NT\Accessories\wordpad.exe" - althans onder Windows 10; of dit in W11 nog zo is, weet ik niet)
• De volgende bestanden bestaan (eventueel naast een hoop andere meuk):
C:\Users\Henk\Downloads\leesme.rtf
C:\Users\Henk\Downloads\mapi32.dll
waarbij "mapi32.dll" malware bevat.
1) CWD: als je op die "leesme.rtf" dubbelklikt en write.exe of wordpad.exe zou mapi32.dll laden en code daarin uitvoeren, dan is sprake van DLL hijacking. In mijn W10 wordt die mapi32.dll
niet geladen, ongeacht of CWDIllegalInDLLSearch de waarde 0xFFFFFFFF heeft, of 0, of niet bestaat. Dus Write en Wordpad lijken veilig geprogrammeerd.
Terzijde, voor de nerds onder ons: met procmon64 zag ik dat wordpad.exe wel degelijk checkt of mapi32.dll bestaat in CWD (ook met "CWDIllegalInDLLSearch = 0xFFFFFFFF" - als een stomme programmeur het wil kan deze gewoon code laden uit CWD). Als die file bestaat dan worden daar de file-attributes van opgevraagd - maar er wordt niets uit de file zelf gelezen (en er wordt niet naar andere DLL's dan mapi32.dll gekeken). Als je in Wordpad vervolgens op menu "File -> Send in email" klikt, wordt mapi32.dll geladen uit C:\Windows\SysWOW64\ en/of uit C:\Windows\System32\. Zo te zien nog steeds safe, maar wel opmerkelijk.
Er
zijn programma's die wel kwetsbaar zijn voor DLL hijacking, zoals InkScape (ook de laatste versie, met een installer helaas zonder digitale handtekening). Met een oude versie (0.92.4) kon ik dit mooi demonstreren, door c:\test\ te maken, de geïnstalleerde inscape.exe daar naartoe te kopiëren, de map c:\test\work\ te maken en daar alle geïnstalleerde DLL's naartoe te kopiëren. Als ik nu,
in c:\test\work\ opstart:
• zonder "CWDIllegalInDLLSearch": Inkscape werkt;
• met "CWDIllegalInDLLSearch=0xFFFFFFFF": foutmelding.
Bij de laatste versie van InkScape is dit lastiger te zien vanwege een andere map-indeling na installatie. In beide gevallen krijg je daarmee foutmeldingen bij zo'n experiment, maar verschillende. Ook kan ik met procmon64 zien dat, zonder "CWDIllegalInDLLSearch", wel degelijk DLL's geladen worden uit CWD (terwijl inkscape.exe uit een andere map is gestart).
Maar nadat je zo'n programma hebt geïnstalleerd, zal deze, normaal gesproken, de benodigde DLL's
eerst zoeken en vinden in de "program directory" en submappen daarvan, en daarom daar
niet naar zoeken in CWD. Wat wel kan is dat een programma een "optionele" DLL probeert te laden die bijv. t.g.v. een custom install niet op de schijf is terechtgekomen. Zonder CWDIllegalInDLLSearch=0xFFFFFFFF zal dan ook in CWD worden gezocht; een
potentieel risico.
2) Program directory / PATH (met "program directory" bedoel ik de map waarin de executable staat). In scenario 1 werd er geen kwaadaardige code uit mapi32.dll uitgevoerd, maar wat gebeurt er als je
tevens "write.exe" uit "c:\windows\system32\" kopieert naar "C:\Users\Henk\Downloads\" en
die kopie opstart? Het resultaat na kopiëren is:
C:\Users\Henk\Downloads\leesme.rtf
C:\Users\Henk\Downloads\mapi32.dll
C:\Users\Henk\Downloads\write.exe
waarbij "mapi32.dll" nog steeds malware bevat.
Als je in die situatie op het onderste bestand "write.exe" dubbelklikt (met het plan om daarna "leesme.rtf" vanuit wordpad te openen) of vanuit een command prompt in C:\Users\Henk\Downloads\ uitvoert:
C:\Users\Henk\Downloads > write leesme.rtf
dan moet je niet gek opkijken als kwaadaardige code in "mapi32.dll" (of andere DLL's als je die ook in die map zet) wordt uitgevoerd.
Reden: het is
verwacht gedrag dat programma's
in de map waarin ze zelf staan (de "program directory") zoeken naar DLL's.
Concreet griezelig voorbeeldOm DLL hijacking uit te kunnen leggen heb ik gisteravond een tijdje met "Proces Monitor" (
https://learn.microsoft.com/en-us/sysinternals/downloads/) gezocht naar executables van o.a. Windows met DLL hijacking kwetsbaarheid, en zo meerdere opmerkelijke zaken ontdekt. Van het onderstaande zat ik te dubben of ik het kon publiceren, maar vanochtend heb ik gegoogled (*) naar
"workfolders.exe" vulnerability en zag dat anderen dit eerder al hebben gepubliceerd.
(*) Off topic: voor het eerst van mijn leven zag ik reclame op de frontpage van google.com: "New! Meet the latest Fitbit smartwatches". Ik ben niet tegen reclame, maar dit viel mij wel op.
Ik ga ervan uit dat Microsoft dit geen kwetsbaarheid vindt, maar het zit er wel tegenaan en laat zien dat je ook met Windows boordmiddelen scenario 1 kunt demonstreren, als volgt.
a) Maak een nieuwe map, bijvoorbeeld C:\1337\
b) Kopieer C:\Windows\System32\calc.exe naar C:\1337\
c) Hernoem (in C:\1337\) calc.exe in control.exe
d) Geef control.exe in C:\1337\ het attribuut hidden (onzichtbaar)
e) Start een command prompt (cmd.exe) en voer uit:
C:\Windows\System32 > cd \1337
C:\1337 > dir
Constateer dat de directory leeg is (niet echt, want control.exe staat er in, te zien met "dir /a"). Sluit het venster nog niet.
Open
https://youtu.be/dQw4w9WgXcQ, skip de reclames en voer uit in de command prompt:
Tadaa... calculator start 8-)
What just happened? C:\Windows\System32\WorkFolders.exe kijkt in CWD of control.exe bestaat, en zo ja, start deze. Ik heb geen idee waarom.
Is dit een kwetsbaarheid? Niet meer dan dat je op je desktop een batchfile of snelkoppeling neerzet die je "Veilig.bat" of "KanGeenKwaad.lnk" noemt waarmee "C:\1337\control.exe" wordt gestart. Als iemand (jijzelf, onbedoeld, of iemand anders) dat bestand door een kwaadaardige control.exe heeft vervangen, heb je een probleem als je daarna jouw batchfile of snelkoppeling uitvoert.
Wel is het zo dat "workfolders.exe" met een digitale handtekening (Authenticode) is ondertekend (**) en dus
onder een andere naam als "malware" zou kunnen worden gedownload, wellicht om voor minder (ernstige) waarschuwingen te zorgen.
(**) De meeste Windows files hebben (lekker verwarrend) een detached (losgekoppelde) elders opgeslagen Authenticode signature. Met bijv. de commandline tool "sigcheck.exe" van Sysinternals (zie boven) kun je die signature checken.
Als test heb ik de neppe control.exe (feitelijk calc.exe) voorzien van een MotW en daarna "Workfolders.exe" gestart. Tot mijn verrassing kwam Windows met een waarschuwing dat control.exe vanaf internet kwam. Dat viel dan weer mee! Maar als iemand control.exe op je schijf kan zetten, bestaat de kans dat daarbij die MotW verwijderd kan worden.
Beste oplossingLaat nooit "uitvoerbare" potentieel kwaadaardige code slingeren (en zorg dat je ze kunt zien). Let op: zeer veel bestandssoorten moet je als "uitvoerbaar" beschouwen (ook bijv. .chm files, postscript files, drivers, ocx files, hta files, scripts natuurlijk etcetera). Cyberhygiëne dus!
Voor nog meer duidelijkheid kun je ook "SuperHidden" bestandsextensies zichtbaar maken, waaronder
.lnk (nadeel is dat je in start menu e.d. ook al die .lnk extensies ziet). Zie
https://security.nl/posting/39055,
https://www.techguy.org/threads/show-super-hidden-file-extensions.384336/ en
https://ss64.com/nt/superhidden.html.
En voor meer (niet alle) zekerheid kun je "CWDIllegalInDLLSearch" aanmaken (DWORD) en op 0xFFFFFFFF zetten (met het risico op niet werkende
stomme programma's). Zie ook
https://msrc-blog.microsoft.com/2010/08/31/an-update-on-the-dll-preloading-remote-attack-vector/ of zoek op internet naar "CWDIllegalInDLLSearch".
Door Anoniem: Ik denk dat een uitleg over veilig downloaden en uitvoeren/bekijken van die bestanden (installer/portable/info-pdf) van iemand met uw kennis wel heel nuttig zal zijn.
Ik ga proberen daar binnenkort tijd voor vrij te maken.