Checkpoint๋Š” ์ทจ์•ฝ์  ์•…์šฉ์„ ๋”์šฑ ์–ด๋ ต๊ฒŒ ๋งŒ๋“œ๋Š” Safe-Linking ๋ณดํ˜ธ ๊ธฐ์ˆ ์„ ์ œ์•ˆํ–ˆ์Šต๋‹ˆ๋‹ค.

์ฒดํฌํฌ์ธํŠธ ์ปดํผ๋‹ˆ ์ œ์‹œ malloc ํ˜ธ์ถœ์„ ์‹คํ–‰ํ•  ๋•Œ ํ• ๋‹น๋œ ๋ฒ„ํผ์— ๋Œ€ํ•œ ํฌ์ธํ„ฐ์˜ ์ •์˜ ๋˜๋Š” ์ˆ˜์ •์„ ์กฐ์ž‘ํ•˜๋Š” ๊ณต๊ฒฉ์„ ์ƒ์„ฑํ•˜๊ธฐ ์–ด๋ ต๊ฒŒ ๋งŒ๋“œ๋Š” ์•ˆ์ „ ์—ฐ๊ฒฐ ๋ณดํ˜ธ ๋ฉ”์ปค๋‹ˆ์ฆ˜์ž…๋‹ˆ๋‹ค. ์•ˆ์ „ ์—ฐ๊ฒฐ์€ ์ทจ์•ฝ์  ์•…์šฉ ๊ฐ€๋Šฅ์„ฑ์„ ์™„์ „ํžˆ ์ฐจ๋‹จํ•˜์ง€๋Š” ์•Š์ง€๋งŒ ์ตœ์†Œํ•œ์˜ ์˜ค๋ฒ„ํ—ค๋“œ๋กœ ํŠน์ • ๋ฒ”์ฃผ์˜ ์•…์šฉ ์ƒ์„ฑ์„ ์ƒ๋‹นํžˆ ๋ณต์žกํ•˜๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ๋ฉ”๋ชจ๋ฆฌ์˜ ํž™ ๋ฐฐ์น˜.

