ื‘ืขื™ื•ืช ืื‘ื˜ื—ื” ื‘ืชื™ืงื•ื ื™ื ืฉื”ื•ืฆืขื• ืขืœ ื™ื“ื™ ืขื•ื‘ื“ Huawei ื›ื“ื™ ืœื”ื’ืŸ ืขืœ ืœื™ื‘ืช ืœื™ื ื•ืงืก

ืžืคืชื—ื™ ืคืจื•ื™ืงื˜ Grsecurity ืฆื™ื™ืจ ืชืฉื•ืžืช ืœื‘ ืœื ื•ื›ื—ื•ืช ืฉืœ ืคื’ื™ืขื•ืช ื˜ืจื™ื•ื•ื™ืืœื™ืช ื”ื ื™ืชื ืช ืœื ื™ืฆื•ืœ ื‘ืขืจื›ืช ื”ืชื™ืงื•ืŸ HKSP (Huawei Kernel Self Protection), ืœืคื ื™ ืžืกืคืจ ื™ืžื™ื ืžื•ึผืฆึธืข ื›ื“ื™ ืœืฉืคืจ ืืช ื”ืื‘ื˜ื—ื” ืฉืœ ืœื™ื‘ืช ืœื™ื ื•ืงืก. ื”ืžืฆื‘ ืžื–ื›ื™ืจ ืžืงืจื” ืขื ืกืžืกื•ื ื’, ืฉื‘ื• ื ื™ืกื™ื•ืŸ ืœืฉืคืจ ืืช ืื‘ื˜ื—ืช ื”ืžืขืจื›ืช ื”ื•ื‘ื™ืœ ืœื”ื•ืคืขืชื” ืฉืœ ืคื’ื™ืขื•ืช ื—ื“ืฉื” ื•ื”ืงืœ ืขืœ ืคื’ื™ืขื” ื‘ืžื›ืฉื™ืจื™ื.

ืชื™ืงื•ื ื™ ื”-HKSP ืคื•ืจืกืžื• ืขืœ ื™ื“ื™ ืขื•ื‘ื“ Huawei, ื›ื•ืœืœื™ื ืื–ื›ื•ืจ ืฉืœ Huawei ื‘ืคืจื•ืคื™ืœ GitHub, ื•ืžืฉืชืžืฉื™ื ื‘ืžื™ืœื” Huawei ื‘ืฉื ื”ืคืจื•ื™ืงื˜ (HKSP - Huawei Kernel Self Protection). ื™ื—ื“ ืขื ื–ืืช, ื ืฆื™ื’ื™ Huawei ื”ื›ื—ื™ืฉื• ืืช ื”ืงืฉืจ ืฉืœ ืคืจื•ื™ืงื˜ HKSP ืขื ื”ื—ื‘ืจื” ื•ื”ืฆื”ื™ืจื• ื›ื™ ื”ืงื•ื“ ืคื•ืชื— ื‘ื™ื•ื–ืžื” ืื™ืฉื™ืช ืฉืœ ื”ืขื•ื‘ื“, ืื™ื ื• ืคืจื•ื™ืงื˜ Huawei ืจืฉืžื™ ื•ืื™ื ื• ืžืฉืžืฉ ื‘ืžื•ืฆืจื™ ื”ื—ื‘ืจื”. ืขึทืœ ืขืžื•ื“ GitHub HKSP ืจื˜ืจื•ืืงื˜ื™ื‘ื™ืช ืœืื—ืจ ื”ื’ื™ืœื•ื™ ื’ื ืคื’ื™ืขื•ืช ื”ื•ืกืฃ ืฉื™ืžื• ืœื‘ ืฉื”ืคืจื•ื™ืงื˜ ืžืคื•ืชื— ื‘ื–ืžื ื™ ื”ืคื ื•ื™ ืœืžื˜ืจื•ืช ืžื—ืงืจ.

