Search
๐Ÿ–จ๏ธ

CVE-2021-34527

Tags
PrintNightmare
Year
2021

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

[4] Github, cube0x0/CVE-2021-1675: https://github.com/cube0x0/CVE-2021-1675