๐Ÿค– Scenario 04: ์ปค๋„ ํž™ UAF & ์Šฌ๋žฉ ์˜ค์—ผ ๋ฐฉ์–ด ์•„ํ‚คํ…์ฒ˜

CVE-2022-0185 / CVE-2021-22555 SLAB_FREELIST_HARDENED & KFENCE
System: Ready
1
๐Ÿ“ฆ Phase 1: ์ •์ƒ SLUB ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น ๋ฐ Freelist ์ˆœํšŒ (Normal Operation)
Baseline Normal
๋ฆฌ๋ˆ…์Šค ์ปค๋„ SLUB ํ• ๋‹น์ž๋Š” ๊ณ ์ • ํฌ๊ธฐ ์บ์‹œ(kmalloc-128 ๋“ฑ) ๋‚ด์˜ ๊ฐ€์šฉ ๊ฐ์ฒด๋“ค์„ ์‹ฑ๊ธ€ ๋งํฌ๋“œ ๋ฆฌ์ŠคํŠธ(Freelist)๋กœ ๊ด€๋ฆฌํ•จ. kmem_cache_cpu->freelist ํฌ์ธํ„ฐ๊ฐ€ ์ฒซ ๋ฒˆ์งธ ๊ฐ€์šฉ ์ฒญํฌ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋ฉฐ, ํ• ๋‹น ์‹œ freepointer๋ฅผ ๋”ฐ๋ผ ์—ฐ์† ์ˆœํšŒํ•จ.
โš™๏ธ SLUB ํ• ๋‹น ๋ฉ”์ปค๋‹ˆ์ฆ˜ (mm/slub.c)
void *object = c->freelist; c->freelist = get_freepointer(s, object); return object; // ์ •์ƒ ์ฒญํฌ ๋ฐ˜ํ™˜
๐Ÿค– ํœด๋จธ๋…ธ์ด๋“œ ๋กœ๋ด‡ ๊ด€์ ˆ ์ œ์–ด ์ƒํƒœ
gait->kp_pitch = 150.0f; // ๊ณต์นญ ๋น„๋ก€ ์ด๋“ gait->kd_pitch = 12.0f; // ๊ณต์นญ ๊ฐ์‡  ๊ณ„์ˆ˜ yaw_rate_limit = 1.2 rad/s (์ •์ƒ ๋ณดํ–‰)
2
๐Ÿ’ฅ Phase 2: ํž™ ๋ฒ„ํผ ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ & ํ‰๋ฌธ Freelist ์˜ค์—ผ ๊ณต๊ฒฉ (Attack Detonation)
Vulnerable (SLAB_HARDENED=n)
CONFIG_SLAB_FREELIST_HARDENED=n ํ™˜๊ฒฝ์—์„œ freepointer๋Š” ํ‰๋ฌธ ์ฃผ์†Œ๋กœ ๋…ธ์ถœ๋จ. ๊ณต๊ฒฉ์ž๋Š” fs_context ๋ฒ„ํผ ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ(CVE-2022-0185) ๋˜๋Š” Netfilter ํž™ ์˜ค์—ผ(CVE-2021-22555)์„ ์œ ๋ฐœํ•˜์—ฌ ์ธ์ ‘ ๋ฏธํ• ๋‹น ์Šฌ๋กฏ์˜ freepointer๋ฅผ ์ž„์˜ ์ปค๋„ ๊ตฌ์กฐ์ฒด ์ฃผ์†Œ๋กœ ๋ฎ์–ด์”€. ์ฐจ๊ธฐ kmalloc ํ˜ธ์ถœ ์‹œ ํ• ๋‹น์ž๊ฐ€ ํ•ด๋‹น ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๊ณต๊ฒฉ์ž์—๊ฒŒ ๊ทธ๋Œ€๋กœ ํ• ๋‹นํ•จ!
โš ๏ธ Freelist Poisoning Exploit
// 8๋ฐ”์ดํŠธ OOB ์“ฐ๊ธฐ๋กœ Slot 1 freepointer ๋ณ€์กฐ cache->objects[1].freelist_ptr = &victim_gait; // ์ฐจ๊ธฐ kmalloc() ํ˜ธ์ถœ -> victim_gait ํ• ๋‹น ๋ฐ˜ํ™˜! void *hacked = kmalloc(128, GFP_KERNEL);
๐Ÿ”ด ์‚ฌ์ด๋ฒ„-๋ฌผ๋ฆฌ ํŒŒ๊ดด ์ „์ด: ๊ด€์ ˆ ๊ณต์ง„ ๋ฐœ์‚ฐ
hacked->kp_pitch = 9500.0f; // ์ œ์–ด ์ด๋“ ํญ์ฃผ! hacked->kd_pitch = 0.0f; // ๊ฐ์‡  ์ œ๋กœ (๊ณต์ง„) yaw_oscillation = 32.5 rad/s -> ๊ธ‰๊ฒฉํ•œ ์ „๋„ ํŒŒ๊ดด
3
๐Ÿ›ก๏ธ Phase 3: SLAB Freelist Hardening XOR ์ฟ ํ‚ค ๊ฒ€์ฆ & KFENCE ํŠธ๋žฉ (Hardened Defense)
Hardened (CONFIG_SLAB_FREELIST_HARDENED=y)
CONFIG_SLAB_FREELIST_HARDENED=y ์„ค์ • ์‹œ ์ปค๋„์€ freepointer๋ฅผ ptr ^ s->random ^ swab64(slot_addr) ์—ฐ์‚ฐ์œผ๋กœ ์ƒ์‹œ ๋‚œ๋…ํ™”ํ•จ. ๊ณต๊ฒฉ์ž๊ฐ€ ํ‰๋ฌธ ์ฃผ์†Œ๋ฅผ ๋ฎ์–ด์“ฐ๋”๋ผ๋„ ๋ณตํ˜ธํ™” ๊ณผ์ •์—์„œ ๊ณ ์ฐจ ์—”ํŠธ๋กœํ”ผ ์“ฐ๋ ˆ๊ธฐ ์ฃผ์†Œ(0x756acb91f00cb3ce)๊ฐ€ ์‚ฐ์ถœ๋˜๋ฉฐ, ์บ๋…ธ๋‹ˆ์ปฌ ์ฃผ์†Œ ๋ฐ ์ •๋ ฌ ๊ฒ€์ฆ์—์„œ ์ฆ‰๊ฐ ๊ฐ์ง€๋˜์–ด kmem_cache_alloc ํŠธ๋žฉ(Oops/Panic)์„ ๊ฒฉ๋ฐœํ•จ!
๐Ÿ” Freepointer ์•”ํ˜ธํ™”/๋ณตํ˜ธํ™” ๊ณต์‹
static inline freelist_ptr_t freelist_ptr_encode(...) { return ptr ^ s->random ^ swab64(ptr_addr); } // ํ‰๋ฌธ ์ฃผ์ž… ์‹œ -> ์“ฐ๋ ˆ๊ธฐ ์ฃผ์†Œ๋กœ ๋ถ•๊ดด -> Panic ํŠธ๋žฉ!
๐Ÿ›‘ KFENCE (Kernel Electric-Fence) ๊ฐ€๋“œ ํŽ˜์ด์ง€
[Guard Page (PROT_NONE)] [Sampled Object] [Guard Page] // ์ธ์ ‘ ์Šฌ๋กฏ OOB ์นจ๋ฒ” ์ฆ‰์‹œ ํ•˜๋“œ์›จ์–ด #PF ์˜ˆ์™ธ ํŠธ๋žฉ! // ์ปค๋„ ํž™ ์†์ƒ 0%, ๊ณต๊ฒฉ ์‹œ๋„ ์ฆ‰๊ฐ ๋™๊ฒฐ
4
๐Ÿ›‘ Phase 4: ์‚ฌ์ด๋ฒ„-๋ฌผ๋ฆฌ ํŽ˜์ผ์„ธ์ดํ”„ E-Stop ๋ฐ ๊ด€์ ˆ ๋ฝ (Deterministic Safe State)
Safe State
์ปค๋„ ์Šฌ๋žฉ ๋ฌด๊ฒฐ์„ฑ ํŠธ๋žฉ ๋˜๋Š” KFENCE #PF ์ธํ„ฐ๋ŸฝํŠธ ๋ฐœ์ƒ ์‹œ, ํ•˜๋“œ์›จ์–ด Safety Watchdog ๋ฆด๋ ˆ์ด๊ฐ€ ๊ฐœ์ž…ํ•˜์—ฌ 48V ์„œ๋ณด ๋ชจํ„ฐ ์ „์› ๋ฒ„์Šค๋ฅผ 0.0V๋กœ ์ฆ‰๊ฐ ์ฐจ๋‹จํ•จ. ์Šคํ”„๋ง ๋ณต๊ท€ํ˜• ์ „์ž ํŒŒํ‚น ๋ธŒ๋ ˆ์ดํฌ๊ฐ€ 5ms ์ด๋‚ด ๋กœ๋ด‡ 12๊ฐœ ๊ด€์ ˆ์„ ๊ธฐ๊ณ„์ ์œผ๋กœ ๊ณ ์ •ํ•˜์—ฌ ์ „๋„ ๋ฐ ๋ฌผ๋ฆฌ ์ถฉ๋Œ ํ”ผํ•ด๋ฅผ 0 J๋กœ ์™„๋ฒฝ ์ฐจ๋‹จํ•จ.
โšก ํ•˜๋“œ์›จ์–ด ์ „์› ๋ฒ„์Šค ์ฐจ๋‹จ (Depower)
Watchdog ISR Triggered (< 100 ฮผs) Safety Relay Coil -> De-energized Motor Bus Voltage: 48.0V -> 0.0V (Depowered)
๐Ÿ”’ ๊ด€์ ˆ ํŒŒํ‚น ๋ธŒ๋ ˆ์ดํฌ ์ฒด๊ฒฐ (Joint Lock)
12x Actuator Clamps: Mechanical Snap (< 5 ms) Kinetic Energy Dissipation: Zero Impact System State: Deterministic Safe Halt
๐Ÿงฎ Freelist Obfuscation ์ˆ˜ํ•™์  ์›๋ฆฌ
ptr ^ s->random ^ swab(ptr_addr) ์—ฐ์‚ฐ์€ ์บ์‹œ๋ณ„ ๋ฌด์ž‘์œ„ 64๋น„ํŠธ ์‹œํฌ๋ฆฟ(s->random)๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๊ฐ์ฒด ์ž์‹ ์˜ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ(swab)๋ฅผ ์•”ํ˜ธ ํ‚ค๋กœ ํ•จ๊ป˜ ๊ฒฐํ•ฉํ•จ. ๋”ฐ๋ผ์„œ ๋™์ผํ•œ ๊ฐ์ฒด ์ฃผ์†Œ๋ผ๋„ ๋‹ค๋ฅธ ์Šฌ๋žฉ ์Šฌ๋กฏ์œผ๋กœ ๋ณต์‚ฌ๋˜๊ฑฐ๋‚˜ ์žฌ์‚ฌ์šฉ๋  ์ˆ˜ ์—†์Œ.
๐Ÿงฑ KFENCE vs KASAN ์˜ค๋ฒ„ํ—ค๋“œ ๋น„๊ต
KASAN์€ ๋ชจ๋“  8๋ฐ”์ดํŠธ ๋ฉ”๋ชจ๋ฆฌ๋งˆ๋‹ค 1๋ฐ”์ดํŠธ ์„€๋„ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ• ๋‹นํ•˜์—ฌ CPU 2~3๋ฐฐ, RAM 1.5๋ฐฐ์˜ ๋ง‰๋Œ€ํ•œ ์˜ค๋ฒ„ํ—ค๋“œ๋ฅผ ์œ ๋ฐœํ•จ. ๋ฐ˜๋ฉด KFENCE๋Š” ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์„ ์œ„ํ•ด ์ƒ˜ํ”Œ๋ง ๊ธฐ๋ฐ˜(์ˆ˜ ์ดˆ์— 1ํšŒ)์œผ๋กœ ๊ฐ€๋“œ ํŽ˜์ด์ง€ ๊ฐ์ฒด๋ฅผ ํ• ๋‹นํ•˜์—ฌ ์„ฑ๋Šฅ ์ €ํ•˜ 1% ๋ฏธ๋งŒ์œผ๋กœ ํž™ OOB/UAF๋ฅผ ํฌํšํ•จ.
๐ŸŽฒ CONFIG_SLAB_FREELIST_RANDOM
์Šฌ๋žฉ ํŽ˜์ด์ง€๊ฐ€ ์ฒ˜์Œ ํ• ๋‹น๋  ๋•Œ ์„ ํ˜•์ ์ธ ์˜ค๋ฆ„์ฐจ์ˆœ(Slot 0->1->2->3)์œผ๋กœ freelist๋ฅผ ๊ตฌ์ถ•ํ•˜์ง€ ์•Š๊ณ , Fisher-Yates ์…”ํ”Œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ ๋ฌด์ž‘์œ„ ๋ฐฐ์น˜ํ•จ. ๊ณต๊ฒฉ์ž๊ฐ€ ์ธ์ ‘ ๊ฐ์ฒด์˜ ๋ฌผ๋ฆฌ์ /๊ฐ€์ƒ ์˜คํ”„์…‹์„ ์‚ฌ์ „์— ์˜ˆ์ธก(Heap Grooming/Feng-shui)ํ•˜๋Š” ๊ฒƒ์„ ๋ฌด๋ ฅํ™”ํ•จ.
๐Ÿ›ก๏ธ Defense-in-Depth ์Šฌ๋žฉ ๋ฐฉ์–ด ๊ณ„์ธต
1๋‹จ๊ณ„ SLAB_FREELIST_HARDENED(XOR ๊ฒ€์ฆ) + 2๋‹จ๊ณ„ SLAB_FREELIST_RANDOM(๋ฐฐ์น˜ ๋‚œ์ˆ˜ํ™”) + 3๋‹จ๊ณ„ KFENCE(ํ”„๋กœ๋•์…˜ ๊ฐ€๋“œ ํŽ˜์ด์ง€ ํƒ์ง€) + 4๋‹จ๊ณ„ HARDENED_USERCOPY(๊ฒฝ๊ณ„ ๊ฒ€์ฆ)์˜ ๋‹ค์ธต ๋ฐฉ์–ด๋กœ ์ปค๋„ ํž™ ์ต์Šคํ”Œ๋กœ์ž‡ ์ฒด์ธ์„ ์›์ฒœ ์ฐจ๋‹จํ•จ.