HKSP ื›ื•ืœืœ ืฉื™ื ื•ื™ื™ื ื›ืžื• ืืงืจืื™ ืฉืœ ืงื™ื–ื•ื– ื‘ืžื‘ื ื” ื”-cred, ื”ื’ื ื” ืžืคื ื™ ื”ืชืงืคื•ืช ืขืœ ืžืจื—ื‘ ื”ืฉืžื•ืช ืฉืœ ืžื–ื”ื” ื”ืžืฉืชืžืฉ (pid namespace), ื”ืคืจื“ืช ืžื—ืกื ื™ืช ื”ืชื”ืœื™ืš ืžืื–ื•ืจ mmap, ื–ื™ื”ื•ื™ ืฉืœ ืงืจื™ืื•ืช ื›ืคื•ืœื•ืช ืœืคื•ื ืงืฆื™ื™ืช kfree, ื—ืกื™ืžืช ื“ืœื™ืคื•ืช ื“ืจืš ื”ืคืกืื•ื“ื•. -FS /proc (/proc/ {modules, keys, key-users}, /proc/sys/kernel/* ื•-/proc/sys/vm/mmap_min_addr, /proc/kallsyms), ืฉื™ืคื•ืจ ื‘ืืงืจืื™ ืฉืœ ื›ืชื•ื‘ืช ืžืจื—ื‘ ืžืฉืชืžืฉ, Ptrace ื ื•ืกืฃ ื”ื’ื ื”, ื”ื’ื ืช smap ื•-smep ืžืฉื•ืคืจืช, ื”ื™ื›ื•ืœืช ืœืืกื•ืจ ืฉืœื™ื—ืช ื ืชื•ื ื™ื ื“ืจืš ืฉืงืขื™ื ื’ื•ืœืžื™ื™ื, ื—ืกื™ืžืช ื›ืชื•ื‘ื•ืช ืฉื’ื•ื™ื•ืช ื‘ืฉืงืขื™ UDP ื•ื‘ื“ื™ืงืช ืชืงื™ื ื•ืช ื”ืชื”ืœื™ื›ื™ื ื”ืจืฆื™ื. ื”ื•ื ื›ื•ืœืœ ื’ื ืืช ืžื•ื“ื•ืœ ืœื™ื‘ืช Ksguard, ืฉืžื˜ืจืชื• ืœื–ื”ื•ืช ื ื™ืกื™ื•ื ื•ืช ืœื”ื›ื ื™ืก ืขืจื›ื•ืช ืฉื•ืจืฉ ื˜ื™ืคื•ืกื™ื•ืช.

ื˜ืœืื™ื ืฉืงื•ืจืื™ื ืœื• ื’ืจื’ ืงืจื•ืื”-ื”ืจื˜ืžืŸ, ืฉืื—ืจืื™ ืขืœ ืชื—ื–ื•ืงืช ื”ืขื ืฃ ื”ื™ืฆื™ื‘ ืฉืœ ืœื™ื‘ืช ืœื™ื ื•ืงืก, ืขื ื™ื™ืŸ ืื•ืชื•, ื•ื‘ื™ืงืฉ ืžื”ืžื—ื‘ืจ ืœืคืจืง ืืช ื”ืชื™ืงื•ืŸ ื”ืžื•ื ื•ืœื™ื˜ื™ ืœื—ืœืงื™ื ื›ื“ื™ ืœืคืฉื˜ ืืช ื”ืกืงื™ืจื” ื•ื”ืงื™ื“ื•ื ืœื’ืจืขื™ืŸ ื”ืจืืฉื™. ืงื™ืก ืงื•ืง, ืจืืฉ ืคืจื•ื™ืงื˜ ืขืœ ืงื™ื“ื•ื ื’ื ื˜ื›ื ื•ืœื•ื’ื™ื™ืช ื”ื’ื ื” ืืงื˜ื™ื‘ื™ืช ื‘ืœื™ื‘ืช ืœื™ื ื•ืงืก ื‘ืื•ืคืŸ ื—ื™ื•ื‘ื™ ื”ื’ื™ื‘ ืœืชื™ืงื•ื ื™ื ื•ื‘ื™ืŸ ื”ื‘ืขื™ื•ืช, ื”ืคื ื” ืืช ืชืฉื•ืžืช ื”ืœื‘ ืœืงืฉื™ืจื” ืœืืจื›ื™ื˜ืงื˜ื•ืจืช x86 ื•ืœืื•ืคื™ ื”ื”ืชืจืื” ืฉืœ ืžืฆื‘ื™ื ืจื‘ื™ื, ืฉืจืง ืจื•ืฉืžื™ื ืžื™ื“ืข ืขืœ ื”ื‘ืขื™ื”, ืืš ืœื ืžื ืกื™ื ืœื—ืกื•ื ืื•ืชื”.

ืžื—ืงืจ ืฉืœ ื”ืชื™ืงื•ืŸ ืขืœ ื™ื“ื™ ืžืคืชื—ื™ Grsecurity ื—ืฉืฃ ืฉื’ื™ืื•ืช ื•ื—ื•ืœืฉื•ืช ืจื‘ื•ืช ื‘ืงื•ื“, ื•ื’ื ื”ืจืื” ืืช ื”ื™ืขื“ืจ ืžื•ื“ืœ ืื™ื•ืžื™ื ืฉื™ืืคืฉืจ ืœื”ื ืœืฉืคื•ื˜ ื›ืจืื•ื™ ืืช ื™ื›ื•ืœื•ืช ื”ืคืจื•ื™ืงื˜. ื›ื“ื™ ืœื”ื“ื’ื™ื ื‘ื‘ื™ืจื•ืจ ืฉื”ืงื•ื“ ื ื›ืชื‘ ืœืœื ืฉื™ืžื•ืฉ ื‘ืฉื™ื˜ื•ืช ืชื›ื ื•ืช ืžืื•ื‘ื˜ื—ื•ืช, ื ื™ืชื ืช ื“ื•ื’ืžื” ืœืคื’ื™ืขื•ืช ื˜ืจื™ื•ื•ื™ืืœื™ืช ื‘ืžื˜ืคืœ.
ืงื•ื‘ืฅ /proc/ksguard/state, ืฉื ื•ืฆืจ ืขื ื–ื›ื•ื™ื•ืช 0777, ืžื” ืฉืžืจืžื– ืฉืœื›ื•ืœื ื™ืฉ ื’ื™ืฉืช ื›ืชื™ื‘ื”. ื”ืคื•ื ืงืฆื™ื” ksg_state_write, ื”ืžืฉืžืฉืช ืœื ื™ืชื•ื— ืคืงื•ื“ื•ืช ืฉื ื›ืชื‘ื• ืœ-/proc/ksguard/state, ื™ื•ืฆืจืช ืžืื’ืจ tmp[32] ืฉืืœื™ื• ื ื›ืชื‘ื™ื ื ืชื•ื ื™ื ืขืœ ืกืžืš ื’ื•ื“ืœ ื”ืื•ืคืจื ื“ ื”ืžื•ืขื‘ืจ, ืžื‘ืœื™ ืœืงื—ืช ื‘ื—ืฉื‘ื•ืŸ ืืช ื’ื•ื“ืœ ืžืื’ืจ ื”ืžื˜ืจื” ื•ืœืœื ื‘ื“ื™ืงืช ื”ืคืจืžื˜ืจ ืขื ื’ื•ื“ืœ ื”ืžื—ืจื•ื–ืช. ื”ึธื”ึตืŸ. ื›ื“ื™ ืœื”ื—ืœื™ืฃ ื—ืœืง ืžื—ืกื ื™ืช ื”ืœื™ื‘ื”, ืชื•ืงืฃ ืจืง ืฆืจื™ืš ืœื›ืชื•ื‘ ืฉื•ืจื” ื‘ืคื•ืจืžื˜ ืžื™ื•ื—ื“ ืœ-/proc/ksguard/state.

static ssize_t ksg_state_write(ืงื•ื‘ืฅ struct *ืงื•ื‘ืฅ, const char __user *buf,
size_t len, loff_t *offset)
{
ืขืจืš u64;
char tmp[32];
size_t n = 0;

if (copy_from_user(tmp, buf, len))
return -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));
close(fd);
}

ืžืงื•ืจ: OpenNet.ru

ื”ื•ืกืคืช ืชื’ื•ื‘ื”