์•ˆ์ „ ์—ฐ๊ฒฐ์„ ๊ตฌํ˜„ํ•˜๋Š” ํŒจ์น˜๋Š” Glibc(ptmalloc), uClibc-NG(dlmalloc), gperftools(tcmalloc) ๋ฐ Google TCMalloc์— โ€‹โ€‹๋Œ€ํ•ด ์ค€๋น„๋˜์—ˆ์œผ๋ฉฐ Chromium(
2012๋…„๋ถ€ํ„ฐ Chromium์€ ๋™์ผํ•œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์ด๋ฏธ MaskPtr ๋ณดํ˜ธ ๊ธฐ์ˆ ์„ ๋‚ด์žฅํ–ˆ์ง€๋งŒ Checkpoint์˜ ์†”๋ฃจ์…˜์€ ๋” ๋†’์€ ์„ฑ๋Šฅ์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.
์ œ์•ˆ๋œ ํŒจ์น˜๋Š” ์ด๋ฏธ 8์›” ๋ฆด๋ฆฌ์Šค์—์„œ ์ œ๊ณต๋˜๋„๋ก ์Šน์ธ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. Glibc 3.32 ์•ˆ์ „ ์—ฐ๊ฒฐ์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ํ™œ์„ฑํ™”๋ฉ๋‹ˆ๋‹ค. uClibc-NG๋Š” ์•ˆ์ „ ์—ฐ๊ฒฐ์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. ์ž…๋ ฅ ๋ฆด๋ฆฌ์Šค 1.0.33์— ํฌํ•จ๋˜์–ด ์žˆ์œผ๋ฉฐ ๊ธฐ๋ณธ์ ์œผ๋กœ ํ™œ์„ฑํ™”๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. gperftools์˜ ๋ณ€๊ฒฝ ์‚ฌํ•ญ(์ด์ „ tcmalloc) ํ—ˆ์šฉ์ด์ง€๋งŒ ํ–ฅํ›„ ๋ฆด๋ฆฌ์Šค์—์„œ๋Š” ์˜ต์…˜์œผ๋กœ ์ œ๊ณต๋  ์˜ˆ์ •์ž…๋‹ˆ๋‹ค.

๊ฐœ๋ฐœ์ž TCMalloc (์ƒˆ๋กœ์šด tcmalloc) ์ˆ˜๋ฝ์„ ๊ฑฐ๋ถ€ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ณ€ํ™”, ์‹ฌ๊ฐํ•œ ์„ฑ๋Šฅ ์ €ํ•˜์™€ ๋ชจ๋“  ๊ฒƒ์ด ์˜ˆ์ƒ๋Œ€๋กœ ์ž‘๋™ํ•˜๋Š”์ง€ ์ •๊ธฐ์ ์œผ๋กœ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ๊ด‘๋ฒ”์œ„ํ•œ ํ…Œ์ŠคํŠธ๋ฅผ ์ถ”๊ฐ€ํ•ด์•ผ ํ•œ๋‹ค๋Š” ์ ์„ ์–ธ๊ธ‰ํ–ˆ์Šต๋‹ˆ๋‹ค. Checkpoint ์—”์ง€๋‹ˆ์–ด์˜ ํ…Œ์ŠคํŠธ์— ๋”ฐ๋ฅด๋ฉด Safe-Linking ๋ฐฉ๋ฒ•์€ ์ถ”๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ ์†Œ๋น„๋กœ ์ด์–ด์ง€์ง€ ์•Š์œผ๋ฉฐ ํž™ ์ž‘์—… ์ˆ˜ํ–‰ ์‹œ ์„ฑ๋Šฅ์€ ํ‰๊ท  0.02%, ์ตœ์•…์˜ ๊ฒฝ์šฐ 1.5% ๊ฐ์†Œํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๋‚˜ํƒ€๋‚ฌ์Šต๋‹ˆ๋‹ค. Chromium์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์€ "2% ๋ฏธ๋งŒ"์œผ๋กœ ์ถ”์ •๋ฉ๋‹ˆ๋‹ค.) ํฌํ•จ
์•ˆ์ „ ์—ฐ๊ฒฐ์„ ์‚ฌ์šฉํ•˜๋ฉด free()๊ฐ€ ํ˜ธ์ถœ๋  ๋•Œ๋งˆ๋‹ค 2~3๊ฐœ์˜ ์ถ”๊ฐ€ ์–ด์…ˆ๋ธ”๋ฆฌ ๋ช…๋ น์–ด๊ฐ€ ์‹คํ–‰๋˜๊ณ , malloc()์ด ํ˜ธ์ถœ๋  ๋•Œ๋งˆ๋‹ค 3~4๊ฐœ์˜ ๋ช…๋ น์–ด๊ฐ€ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. ์ดˆ๊ธฐํ™” ๋ฐ ์ž„์˜ ๊ฐ’ ์ƒ์„ฑ ๋‹จ๊ณ„๋ฅผ ์‹คํ–‰ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

Checkpoint๋Š” ์ทจ์•ฝ์  ์•…์šฉ์„ ๋”์šฑ ์–ด๋ ต๊ฒŒ ๋งŒ๋“œ๋Š” Safe-Linking ๋ณดํ˜ธ ๊ธฐ์ˆ ์„ ์ œ์•ˆํ–ˆ์Šต๋‹ˆ๋‹ค.

