๋ฆฌ๋
์ค ์ปค๋ 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 (์ ์ ๋ณดํ)
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 -> ๊ธ๊ฒฉํ ์ ๋ ํ๊ดด
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%, ๊ณต๊ฒฉ ์๋ ์ฆ๊ฐ ๋๊ฒฐ
์ปค๋ ์ฌ๋ฉ ๋ฌด๊ฒฐ์ฑ ํธ๋ฉ ๋๋ 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(๊ฒฝ๊ณ ๊ฒ์ฆ)์ ๋ค์ธต ๋ฐฉ์ด๋ก ์ปค๋ ํ ์ต์คํ๋ก์ ์ฒด์ธ์ ์์ฒ ์ฐจ๋จํจ.