๐ฆ 1. ์ฌ๋ฉ ๋ฒํผ ๊ฒฝ๊ณ ๊ฒ์ฆ (__check_heap_object)
`copy_to_user` ํธ์ถ ์ SLUB ๋ฉํ๋ฐ์ดํฐ(`s->usersize`, `s->useroffset`)๋ฅผ ์กฐํํ์ฌ, ์์ฒญ๋ ๋ณต์ฌ ๋ฒ์๊ฐ ๋จ์ผ ํ ๋น ๊ฐ์ฒด์ ๊ฒฝ๊ณ๋ฅผ ๋ฒ์ด๋๋์ง ๊ฒ์ฆํจ. ์ธ์ ๊ฐ์ฒด ์ค๋ฒ๋ฆฌ๋ ๋ฐฉ์ด.
if (offset + n > s->usersize) usercopy_abort();
๐ 2. ์ปค๋ ์คํ ์ฝ๋ ๋ณดํธ (check_kernel_text_object)
์ปค๋์ ์คํ ์ฝ๋ ์์ญ(`[_stext, _etext]`)์์ ์ ์ ๊ณต๊ฐ์ผ๋ก์ ์ง์ ๋ณต์ฌ๋ฅผ ์๊ฒฉ ์ฐจ๋จํจ. ์ปค๋ ํจ์ ๋ฐ์ดํธ์ฝ๋ ๋
ธ์ถ ๋ฐ ROP ๊ฐ์ ฏ ์ฃผ์ ์ ์ถ์ ๋ฐฉ์ดํ์ฌ KASLR ๋ณดํธ.
if (overlaps(ptr, n, _stext, _etext)) BUG();
๐ 3. ์คํ ํ๋ ์ ์ดํ ๋ฐฉ์ด (check_stack_object)
๋ณต์ฌ ์์ค ๋๋ ๋์ ์ฃผ์๊ฐ ํ๋ก์ธ์ค ์ปค๋ ์คํ(`task_stack_page`) ๋ด์ ์์นํ ๋, ํ์ฌ ์คํ ํ๋ ์ ๊ฒฝ๊ณ๋ฅผ ์ด๊ณผํ์ฌ ๋ณต์ฌํ๋ ํ์๋ฅผ ์ฐจ๋จํจ. ์คํ ์๋ฅ ์ ๋ณด ๋
ธ์ถ ๋ฐฉ์ด.
check_stack_object(ptr, n) -> valid_stack