์•ˆ์ „ ์—ฐ๊ฒฐ์€ ๋‹ค์–‘ํ•œ ํž™ ๊ตฌํ˜„์˜ ๋ณด์•ˆ์„ ํ–ฅ์ƒ์‹œํ‚ฌ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋ฒ„ํผ ์ž์ฒด ์˜†์— ์žˆ๋Š” ๋‹จ์ผ ์—ฐ๊ฒฐ ํฌ์ธํ„ฐ ๋ชฉ๋ก์„ ์‚ฌ์šฉํ•˜๋Š” ๋ชจ๋“  ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ์— ๋ฌด๊ฒฐ์„ฑ ์ œ์–ด๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๋ฐ์—๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ฐฉ๋ฒ•์€ ๊ตฌํ˜„์ด ๋งค์šฐ ๊ฐ„๋‹จํ•˜๋ฉฐ ํ•˜๋‚˜์˜ ๋งคํฌ๋กœ๋งŒ ์ถ”๊ฐ€ํ•˜๊ณ  ์ด๋ฅผ ์ฝ”๋“œ์˜ ๋‹ค์Œ ๋ธ”๋ก์— ๋Œ€ํ•œ ํฌ์ธํ„ฐ์— ์ ์šฉํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค(์˜ˆ: Glibc์˜ ๊ฒฝ์šฐ). ๋ณ€ํ™” ์ฝ”๋“œ ๋ช‡ ์ค„๋งŒ ์žˆ์œผ๋ฉด ๋ฉ๋‹ˆ๋‹ค). ์ด ๋ฐฉ๋ฒ•์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์œผ๋กœ ์š”์•ฝ๋ฉ๋‹ˆ๋‹ค.

+#PROTECT_PTR ์ •์˜(pos, ptr) \
+ ((__typeof (ptr)) ((((size_t) pos) >> 12) ^ ((size_t) ptr)))

+#define REVEAL_PTR(ptr) PROTECT_PTR(&ptr, ptr)

- nextp = p->fd;
+ nextp = REVEAL_PTR (p->fd);
...

์ด ๋ฐฉ๋ฒ•์˜ ํ•ต์‹ฌ์€ ASLR ์ฃผ์†Œ ๋ฌด์ž‘์œ„ํ™” ๋ฉ”์ปค๋‹ˆ์ฆ˜(mmap_base)์˜ ๋ฌด์ž‘์œ„ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Fast-Bins ๋ฐ TCache์™€ ๊ฐ™์€ ๋‹จ์ผ ์—ฐ๊ฒฐ ๋ชฉ๋ก์„ ๋ณดํ˜ธํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ฐ’์ด ๋ชฉ๋ก์˜ ๋‹ค์Œ ์š”์†Œ์— ๋Œ€ํ•œ ํฌ์ธํ„ฐ์— ์ ์šฉ๋˜๊ธฐ ์ „์— ๋งˆ์Šคํฌ ๋ณ€ํ™˜์„ ์ˆ˜ํ–‰ํ•˜๊ณ  ํŽ˜์ด์ง€ ์ •๋ ฌ์„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ํฌ์ธํ„ฐ๋Š” "(L >> PAGE_SHIFT) XOR (P)" ์—ฐ์‚ฐ์˜ ๊ฒฐ๊ณผ๋กœ ๋Œ€์ฒด๋ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ P๋Š” ํฌ์ธํ„ฐ์˜ ๊ฐ’์ด๊ณ  L์€ ํฌ์ธํ„ฐ๊ฐ€ ์ €์žฅ๋œ ๋ฉ”๋ชจ๋ฆฌ ์œ„์น˜์ž…๋‹ˆ๋‹ค.

Checkpoint๋Š” ์ทจ์•ฝ์  ์•…์šฉ์„ ๋”์šฑ ์–ด๋ ต๊ฒŒ ๋งŒ๋“œ๋Š” Safe-Linking ๋ณดํ˜ธ ๊ธฐ์ˆ ์„ ์ œ์•ˆํ–ˆ์Šต๋‹ˆ๋‹ค.

