0. Abstract
CVE-2021-34527์ PrintNightmare๋ก๋ ์๋ ค์ ธ ์๋, Printer Spooler์์ ๋ฐ์ํ๋ ์ทจ์ฝ์ ์
๋๋ค. ๋ณธ ์ฅ์์๋ Printer Spooler๊ฐ ์ด๋ค ์ญํ ์ ํ๋์ง, ๊ทธ๋ฆฌ๊ณ ํด๋น 1-day๊ฐ ์ด๋ป๊ฒ ๋ฐ์ํ๋์ง ๋ถ์ํ์ต๋๋ค. ํด๋น ์ด์ผ๊ธฐ๋ ๋ค์ ํฌ์คํธ์์ ๋ค๋ฃจ๊ณ ์์ต๋๋ค.
1. Vulnerability Analysis
์ทจ์ฝ์ ์ ๋ถ์ํ๊ธฐ์ ์์ ์๊ณ ์์ด์ผํ๋ ๋ฐฐ๊ฒฝ์ง์ ๋ฐ ์ทจ์ฝ์ ์ด ๋ฐ์ํ๋ ๋ถ๋ถ์ ๋ํด์ ์ค๋ช
ํ๋๋ก ํ๊ฒ ์ต๋๋ค.
Printing Architecture
Windows์ ํ๋ฆฐํธ ๊ณผ์ ์ ํฌ๊ฒ Client, Spooler, Server ํ๋ก์ธ์ค๋ฅผ ๊ฑฐ์ณ ์งํ๋ฉ๋๋ค. Client๊ฐ ํ๋ฆฐํธ๋ฅผ ์์ฒญํ๋ ๊ฒฝ์ฐ Printer Server๊ฐ ์ด๋ฅผ ์ ๋ฌ๋ฐ์ ํ๋ฆฐํธ๋ฅผ ์งํํ๋ ๋ฐฉ์์ด๋ฉฐ, ๊ทธ ์ค๊ฐ์์ Printer Spooler๊ฐ ์ค์ผ์ค๋ง ๋ฐ ๊ด๋ฆฌ๋ฅผ ๋ด๋นํฉ๋๋ค.
Windows Printing Process.[1]
Printer Spooler
์์ ๊ฐ๋จํ ์ค๋ช
ํ ๊ฒ์ฒ๋ผ, Print Spooler๋ Windows 10์์ ๊ธฐ๋ณธ์ ์ผ๋ก ์ ๊ณตํ๋ ์๋น์ค์ด๋ฉฐ, ์๋์ฐ์์ ํ๋ฆฐํธ๋ฅผ ์ฌ์ฉํ ๋ ์์
์ค์ผ์ค๋ง ๋ฑ์ ๊ธฐ๋ฅ๋ค์ ๊ด๋ฆฌํฉ๋๋ค.
Windows Printing Process(In detail).[1]
Windows์ ํ๋ฆฐํธ ๊ณผ์ ์ ์์ ๊ฐ์ต๋๋ค. ์ ๊ทธ๋ฆผ์์ Spooler๊ฐ ์ํํ๋ ๊ณผ์ ์ ๋นจ๊ฐ์ ๋ถ๋ถ์
๋๋ค. Client์ server๋ RPCํต์ ์ ์ํํ๋ค๋ ์ , ๊ทธ๋ฆฌ๊ณ Localspl.dll์์ Print Spooler๊ฐ ๋์ ์ ํ์ํ ํจ์๋ฅผ ์คํ์ํจ๋ค๋ ์ ์ด ํต์ฌ์
๋๋ค. ๋ณธ ๊ธ์์๋ ์ทจ์ฝ์ ์ ๋ฐ์์ํค๋ Localspl.dll๋ฅผ ์ค์ ์ ์ผ๋ก ๋ถ์ํ๋๋ก ํ๊ฒ ์ต๋๋ค.
Attack Vector Analysis
๋ณธ ์ทจ์ฝ์ ์ ํ๋ฆฐํฐ๋ฅผ ์
๋ฐ์ดํธํ๊ฑฐ๋, ์๋ก ์ค์นํ๋ ๊ณผ์ ์์ ํธ๋ฆฌ๊ฑฐ๋ฉ๋๋ค. ๋ฌธ์ ๊ฐ ๋๋ ํจ์๋ Localspl.dll์์ ์์นํ๊ณ ์๋ SplAddPrinterDriver() ํจ์์
๋๋ค. ๋ณธ ํจ์๋ ํ๋ฆฐํฐ๋ฅผ ์๋ก ์ถ๊ฐํ ๋ ์คํ๋๋ ํจ์์
๋๋ค. SplAddPrinterDriver์ ์ผ๋ฐ์ ์ธ ํจ์ ํ๋ฆ์ ์๋์ ๊ฐ์ต๋๋ค.
1. CacheAddName, MyName: ํ๋ฆฐํฐ ์ ๋ณด๋ฅผ ๋ฐ์์ด
2. _bittest: ํน์ ์์น์ ๋นํธ๋ฅผ ๊ฒ์ฌ
3. ValidateObjectAccess: ์ ์ ํ์ง ์์ ๊ถํ์ ๊ฐ์ง๊ณ ์๋์ง ๊ฒ์ฆ
4. InternalAddPrinterDriverEx: ํ๋ฆฐํฐ ๋๋ผ์ด๋ฒ๋ฅผ ์ค์นํ๋ ํจ์
Python
๋ณต์ฌ
SplAddPrinterDriverEx() ์ผ๋ถ.
์๋ SplAddPrinterDriverEx()ํจ์์ ์ผ๋ถ์
๋๋ค. 21๋ฒ๋ถํฐ 26๋ฒ๊น์ง ์ฝ๋๋ฅผ ๋ณด๋ฉด, _bittest()์ ValidateObjectAccess() ํจ์๋ฅผ ํตํด ๊ฒ์ฆ์ ์งํํ๋ ๊ฒ์ ์ ์ ์์ต๋๋ค. ์ด ๋ ํจ์๋ฅผ ํตํด ๊ถํ์ ๊ฐ์ง๊ณ ์๋์ง ๊ฒ์ฆ์ ํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๋๋ผ์ด๋ฒ๋ฅผ ์ค์นํ๋ ํจ์์ธ InternalAddPrintDriverEx() ํจ์๊ฐ ์คํ๋ฉ๋๋ค.
์ทจ์ฝ์ ์ ์ฒซ ๋ฒ์งธ if๋ฌธ์ธ _bittest()์์ ๋ฐ์ํฉ๋๋ค. ๋ณธ ํจ์๋ &a4 ํ๋ผ๋ฏธํฐ๋ฅผ ์ด์ฉํด ๊ฒ์ฌ๋ฅผ ์งํํ์ง๋ง, &a4๋ user๊ถํ์ผ๋ก๋ ์กฐ์ํ ์ ์๊ธฐ ๋๋ฌธ์ ๊ฒ์ฆ ๋ก์ง์ ์ฐํํ ์ ์์ต๋๋ค. ๋ฐ๋ผ์ ์ด๋ฅผ ํตํด ๊ถํ์ด ์๋ ํ๋ฆฐํฐ ๋๋ผ์ด๋ฒ๋ InternalAddPrintDriver-Ex() ํจ์๋ฅผ ํตํด ์ค์นํ ์ ์์ต๋๋ค.
InternalAddPrintDriverEx() ํจ์์ ์ ๋ฐ์ ์ธ ๊ณผ์ ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค. ๊ณต๊ฒฉ์ ์ํํ ๊ฒฝ์ฐ, ๊ณต๊ฒฉ์๊ฐ ์ฝ์
ํ๊ณ ์ ํ๋ DLL์ 6๋ฒ ๊ณผ์ ์์ ์ฝ์
๋ฉ๋๋ค.
1. ValidateDriverInfo: ํด๋ผ์ด์ธํธ๊ฐ ๋ณด๋ธ ๋๋ผ์ด๋ฒ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์์ ๋๋ผ์ด๋ฒ์ ์๋ช
๊ณผ ํ์ผ์ ํ์์ ํ์ธ
2. CreateInternalDriverFileArray: Spooler ๋๋ ํ ๋ฆฌ์ ๋๋ผ์ด๋ธ ํ์ผ ์์ฑ
3. GetPrintDriverVerison: ๋๋ผ์ด๋ฒ ๋ฒ์ ์ถ์ถ
4. CheckFilePlatform: ๋๋ผ์ด๋ฒ ๋ฐ ๋ฐ์ดํฐ ํ์ผ์ ํ๋ซํผ ๊ฒ์ฌ.
5. CreateVersionDirectory: ๋ฒ์ ๋๋ ํ ๋ฆฌ ์์ฑ
6. CopyFilesToFinalDirectory: old ํน์ ์๋ก์ด ์์ ํ์ ๋๋ ํ ๋ฆฌ์ ๋๋ผ์ด๋ฒ๋ฅผ ๋ณต์ฌ
7. WaitRequredForDriverUnload: ๋๋ผ์ด๋ฒ ๋ก๋๋ฅผ ๋ด๋น
Python
๋ณต์ฌ
PoC Analysis
CVE-2021-34527์ localspl.dll์์ ๋ฐ์ํ๋ ๊ฒ์ฆ ์ฐํ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๊ตฌํ๋๋ RCE ์ทจ์ฝ์ ์
๋๋ค. ์ค์ RCE๊ณต๊ฒฉ์ ์ด๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๋ ๋ฒ์ ๊ฑธ์ณ ์ด๋ฃจ์ด์ง๋ฉฐ, ์์ธํ ๋ด์ฉ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
์ฒซ ๋ฒ์งธ ๊ณต๊ฒฉ์์๋ flag๋ฅผ ์กฐ์ํ์ฌ ๊ถํ ๊ฒ์ฆ์ bypassํฉ๋๋ค. ์ด ๋ฐฉ๋ฒ์ ํตํด์๋ ๊ณต๊ฒฉ์์ ์
์ฑ DLL์ด ๋์ Windows์ ์ฝ์
๋ฉ๋๋ค. ๊ทธ ๋ค์์ผ๋ก๋ RpcAddPrinterDriverEx()ํจ์๋ฅผ ํธ์ถํ์ฌ ์
์ฑ DLL์ ์คํํฉ๋๋ค. ์ด๋ Spooler.exe๋ ๊ธฐ๋ณธ์ ์ผ๋ก SYSTEM๊ถํ์ ๊ฐ์ง๊ณ ์๊ธฐ ๋๋ฌธ์, ์
์ฑ DLL ๋ํ SYSTEM๊ถํ์ ๊ฐ์ง๊ณ ์คํ๋๊ฒ ๋ฉ๋๋ค.
PoC์ฝ๋ ์ผ๋ถ.
2. Reproduction
์ ๋ ์ทจ์ฝ์ ๋ถ์์ ์ด์ด์ ์ค์ Windows 10 ๋จธ์ ์ 1-day๋ฅผ ์ฌํํด๋ณด์์ต๋๋ค. ๋ณธ ์ทจ์ฝ์ ์ ์ฌํํ๊ธฐ ์ํด ์ฌ์ฉํ ํ๊ฒฝ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
Attacker PC: Ubuntu 20.04
Victim PC: Windows 10 Pro (1909, ver 10.0.18363.418)
ํ๊ฒฝ ์ค์
CVE-2021-34527๋ฅผ ์ฌํํ๊ธฐ ์ํด์๋ ๊ฐ Attacker PC์ Victim PC์์ ํ๊ฒฝ ์ค์ ์ ํด์ฃผ์ด์ผ ํฉ๋๋ค.
๋จผ์ Victim PC(Windows)์
๋๋ค. Microsoft๋ ๋ช ์ฐจ๋ก์ ๊ฑธ์ณ(KB5004945, KB5005652 ๋ฑ) ์ด๋ฅผ ํจ์นํ์์ต๋๋ค. ์ฒ์์๋ ์ KB version์ ๋ํ ํจ์น๊ฐ ์ด๋ฃจ์ด์ง์ง ์์ Windows๋ฅผ ๊ตฌํ๋ ค๊ณ ํ์ผ๋, ๊ฒฐ๊ตญ ํจ์น์ ๋ด์ฉ๊ณผ ๋ฐ๋๋ก ๋ ์ง์คํธ๋ฆฌ๋ฅผ ์ค์ ํ๋ ๋ฐฉ๋ฒ์ผ๋ก ๋กค๋ฐฑ์ ํ์์ต๋๋ค. ์์ ํ ๋ด์ฉ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
โข
Spooler Service ON
โข
PointAndPrint ๊ด๋ จ ๋ ์ง์คํธ๋ฆฌ ์ถ๊ฐ
Spooler ๊ตฌ๋ ๋ฐ ๋ ์ง์คํธ๋ฆฌ๊ฐ ์ค์ ๋ ๋ชจ์ต
โข
RPC Server Start
โข
Printer Configuration ์ค โAllow Print Spooler to accept client connectionsโ ์ค์
ํ์ํ Spooler configuration์ ํจ ๋ชจ์ต
๋ค์์ Attacker PC(Ubuntu)์
๋๋ค. Attacker PC์์๋ ํฌ๊ฒ ๋ ๊ฐ์ง๋ฅผ ๋จผ์ ์ค์ ํด์ผ ํฉ๋๋ค.
โข
โข
Samba ์๋ฒ start (โป /etc/samba/smb.conf ์ค์ )
1-Day Reproduction
๋ค์๊ณผ ๊ฐ์ ํ๊ฒฝ ์ค์ ์ ๊ธฐ๋ฐ์ผ๋ก, ์ ๋ CVE-2021-34527์ ํ์ฉํ์ฌ RCE ๊ณต๊ฒฉ์ ์ํํ์์ต๋๋ค. ์ด ์ทจ์ฝ์ ์ ํตํด ๊ณต๊ฒฉ์์ ์๋ฒ๋ก ๋ฆฌ๋ฒ์ค ์์ ์ฐ๊ฒฐํ๋ ์
์ฑ DLL์ Windows์ ์ค์นํ ์ ์์๊ณ , ๊ฒฐ๋ก ์ ์ผ๋ก ๋ฆฌ๋ฒ์ค ์์ ์ป์ด Windows ๋จธ์ ์ ์ฅ์
ํ ์ ์์์ต๋๋ค. ์์ฐ ์์์ ์๋์ ๊ฐ์ต๋๋ค.
3. Mitigations
์ฐ์ Windows๋ฅผ ์
๋ฐ์ดํธ๋ฅผ ํ๋ ๊ฒ์ด ๊ฐ์ฅ ๋ฐ๋์งํฉ๋๋ค. ๋ค๋ง ์
๋ฐ์ดํธ๋ฅผ ํ ์ ์๋ ์ฌ๊ฑด์ด ๋์ง ์๋๋ค๋ฉด, ๋ช ๊ฐ์ง ์ค์ ์ ํตํด ์๋ฐฉํ ์ ์์ต๋๋ค. ๋ณธ ์ทจ์ฝ์ ์ Print Spooler์์ ๋ฐ์ํ๋ ์ทจ์ฝ์ ์ด๊ธฐ ๋๋ฌธ์, Print Spooler๋ฅผ ๋๋ ๊ฒ์ด ๊ฐ์ฅ ๋ฐ๋์งํฉ๋๋ค. ๋ํ PointAndPrint ๋ ์ง์คํฐ๋ฅผ ์ง์ฐ๋ ๊ฒ ๋ํ ํ์์ ์ด๋ผ๊ณ ๋ณผ ์ ์์ต๋๋ค.
Microsoft๋ ๋ณธ ์ทจ์ฝ์ ์ ๋ํ ํจ์น๋ฅผ KB5005652์์ ์งํํ์์ต๋๋ค. ํจ์น ์ดํ์ Spooler๋ฅผ ํ์ธํด๋ณธ ๊ฒฐ๊ณผ, RpcAddPrinterDriverEx()ํจ์์์ ๊ถํ์ ํ์ธํ๋ ๊ณผ์ ์ ์ถ๊ฐํ ๊ฒ์ ํ์ธํ ์ ์์์ต๋๋ค.
RpcAddPrinterDriverEx ์ ์ผ๋ถ
4. Conclusion
๋ณธ ์ทจ์ฝ์ ์ ํฐ ์ ์ฝ์์ด triggerํ ์ ์๋ ์ทจ์ฝ์ ์ด๋ผ ๋ ํ๊ธ๋ ฅ์ด ์ปธ๋ ๊ฒ ๊ฐ์ต๋๋ค. ๊ธ์ ์ฐ๋ ์ด ์์ ์์๋ ์๊ฐ์ด ๋ง์ด ์ง๋ฌ์ง๋ง, ์ฌ์ฉ์๊ฐ ์ด๋๊น์ง ์ ๊ทผํ ์ ์๋์ง, privilege escalation์ด ๊ฐ๋ฅํ ๊ฒ์ ์๋์ง ๊ด์ฐฐํ๋ ๊ฒ์ ํ์์ ์ธ ๊ฒ ๊ฐ์ต๋๋ค.
5. References
[1] Microsoft, Basic Printing Architecture: https://techcommunity.microsoft.com/t5/ask-the-performance-team/basic-printing-architecture/ba-p/372420
[2] Microsoft, Introduction to Spooler Components: https://docs.microsoft.com/en-us/windows-hardware/drivers/print/introduction-to-spooler-components
[4] Github, cube0x0/CVE-2021-1675: https://github.com/cube0x0/CVE-2021-1675