by Mitja Kolsek, the 0patch Team
[Update 9/15/2021: September 2021 Windows Updates fixed this vulnerability in effectively the same way our micropatch did. The issue was assigned CVE-2021-36958]
[Update 8/11/2021: August 2021 Windows Updates did not fix this vulnerability. We're therefore porting our micropatch to the August versions of executables.]
With PrintNightmare vulnerability still echoing (and still without a complete official fix, in our view), another printing-related issue was found by security researcher Benjamin Delpy that allows a local unprivileged user on a Windows machine to execute arbitrary code as System by installing a malicious printer driver.
In essence, the attacker sets up a printer with a modified driver on a machine they control, and then installs this printer using Point and Print on another Windows computer, gaining full control of said computer. While generally considered a local privilege escalation, this issue could also be used in conjunction with some social engineering to get a remote attacker's code executed on user's machine.
The issue is nicely described in this CERT/CC vulnerability note written by Will Dormann. While Windows have been requiring printer driver packages installed via Point and Print to be signed by a trusted source since 2016, Benjamin discovered that additional executable files can be included in such installation outside the signed package, and these would then be automatically loaded (and their code executed) by the Print Spooler service running as System.
How To Fix This?
In contrast to, say, memory corruption bugs or numeric overflows, this is not a trivial issue to fix; adding signature requirement to queue-specific files would require a lot of code and would be incompatible with the "micro" in micropatching. Disabling the transfer of queue-specific files could do the trick, but might result in confused users when installed printers would suddenly behave differently than before without any notification or warning.
We therefore decided to implement the group policy-based workaround as a micropatch, blocking Point and Print printer driver installation from untrusted servers. This workaround employs Group Policy settings: the "Only use Package Point and Print" first requires every printer driver is in form of a signed package, while the "Package Point and print - Approved servers" limits the set of servers from which printer driver packages are allowed to be installed.
These settings are configurable via registry. Our patch modifies function DoesPolicyAllowPrinterConnectionsToServer in win32spl.dll such that it believes that PackagePointAndPrintOnly and PackagePointAndPrintServerList values exist and are set to 1, which enables both policies and keeps the list of approved servers empty.
Of course, if one has not previously configured Point and Print-related group policy settings, our patch breaks Point and Print driver installation because no servers are approved. On the other hand, on computers which already have these policies enabled, our patch has no effect. The reasoning behind our approach was that many Windows users and admins don't even know they're affected by this issue and just having 0patch installed will automatically resolve this vulnerability for them.
Our micropatch has four tiny patchlets:
MODULE_PATH "..\Affected_Modules\win32spl.dll_10.0.19041.746_32bit_Win10-2004-u202107\win32spl.dll"
PATCH_ID 660
PATCH_FORMAT_VER 2
VULN_ID 7172
PLATFORM win32
patchlet_start
PATCHLET_ID 1
PATCHLET_TYPE 2
PATCHLET_OFFSET 0x4ff70
N_ORIGINALBYTES 5
JUMPOVERBYTES 5
code_start
mov eax, 0 ; we say that registry key PackagePointAndPrint exists
add esp, 0Ch ; align stack pointer
code_end
patchlet_end
patchlet_start
PATCHLET_ID 2
PATCHLET_TYPE 2
PATCHLET_OFFSET 0x4ff8e
N_ORIGINALBYTES 5
JUMPOVERBYTES 5
code_start
mov eax, 0 ; we say that value PackagePointAndPrintOnly exists
add esp, 18h ; align stack pointer
mov dword[ebp-2Ch], 1 ; value of PackagePointAndPrintOnly is 1
code_end
patchlet_end
patchlet_start
PATCHLET_ID 3
PATCHLET_TYPE 2
PATCHLET_OFFSET 0x50018
N_ORIGINALBYTES 5
JUMPOVERBYTES 5
code_start
mov eax, 0 ; we say that registry key PackagePointAndPrint exists
add esp, 0Ch ; align stack pointer
code_end
patchlet_end
patchlet_start
PATCHLET_ID 4
PATCHLET_TYPE 2
PATCHLET_OFFSET 0x50039
N_ORIGINALBYTES 5
JUMPOVERBYTES 5
code_start
mov eax, 0 ; we say that value PackagePointAndPrintServerList exists
add esp, 18h ; align stack pointer
mov dword[ebp-2Ch], 1 ; value of PackagePointAndPrintServerList is 1
code_end
patchlet_end
And the video of our patch in action:
This micropatch was written for:
- Windows Server 2019 (updated with July 2021 Updates)
- Windows Server 2016 (updated with July 2021 Updates)
- Windows Server 2012 R2 (updated with July 2021 Updates)
- Windows Server 2012 (updated with July 2021 Updates)
- Windows Server 2008 R2 (updated with January 2020 Updates, no Extended Security Updates)
- Windows Server 2008 R2 (updated with January 2021 Updates, first year of Extended Security Updates only)
- Windows Server 2008 R2 (updated with July 2021 Updates, second year of Extended Security Updates)
- Windows 10 v21H1 (updated with July Updates)
- Windows 10 v20H2 (updated with July Updates)
- Windows 10 v2004 (updated with July Updates)
- Windows 10 v1909 (updated with July Updates)
- Windows 10 v1903 (updated with December 2020 Updates - latest before end of support)
- Windows 10 v1809 (updated with May 2021 Updates - latest before end of support)
- Windows 10 v1803 (updated with May 2021 Updates - latest before end of support)
- Windows 10 v1709 (updated with October 2020 Updates - latest before end of support)
- Windows 7 (updated with January 2020 Updates, no Extended Security Updates)
- Windows 7 (updated with January 2021 Updates, first year of Extended Security Updates only)
- Windows 7 (updated with July 2021 Updates, second year of Extended Security Updates)
Micropatches for this vulnerability will be free until Microsoft has issued an official fix. If you want to use them, create a free account at 0patch Central, then install and register 0patch Agent from 0patch.com. Everything else will happen automatically. No computer reboots will be needed.
Compatibility note: Some Windows 10 and Server systems exhibit occasional timeouts in the Software Protection Platform Service (sppsvc.exe) on a system running 0patch Agent. This looks like a bug in Windows Code Integrity mitigation that prevents a 0patch component to be injected in the service (which is okay) but sometimes also does a lot of seemingly meaningless processing that causes process startup to time out. As a result, various licensing-related errors can occur. The issue, should it occur, can be resolved by excluding sppsvc.exe from 0patch injection as described in this article.
What to do if the patch breaks printing?
If printing in your network utilizes Point and Print, our patch can cause problems such as users being unable to print to their printers or even seeing them on a network share. If this happens, we recommend adding servers hosting your printers to the approved server list as follows:
- Launch mmc.exe as administrator
- Select File -> Add/Remove Snap-in
- Add "Group Policy Object Editor"
- Under Computer Configuration -> Administrative Templates -> Printers, open the "Package Point and print - Approved servers" policy
- Enable the policy, click the "Show" button, and add the servers your printers are on to the list
Credits
We'd like to thank Benjamin Delpy for sharing details about this vulnerability, and Will Dormann and Kevin Beaumont for sharing lots of useful insights and context that helped us create this micropatch and protect 0patch users.
Please revisit this blog post for updates or follow 0patch on Twitter.
No comments:
Post a Comment