์ฒดํฌํฌ์ธํธ ์ปดํผ๋ ์ ์ 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๊ฐ์ ๋ช
๋ น์ด๊ฐ ์คํ๋ฉ๋๋ค. ์ด๊ธฐํ ๋ฐ ์์ ๊ฐ ์์ฑ ๋จ๊ณ๋ฅผ ์คํํ ํ์๊ฐ ์์ต๋๋ค.
์์ ์ฐ๊ฒฐ์ ๋ค์ํ ํ ๊ตฌํ์ ๋ณด์์ ํฅ์์ํฌ ๋ฟ๋ง ์๋๋ผ ๋ฒํผ ์์ฒด ์์ ์๋ ๋จ์ผ ์ฐ๊ฒฐ ํฌ์ธํฐ ๋ชฉ๋ก์ ์ฌ์ฉํ๋ ๋ชจ๋ ๋ฐ์ดํฐ ๊ตฌ์กฐ์ ๋ฌด๊ฒฐ์ฑ ์ ์ด๋ฅผ ์ถ๊ฐํ๋ ๋ฐ์๋ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ด ๋ฐฉ๋ฒ์ ๊ตฌํ์ด ๋งค์ฐ ๊ฐ๋จํ๋ฉฐ ํ๋์ ๋งคํฌ๋ก๋ง ์ถ๊ฐํ๊ณ ์ด๋ฅผ ์ฝ๋์ ๋ค์ ๋ธ๋ก์ ๋ํ ํฌ์ธํฐ์ ์ ์ฉํ๋ฉด ๋ฉ๋๋ค(์: 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์ ํฌ์ธํฐ๊ฐ ์ ์ฅ๋ ๋ฉ๋ชจ๋ฆฌ ์์น์
๋๋ค.
์์คํ
์์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ASLR (Address Space Layout Randomization) ํ ๊ธฐ๋ณธ ์ฃผ์๊ฐ ์๋ L ๋นํธ์ ์ผ๋ถ์๋ P๋ฅผ ์ธ์ฝ๋ฉํ๋ ํค๋ก ์ฌ์ฉ๋๋ ๋๋ค ๊ฐ์ด ํฌํจ๋ฉ๋๋ค(12๋ฐ์ดํธ ํ์ด์ง์ ๋ํด 4096๋นํธ ์ํํธ ์ฐ์ฐ์ผ๋ก ์ถ์ถ). ํฌ์ธํฐ๊ฐ ์๋ ํ์์ผ๋ก ์ ์ฅ๋์ง ์๊ณ ํฌ์ธํฐ๋ฅผ ๊ต์ฒดํ๋ ค๋ฉด ํ ํ ๋น์ ๋ํ ์ง์์ด ํ์ํ๊ธฐ ๋๋ฌธ์ ์ด๋ฌํ ์กฐ์์ ํตํด ์ต์คํ๋ก์์์ ํฌ์ธํฐ ํ์ด์ฌํน์ ์ํ์ด ์ค์ด๋ญ๋๋ค. ๋ํ ํจ์น ์ฝ๋์๋ ๊ณต๊ฒฉ์๊ฐ ํฌ์ธํฐ๋ฅผ ์ ๋ ฌ๋์ง ์์ ๊ฐ์ผ๋ก ๊ต์ฒดํ๋ ๊ฒ์ ํ์ฉํ์ง ์๋ ๋ธ๋ก ์ ๋ ฌ์ ๋ํ ์ถ๊ฐ ๊ฒ์ฌ๋ ํฌํจ๋์ด ์์ผ๋ฉฐ ์ ๋ ฌ๋ ๋นํธ ์์ ๋ํ ์ง์์ด ํ์ํฉ๋๋ค. ์ด๋ 64๋นํธ ์์คํ
์์ ์ถ๊ฐ๋ก ์ฐจ๋จ์ ํ์ฉํฉ๋๋ค. 15๋ฒ ์ค 16๋ฒ์ ์ ๋ ฌ์ ๊ณ ๋ คํ์ง ์์ ๊ณต๊ฒฉ ์๋์
๋๋ค.
์ด ๋ฐฉ๋ฒ์ ๋ถ๋ถ ํฌ์ธํฐ ๋ค์ ์ฐ๊ธฐ(๋ฎ์ ๋ฐ์ดํธ ๋ณ๊ฒฝ), ์ ์ฒด ํฌ์ธํฐ ๋ค์ ์ฐ๊ธฐ(๊ณต๊ฒฉ์์ ์ฝ๋๋ก ๋ฆฌ๋๋ ์
) ๋ฐ ์ ๋ ฌ๋์ง ์์ ์ฃผ์์์ ๋ชฉ๋ก ์์น ๋ณ๊ฒฝ์ ์ฌ์ฉํ๋ ๊ณต๊ฒฉ์ผ๋ก๋ถํฐ ๋ณดํธํ๋ ๋ฐ ํจ๊ณผ์ ์
๋๋ค. ์๋ฅผ ๋ค์ด, malloc์์ Safe-Linking์ ์ฌ์ฉํ๋ฉด ์ต๊ทผ ์
์ฉ์ ์ฐจ๋จํ ์ ์๋ ๊ฒ์ผ๋ก ๋ํ๋ฌ์ต๋๋ค. ํ์ธ๋จ ๋์ผํ ์ทจ์ฝ์ ์ฐ๊ตฌ์์ ์ํด CVE-2020-6007 Philips Hue Bridge ์ค๋งํธ ์กฐ๋ช
์์๋ ๋ฒํผ ์ค๋ฒํ๋ก๋ก ์ธํด ์ฅ์น๋ฅผ ์ ์ดํ ์ ์๊ฒ ๋ฉ๋๋ค.
์ถ์ฒ : opennet.ru