Linux ์ปค๋„์„ ๋ณดํ˜ธํ•˜๊ธฐ ์œ„ํ•ด Huawei ์ง์›์ด ์ œ์•ˆํ•œ ํŒจ์น˜์˜ ๋ณด์•ˆ ๋ฌธ์ œ

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

HKSP ํŒจ์น˜๋Š” Huawei ์ง์›์ด ๊ฒŒ์‹œํ–ˆ์œผ๋ฉฐ GitHub ํ”„๋กœํ•„์— Huawei์— ๋Œ€ํ•œ ์–ธ๊ธ‰์ด ํฌํ•จ๋˜์–ด ์žˆ์œผ๋ฉฐ ํ”„๋กœ์ ํŠธ ์ด๋ฆ„(HKSP - Huawei Kernel Self Protection)์— Huawei๋ผ๋Š” ๋‹จ์–ด๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋™์‹œ์— ํ™”์›จ์ด ๋Œ€๋ณ€์ธ์€ HKSP ํ”„๋กœ์ ํŠธ์™€ ํšŒ์‚ฌ์˜ ์—ฐ๊ด€์„ฑ์„ ๋ถ€์ธํ•˜๊ณ  ํ•ด๋‹น ์ฝ”๋“œ๋Š” ์ง์›์˜ ๊ฐœ์ธ ์ฃผ๋„๋กœ ๊ฐœ๋ฐœ๋˜์—ˆ์œผ๋ฉฐ ๊ณต์‹ ํ™”์›จ์ด ํ”„๋กœ์ ํŠธ๊ฐ€ ์•„๋‹ˆ๋ฉฐ ํšŒ์‚ฌ ์ œํ’ˆ์— ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š”๋‹ค๊ณ  ๋ฐํ˜”์Šต๋‹ˆ๋‹ค. ~์— GitHub ํŽ˜์ด์ง€ HKSP๋ฅผ ์†Œ๊ธ‰ํ•˜์—ฌ ๋ฐœ๊ฒฌ ํ›„ ์ทจ์•ฝ์ ๋„ ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค ์ด ํ”„๋กœ์ ํŠธ๋Š” ์—ฌ๊ฐ€ ์‹œ๊ฐ„์— ์—ฐ๊ตฌ ๋ชฉ์ ์œผ๋กœ ๊ฐœ๋ฐœ๋˜๊ณ  ์žˆ๋‹ค๋Š” ์ ์— ์œ ์˜ํ•˜์„ธ์š”.

