Av Nilaa Maharjan, Logpoint Global Services & Security Research
Vad är SpoolFool (CVE-2022-21999)?
SpoolFool (CVE-2022-21999) är en lokal privilegieeskaleringssårbarhet i Microsoft Windows Print Spooler-tjänsten som kontrollerar utskriftsoperationer. På alla Windows-plattformar exekveras Print Spooler-tjänsten (spoolsv.exe) som standard vid systemstart.
En användare kan skapa en skrivarport som pekar på en fil på disk med hjälp av Print Spooler-tjänstens funktioner. För att kunna skapa mappar i Print Spoolers drivrutinskatalog och läsa in godtyckliga DLL-filer från den, modifierar SpoolFool-sårbarheten sökvägen till en skrivarport. Detta kringgår säkerhetskontroller som upptäckts i tidigare privilegieeskaleringssårbarheter i Print Spooler. En säkerhetskontroll kan kringgås av en angripare genom att definiera en UNC-sökväg (Universal Naming Convention), till exempel \\localhost\C\spooldir\printers\ (där c:\spooldir är en symbolisk länk till C:\Windows\System32\spool\drivers\x64\). Det gör att godtyckliga filer kan skrivas till den privilegierade katalogen och sedan läsas in som DLL-filer av Print Spool -tjänsten och exekveras med administratörsbehörighet.
Detta ger angriparen ett handtag med behörigheten PRINTER ACCESS ADMINISTER som kan användas för att utföra andra åtgärder såsom DLL-injektion, vilket leder till men inte är begränsat till att skapa lokala administratörsanvändare, vilket beskrivs i den omfattande bifogade rapporten.
Hur illa är det?
CVE | CVSSv3 Score |
---|---|
CVE-2022-21999 | 7.8 |
Allvarlighetsgrad: Kritisk
- Lokal privilegieeskalering
- Resulterar i trivial ”SYSTEM”-åtkomst på sårbara system
- Kopplas sannolikt till andra sårbarheter, skadlig kod och rootkits
Nuvarande situation: Utnyttjas i det fria, koncepttestkod offentligt tillgänglig.
Berörda system:
- Windows Server 2012 R2
- Windows Server 2012
- Windows Server 2008 R2 för x64-baserade system Service Pack 1
- Windows Server 2008 för x64-baserade system Service Pack 2
- Windows RT 8.1
- Windows 8.1 för x64-baserade system
- Windows 7 för x64-baserade system Service Pack 1
- Windows Server 2016
- Windows 10 version 1607 för x64-baserade system
- Windows 10 för x64-baserade system
- Windows 10 version 21H2 för x64-baserade system
- Windows 11 för x64-baserade system
- Windows 10 version 20H2 för x64-baserade system
- Windows Server 2022 Azure Edition Core hotpatch
- Windows Server 2022
- Windows 10 version 21H1 för x64-baserade system
- Windows 10 version 1909 för x64-baserade system
- Windows Server 2019
- Windows 10 version 1809 för x64-baserade system
Förstå sårbarheten:
Introduktion till Spooler-komponenter
Windows Print Spooler är en inbyggd komponent i alla Windows arbetsstationer och servrar och är den primära komponenten i utskriftsgränssnittet. Print Spooler är en exekverbar fil som hanterar utskriftsprocessen. Hantering av utskrifter innefattar hämtning av korrekt skrivardrivrutin, inläsning av drivrutinen, överföring av avancerade funktioner till ett utskriftsjobb, schemaläggning av utskriftsjobbet för utskrift osv. Print Spooler laddas vid systemstart och fortsätter att köras tills operativsystemet stängs av. Print Spoolers huvudkomponenter illustreras i det följande diagrammet.
Introduktion till Spooler-komponenter – Windows-drivrutiner
Tillämpning
Utskriftsprogrammet skapar ett utskriftsjobb genom att anropa Graphics Device Interface-funktioner (GDI) eller direkt till winspool.drv.
GDI
GDI (Graphics Device Interface) innehåller både user-mode- och kernel-mode-komponenter för grafikstöd.
winspool.drv
winspool.drv är klientgränssnittet till Print Spooler-tjänsten. Den exporterar funktionerna som ingår i Print Spoolers Win32 API och tillhandahåller RPC-stubbar för åtkomst till servern.
spoolsv.exe
spoolsv.exe är Print Spoolers API-server. Den implementeras som en tjänst som startas när operativsystemet startas. Denna modul exporterar ett RPC-gränssnitt till serversidan av Print Spoolers Win32 API. Klienter till spoolsv.exe inkluderar winspool.drv (lokalt) och win32spl.dll (fjärr). Modulen implementerar vissa API-funktioner, men de flesta funktionsanrop skickas till en utskriftstjänst via routern (spoolss.dll).
Router
Routern – spoolss.dll – avgör vilken utskriftstjänst som ska anropas, baserat på ett skrivarnamn eller ett handtag som medföljer varje funktionsanrop och skickar funktionsanropet till motsvarande utskriftstjänst.
Utskriftstjänst
Utskriftstjänsten som stödjer den specificerade skrivaren.
Lokal utskriftstjänst
Den lokala utskriftstjänsten erbjuder utskriftskontroll och skrivarhantering för alla skrivare som sköts via den lokala utskriftstjänstens portövervakning.
Nedanstående diagram visar kontrollflödet för den lokala utskriftstjänstens komponenter när ett program skapar en utskrift.
Introduktion till utskriftstjänster – Windows-drivrutiner
Även om detta kontrollflöde är relativt omfattande fokuserar bloggen och den efterföljande rapporten på den lokala utskriftstjänsten localspl.dll.
Symbolisk länk
En symbolisk länk är en typ av fil som länkar till en annan fil, ungefär som en Windows-genväg eller ett Macintosh-alias. Till skillnad från en hård länk innehåller en symbolisk länk inte målfilens data.
Den hänvisar bara till en annan plats i filsystemet.
På grund av denna skillnad har symboliska länkar vissa fördelar jämfört med hårda länkar, såsom förmågan att länka till fjärrmaskiner via NFS-anslutna kataloger eller filer. Målfilens innehåll behålls med hjälp av hårda länkar istället för symboliska länkar när målfilen tas bort.
Bild 1: Hård länk till fil skapad
Bild 2: Symbolisk länk skapad
CVE-2020-1048 och CVE-2020-1337 åtgärdades i maj respektive augusti 2020. Microsoft åtgärdade ett separat problem i Print Spooler i september 2020. Sammanfattningsvis kunde användarna genom att ange SpoolDirectory-egenskapen på en skrivare skapa godtyckliga och läsbara kataloger. Vad var patchens syfte? Innan attributet SpoolDirectory etableras på en skrivare kontrollerar nu Print Spooler att användaren har behörighet att skapa katalogen.
Global exponeringsanalys
Över 17000 instanser är potentiellt sårbara för denna sårbarhet, med Sydkorea och USA är topp 2 på listan, enligt en sökning i Shodan efter ”pjl” och port 9100. Pjl står för Printer Job Language.
Obs! Port 9100 är den port på vilken många skrivare körs som standard. Många maskiner som finns på Shodan är dessutom sannolikt ”honeypots”. Många av systemen i uppskattningen är statliga system eller system för hälso- och sjukvårdsindustrin som inte är patchade.
Värmekartor från Shodan-rapporten
Patcha!
För att förhindra störningar i utskriftstjänsten har Microsoft tillhandahållit uppdateringar. Uppdatera därför dina system så snart som möjligt. Patcha nu!
Det är allt som behövs. Microsoft har publicerat en officiell lösning. Windows Error Reporting Service (WER) missbrukas för att attackera en godtycklig katalogskapande primitiv, enligt denna artikel av Jonas L från Secret Club. Metoden verkar dock inte fungera tillförlitligt på en Windows 10-dator. SplLoadLibraryTheCopyFileModule är däremot tämligen tillförlitlig, men det förutsätter att användaren kan använda en skrivare, vilket är en förutsättning för att denna sårbarhet ska kunna utnyttjas.
Eftersom Print Spooler har fokus för angrepp under längre tid, verkar det osannolikt att angreppen kommer att upphöra – det är åtminstone vad Oliver Lyans olycksbådande avslut ”to be continued…” i slutet av sin artikel verkar antyda.
TL;DR
Genom att ange attributet SpoolDirectory på en skrivare kan en användare skapa valfritt antal skrivbara kataloger. En angripare kan skapa en fjärrskrivare och ge ALLA möjlighet att administrera den eftersom en icke-privilegierad användare tillåts lägga till fjärrskrivare. Detta ger angriparen ett handtag med behörigheterna PRINTER ACCESS ADMINISTER som kan användas för att utföra andra åtgärder såsom DLL-injektion.
I den bifogade rapporten diskuteras det tekniska detaljerna för associerade CVE:er (CVE-2022-21999, CVE-2020-1030, CVE-2020-1337, CVE-2020-1048) och de metoder som en angripare kan använda för att få utökade behörigheter som NT AUTHORITY\SYSTEM.