์‹œ์Šคํ…œ์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ASLR (Address Space Layout Randomization) ํž™ ๊ธฐ๋ณธ ์ฃผ์†Œ๊ฐ€ ์žˆ๋Š” L ๋น„ํŠธ์˜ ์ผ๋ถ€์—๋Š” P๋ฅผ ์ธ์ฝ”๋”ฉํ•˜๋Š” ํ‚ค๋กœ ์‚ฌ์šฉ๋˜๋Š” ๋žœ๋ค ๊ฐ’์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค(12๋ฐ”์ดํŠธ ํŽ˜์ด์ง€์— ๋Œ€ํ•ด 4096๋น„ํŠธ ์‹œํ”„ํŠธ ์—ฐ์‚ฐ์œผ๋กœ ์ถ”์ถœ). ํฌ์ธํ„ฐ๊ฐ€ ์›๋ž˜ ํ˜•์‹์œผ๋กœ ์ €์žฅ๋˜์ง€ ์•Š๊ณ  ํฌ์ธํ„ฐ๋ฅผ ๊ต์ฒดํ•˜๋ ค๋ฉด ํž™ ํ• ๋‹น์— ๋Œ€ํ•œ ์ง€์‹์ด ํ•„์š”ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ด๋Ÿฌํ•œ ์กฐ์ž‘์„ ํ†ตํ•ด ์ต์Šคํ”Œ๋กœ์ž‡์—์„œ ํฌ์ธํ„ฐ ํ•˜์ด์žฌํ‚น์˜ ์œ„ํ—˜์ด ์ค„์–ด๋“ญ๋‹ˆ๋‹ค. ๋˜ํ•œ ํŒจ์น˜ ์ฝ”๋“œ์—๋Š” ๊ณต๊ฒฉ์ž๊ฐ€ ํฌ์ธํ„ฐ๋ฅผ ์ •๋ ฌ๋˜์ง€ ์•Š์€ ๊ฐ’์œผ๋กœ ๊ต์ฒดํ•˜๋Š” ๊ฒƒ์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š๋Š” ๋ธ”๋ก ์ •๋ ฌ์— ๋Œ€ํ•œ ์ถ”๊ฐ€ ๊ฒ€์‚ฌ๋„ ํฌํ•จ๋˜์–ด ์žˆ์œผ๋ฉฐ ์ •๋ ฌ๋œ ๋น„ํŠธ ์ˆ˜์— ๋Œ€ํ•œ ์ง€์‹์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” 64๋น„ํŠธ ์‹œ์Šคํ…œ์—์„œ ์ถ”๊ฐ€๋กœ ์ฐจ๋‹จ์„ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค. 15๋ฒˆ ์ค‘ 16๋ฒˆ์€ ์ •๋ ฌ์„ ๊ณ ๋ คํ•˜์ง€ ์•Š์€ ๊ณต๊ฒฉ ์‹œ๋„์ž…๋‹ˆ๋‹ค.

์ด ๋ฐฉ๋ฒ•์€ ๋ถ€๋ถ„ ํฌ์ธํ„ฐ ๋‹ค์‹œ ์“ฐ๊ธฐ(๋‚ฎ์€ ๋ฐ”์ดํŠธ ๋ณ€๊ฒฝ), ์ „์ฒด ํฌ์ธํ„ฐ ๋‹ค์‹œ ์“ฐ๊ธฐ(๊ณต๊ฒฉ์ž์˜ ์ฝ”๋“œ๋กœ ๋ฆฌ๋””๋ ‰์…˜) ๋ฐ ์ •๋ ฌ๋˜์ง€ ์•Š์€ ์ฃผ์†Œ์—์„œ ๋ชฉ๋ก ์œ„์น˜ ๋ณ€๊ฒฝ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ณต๊ฒฉ์œผ๋กœ๋ถ€ํ„ฐ ๋ณดํ˜ธํ•˜๋Š” ๋ฐ ํšจ๊ณผ์ ์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, malloc์—์„œ Safe-Linking์„ ์‚ฌ์šฉํ•˜๋ฉด ์ตœ๊ทผ ์•…์šฉ์„ ์ฐจ๋‹จํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์œผ๋กœ ๋‚˜ํƒ€๋‚ฌ์Šต๋‹ˆ๋‹ค. ํ™•์ธ๋จ ๋™์ผํ•œ ์ทจ์•ฝ์  ์—ฐ๊ตฌ์›์— ์˜ํ•ด CVE-2020-6007 Philips Hue Bridge ์Šค๋งˆํŠธ ์กฐ๋ช…์—์„œ๋Š” ๋ฒ„ํผ ์˜ค๋ฒ„ํ”Œ๋กœ๋กœ ์ธํ•ด ์žฅ์น˜๋ฅผ ์ œ์–ดํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

์ถœ์ฒ˜ : opennet.ru

์ฝ”๋ฉ˜ํŠธ๋ฅผ ์ถ”๊ฐ€