HKSP์—๋Š” cred ๊ตฌ์กฐ์˜ ์˜คํ”„์…‹ ๋ฌด์ž‘์œ„ํ™”, ์‚ฌ์šฉ์ž ์‹๋ณ„์ž ๋„ค์ž„์ŠคํŽ˜์ด์Šค(pid ๋„ค์ž„์ŠคํŽ˜์ด์Šค)์— ๋Œ€ํ•œ ๊ณต๊ฒฉ ๋ฐฉ์ง€, mmap ์˜์—ญ์—์„œ ํ”„๋กœ์„ธ์Šค ์Šคํƒ ๋ถ„๋ฆฌ, kfree ํ•จ์ˆ˜์— ๋Œ€ํ•œ ์ด์ค‘ ํ˜ธ์ถœ ๊ฐ์ง€, ์˜์‚ฌ๋ฅผ ํ†ตํ•œ ๋ˆ„์ถœ ์ฐจ๋‹จ๊ณผ ๊ฐ™์€ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. -FS /proc(/proc/{๋ชจ๋“ˆ, ํ‚ค, ํ‚ค-์‚ฌ์šฉ์ž}, /proc/sys/kernel/* ๋ฐ /proc/sys/vm/mmap_min_addr, /proc/kallsyms), ํ–ฅ์ƒ๋œ ์‚ฌ์šฉ์ž ๊ณต๊ฐ„ ์ฃผ์†Œ ๋ฌด์ž‘์œ„ํ™”, ์ถ”๊ฐ€ Ptrace ๋ณดํ˜ธ, ํ–ฅ์ƒ๋œ smap ๋ฐ smep ๋ณดํ˜ธ, ์›์‹œ ์†Œ์ผ“์„ ํ†ตํ•œ ๋ฐ์ดํ„ฐ ์ „์†ก ๊ธˆ์ง€, UDP ์†Œ์ผ“์˜ ์ž˜๋ชป๋œ ์ฃผ์†Œ ์ฐจ๋‹จ ๋ฐ ์‹คํ–‰ ์ค‘์ธ ํ”„๋กœ์„ธ์Šค์˜ ๋ฌด๊ฒฐ์„ฑ ํ™•์ธ ๊ธฐ๋Šฅ. ๋˜ํ•œ ์ผ๋ฐ˜์ ์ธ ๋ฃจํŠธํ‚ท์„ ๋„์ž…ํ•˜๋ ค๋Š” ์‹œ๋„๋ฅผ ํƒ์ง€ํ•˜๋Š” ๊ฒƒ์„ ๋ชฉํ‘œ๋กœ ํ•˜๋Š” Ksguard ์ปค๋„ ๋ชจ๋“ˆ๋„ ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

ํŒจ์น˜ ์ผ์œผํ‚จ Linux ์ปค๋„์˜ ์•ˆ์ •์ ์ธ ๋ธŒ๋žœ์น˜๋ฅผ ์œ ์ง€ ๊ด€๋ฆฌํ•˜๋Š” Greg Kroah-Hartman์€ ๊ด€์‹ฌ์„ ๊ฐ–๊ณ  ์ž‘์„ฑ์ž์—๊ฒŒ ๊ฒ€ํ† ๋ฅผ ๋‹จ์ˆœํ™”ํ•˜๊ณ  ๋ฉ”์ธ ์ปค๋„๋กœ ์Šน๊ฒฉ์‹œํ‚ค๊ธฐ ์œ„ํ•ด ๋ชจ๋†€๋ฆฌ์‹ ํŒจ์น˜๋ฅผ ์—ฌ๋Ÿฌ ๋ถ€๋ถ„์œผ๋กœ ๋‚˜๋ˆ„์–ด ๋‹ฌ๋ผ๊ณ  ์š”์ฒญํ–ˆ์Šต๋‹ˆ๋‹ค. ํ‚ค์Šค ์ฟก(์ˆ˜์„) ๊ณ„ํš ์— ํ™๋ณด Linux ์ปค๋„์˜ ๋Šฅ๋™ ๋ณดํ˜ธ ๊ธฐ์ˆ ๋„ ์ ๊ทน์ ์œผ๋กœ ํŒจ์น˜์— ๋Œ€์‘ํ–ˆ๊ณ  ๋ฌธ์ œ ์ค‘์—์„œ x86 ์•„ํ‚คํ…์ฒ˜์— ๋Œ€ํ•œ ๋ฐ”์ธ๋”ฉ๊ณผ ๋ฌธ์ œ์— ๋Œ€ํ•œ ์ •๋ณด๋งŒ ๊ธฐ๋กํ•  ๋ฟ ์ฐจ๋‹จ์„ ์‹œ๋„ํ•˜์ง€ ์•Š๋Š” ๋งŽ์€ ๋ชจ๋“œ์˜ ์•Œ๋ฆผ ํŠน์„ฑ์— ์ฃผ๋ชฉํ–ˆ์Šต๋‹ˆ๋‹ค.

Grsecurity ๊ฐœ๋ฐœ์ž๊ฐ€ ํŒจ์น˜๋ฅผ ์—ฐ๊ตฌํ•œ ๊ฒฐ๊ณผ ์ฝ”๋“œ์— ๋งŽ์€ ์˜ค๋ฅ˜์™€ ์•ฝ์ ์ด ์žˆ์—ˆ์œผ๋ฉฐ ํ”„๋กœ์ ํŠธ์˜ ๊ธฐ๋Šฅ์„ ์ ์ ˆํ•˜๊ฒŒ ํŒ๋‹จํ•  ์ˆ˜ ์žˆ๋Š” ์œ„ํ˜‘ ๋ชจ๋ธ์ด ์—†๋‹ค๋Š” ์‚ฌ์‹ค๋„ ๋‚˜ํƒ€๋‚ฌ์Šต๋‹ˆ๋‹ค. ๋ณด์•ˆ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ์ฝ”๋“œ๊ฐ€ ์ž‘์„ฑ๋˜์—ˆ์Œ์„ ๋ช…ํ™•ํ•˜๊ฒŒ ๋ณด์—ฌ์ฃผ๊ธฐ ์œ„ํ•ด ํ•ธ๋“ค๋Ÿฌ์˜ ์‚ฌ์†Œํ•œ ์ทจ์•ฝ์ ์˜ ์˜ˆ๊ฐ€ ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค.
0777 ๊ถŒํ•œ์œผ๋กœ ์ƒ์„ฑ๋œ /proc/ksguard/state ํŒŒ์ผ์€ ๋ชจ๋“  ์‚ฌ๋žŒ์ด ์“ฐ๊ธฐ ์•ก์„ธ์Šค ๊ถŒํ•œ์„ ๊ฐ–๊ณ  ์žˆ์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. /proc/ksguard/state์— ๊ธฐ๋ก๋œ ๋ช…๋ น์„ ๊ตฌ๋ฌธ ๋ถ„์„ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋Š” ksg_state_write ํ•จ์ˆ˜๋Š” ๋Œ€์ƒ ๋ฒ„ํผ์˜ ํฌ๊ธฐ๋ฅผ ๊ณ ๋ คํ•˜์ง€ ์•Š๊ณ  ์ „๋‹ฌ๋œ ํ”ผ์—ฐ์‚ฐ์ž์˜ ํฌ๊ธฐ์— ๋”ฐ๋ผ ๋ฐ์ดํ„ฐ๊ฐ€ ๊ธฐ๋ก๋˜๋Š” tmp[32] ๋ฒ„ํผ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ๋ฌธ์ž์—ด ํฌ๊ธฐ๋กœ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ์ €๊ฒƒ๋“ค. ์ปค๋„ ์Šคํƒ์˜ ์ผ๋ถ€๋ฅผ ๋ฎ์–ด์“ฐ๋ ค๋ฉด ๊ณต๊ฒฉ์ž๊ฐ€ /proc/ksguard/state์— ํŠน๋ณ„ํžˆ ํ˜•์‹ํ™”๋œ ์ค„์„ ์ž‘์„ฑํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

static ssize_t ksg_state_write(struct file *file, const char __user *buf,
size_t len, loff_t *์˜คํ”„์…‹)
{
u64 ๊ฐ’;
char tmp[32];
size_t n = 0;

if (copy_from_user(tmp, buf, len))
๋ฐ˜ํ™˜ -1;

value = simple_strtoul(tmp, '\0', 10);
...

ํ”„๋กœํ† ํƒ€์ž… ํ™œ์šฉ:

char buf[4096] = { };
int fd = open("/proc/ksguard/state", O_WRONLY);
if (fd >= 0) {
write(fd, buf, sizeof(buf));
๋‹ซ๊ธฐ(fd);
}

์ถœ์ฒ˜ : opennet.ru

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