Π Π°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΈ ΠΏΡΠΎΠ΅ΠΊΡΠ° Grsecurity
ΠΠ°ΡΡΠΈ HKSP Π±ΡΠ»ΠΈ ΠΎΠΏΡΠ±Π»ΠΈΠΊΠΎΠ²Π°Π½Ρ ΡΠΎΡΡΡΠ΄Π½ΠΈΠΊΠΎΠΌ ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΠΈ Huawei, Π²ΠΊΠ»ΡΡΠ°ΡΡ ΡΠΏΠΎΠΌΠΈΠ½Π°Π½ΠΈΠ΅ Huawei Π² ΠΏΡΠΎΡΠΈΠ»Π΅ GitHub ΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡ ΡΠ»ΠΎΠ²ΠΎ Huawei Π² ΡΠ°ΡΡΠΈΡΡΠΎΠ²ΠΊΠ΅ Π½Π°Π·Π²Π°Π½ΠΈΡ ΠΏΡΠΎΠ΅ΠΊΡΠ° (HKSP — Huawei Kernel Self Protection). ΠΡΠΈ ΡΡΠΎΠΌ ΠΏΡΠ΅Π΄ΡΡΠ°Π²ΠΈΡΠ΅Π»ΠΈ Huawei ΠΎΠΏΡΠΎΠ²Π΅ΡΠ³Π»ΠΈ ΡΠ²ΡΠ·Ρ ΠΏΡΠΎΠ΅ΠΊΡΠ° HKSP Ρ ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΠ΅ΠΉ ΠΈ Π·Π°ΡΠ²ΠΈΠ»ΠΈ, ΡΡΠΎ ΠΊΠΎΠ΄ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠ°Π½ ΠΏΠΎ Π»ΠΈΡΠ½ΠΎΠΉ ΠΈΠ½ΠΈΡΠΈΠ°ΡΠΈΠ²Π΅ ΡΠ°Π±ΠΎΡΠ½ΠΈΠΊΠ°, Π½Π΅ ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΎΡΠΈΡΠΈΠ°Π»ΡΠ½ΡΠΌ ΠΏΡΠΎΠ΅ΠΊΡΠΎΠΌ Huawei ΠΈ Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ Π² ΠΏΡΠΎΠ΄ΡΠΊΡΠ°Ρ
Π΄Π°Π½Π½ΠΎΠΉ ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΠΈ. ΠΠ°
HKSP Π²ΠΊΠ»ΡΡΠ°Π΅Ρ ΡΠ°ΠΊΠΈΠ΅ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ, ΠΊΠ°ΠΊ ΡΠ°Π½Π΄ΠΎΠΌΠΈΠ·Π°ΡΠΈΡ ΡΠΌΠ΅ΡΠ΅Π½ΠΈΠΉ Π² ΡΡΡΡΠΊΡΡΡΠ΅ cred, Π·Π°ΡΠΈΡΠ° ΠΎΡ Π°ΡΠ°ΠΊ Π½Π° ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²ΠΎ ΠΈΠΌΡΠ½ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡΠΎΠ² ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Π΅ΠΉ (pid namespace), ΠΎΡΠ΄Π΅Π»Π΅Π½ΠΈΠ΅ ΡΡΠ΅ΠΊΠ° ΠΏΡΠΎΡΠ΅ΡΡΠΎΠ² ΠΎΡ ΠΎΠ±Π»Π°ΡΡΠΈ mmap, Π²ΡΡΠ²Π»Π΅Π½ΠΈΠ΅ Π΄Π²ΠΎΠΉΠ½ΠΎΠ³ΠΎ Π²ΡΠ·ΠΎΠ²Π° ΡΡΠ½ΠΊΡΠΈΠΈ kfree, Π±Π»ΠΎΠΊΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΡΡΠ΅ΡΠ΅ΠΊ ΡΠ΅ΡΠ΅Π· ΠΏΡΠ΅Π²Π΄ΠΎ-Π€Π‘ /proc (/proc/{modules, keys, key-users}, /proc/sys/kernel/* ΠΈ /proc/sys/vm/mmap_min_addr, /proc/kallsyms), ΡΠ»ΡΡΡΠ΅Π½ΠΈΠ΅ ΡΠ°Π½Π΄ΠΎΠΌΠΈΠ·Π°ΡΠΈΠΈ Π°Π΄ΡΠ΅ΡΠΎΠ² Π² ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²Π΅ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ, Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½Π°Ρ Π·Π°ΡΠΈΡΠ° Ptrace, ΡΡΠΈΠ»Π΅Π½ΠΈΠ΅ Π·Π°ΡΠΈΡΡ smap ΠΈ smep, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ Π·Π°ΠΏΡΠ΅ΡΠ° ΠΎΡΠΏΡΠ°Π²ΠΊΠΈ Π΄Π°Π½Π½ΡΡ ΡΠ΅ΡΠ΅Π· raw-ΡΠΎΠΊΠ΅ΡΡ, Π±Π»ΠΎΠΊΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ Π½Π΅ΠΊΠΎΡΡΠ΅ΠΊΡΠ½ΡΡ Π°Π΄ΡΠ΅ΡΠΎΠ² Π² UDP-ΡΠΎΠΊΠ΅ΡΠ°Ρ ΠΈ ΠΏΡΠΎΠ²Π΅ΡΠΊΠ° ΡΠ΅Π»ΠΎΡΡΠ½ΠΎΡΡΠΈ Π·Π°ΠΏΡΡΠΊΠ°Π΅ΠΌΡΡ ΠΏΡΠΎΡΠ΅ΡΡΠΎΠ². Π ΡΠΎΡΡΠ°Π² ΡΠ°ΠΊΠΆΠ΅ Π²Ρ ΠΎΠ΄ΠΈΡ ΠΌΠΎΠ΄ΡΠ»Ρ ΡΠ΄ΡΠ° Ksguard, Π½Π°ΡΠ΅Π»Π΅Π½Π½ΡΠΉ Π½Π° ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΏΠΎΠΏΡΡΠΎΠΊ Π²Π½Π΅Π΄ΡΠ΅Π½ΠΈΡ ΡΠΈΠΏΠΎΠ²ΡΡ ΡΡΡΠΊΠΈΡΠΎΠ².
ΠΠ°ΡΡΠΈ
ΠΠ·ΡΡΠ΅Π½ΠΈΠ΅ ΠΏΠ°ΡΡΠ° ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠ°ΠΌΠΈ Grsecurity Π²ΡΡΠ²ΠΈΠ»ΠΎ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎ ΠΎΡΠΈΠ±ΠΎΠΊ ΠΈ ΡΠ»Π°Π±ΡΡ
ΠΌΠ΅ΡΡ Π² ΠΊΠΎΠ΄Π΅, Π° ΡΠ°ΠΊΠΆΠ΅ ΠΏΠΎΠΊΠ°Π·Π°Π»ΠΎ ΠΎΡΡΡΡΡΡΠ²ΠΈΠ΅ ΠΌΠΎΠ΄Π΅Π»ΠΈ ΡΠ³ΡΠΎΠ·, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡΡΠ΅ΠΉ Π°Π΄Π΅ΠΊΠ²Π°ΡΠ½ΠΎ ΡΡΠ΄ΠΈΡΡ ΠΎ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡΡ
ΠΏΡΠΎΠ΅ΠΊΡΠ°. ΠΠ»Ρ Π½Π°Π³Π»ΡΠ΄Π½ΠΎΠΉ Π΄Π΅ΠΌΠΎΠ½ΡΡΡΠ°ΡΠΈΠΈ ΡΠΎΠ³ΠΎ, ΡΡΠΎ ΠΊΠΎΠ΄ Π½Π°ΠΏΠΈΡΠ°Π½ Π±Π΅Π· ΠΏΡΠΈΠΌΠ΅Π½Π΅Π½ΠΈΡ ΠΌΠ΅ΡΠΎΠ΄ΠΎΠ² Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΠ³ΠΎ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΡ, ΠΏΡΠΈΠ²Π΅Π΄ΡΠ½ ΠΏΡΠΈΠΌΠ΅Ρ ΡΡΠΈΠ²ΠΈΠ°Π»ΡΠ½ΠΎΠΉ ΡΡΠ·Π²ΠΈΠΌΠΎΡΡΠΈ Π² ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊΠ΅
ΡΠ°ΠΉΠ»Π° /proc/ksguard/state, ΠΊΠΎΡΠΎΡΡΠΉ ΡΠΎΠ·Π΄Π°ΡΡΡΡ Ρ ΠΏΡΠ°Π²Π°ΠΌΠΈ 0777, ΠΏΠΎΠ΄ΡΠ°Π·ΡΠΌΠ΅Π²Π°ΡΡΠΈΠΌΠΈ ΠΎΡΠΊΡΡΡΠΈΠ΅ Π΄ΠΎΡΡΡΠΏΠ° Π²ΡΠ΅ΠΌ Π½Π° Π·Π°ΠΏΠΈΡΡ. Π ΡΡΠ½ΠΊΡΠΈΠΈ ksg_state_write, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΠΎΠΉ Π΄Π»Ρ ΡΠ°Π·Π±ΠΎΡΠ° ΠΊΠΎΠΌΠ°Π½Π΄, Π·Π°ΠΏΠΈΡΡΠ²Π°Π΅ΠΌΡΡ
Π² /proc/ksguard/state, ΡΠΎΠ·Π΄Π°ΡΡΡΡ Π±ΡΡΠ΅Ρ tmp[32], Π² ΠΊΠΎΡΠΎΡΡΠΉ Π΄Π°Π½Π½ΡΠ΅ Π·Π°ΠΏΠΈΡΡΠ²Π°ΡΡΡΡ Π½Π° ΠΎΡΠ½ΠΎΠ²Π°Π½ΠΈΠΈ ΡΠ°Π·ΠΌΠ΅ΡΠ° ΠΏΠ΅ΡΠ΅Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΠΎΠΏΠ΅ΡΠ°Π½Π΄Π°, Π±Π΅Π· ΡΡΡΡΠ° ΡΠ°Π·ΠΌΠ΅ΡΠ° ΡΠ΅Π»Π΅Π²ΠΎΠ³ΠΎ Π±ΡΡΠ΅ΡΠ° ΠΈ Π±Π΅Π· ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠ° Ρ ΡΠ°Π·ΠΌΠ΅ΡΠΎΠΌ ΡΡΡΠΎΠΊΠΈ. Π’.Π΅. Π΄Π»Ρ ΠΏΠ΅ΡΠ΅Π·Π°ΠΏΠΈΡΠΈ ΡΠ°ΡΡΠΈ ΡΡΠ΅ΠΊΠ° ΡΠ΄ΡΠ° Π°ΡΠ°ΠΊΡΡΡΠ΅ΠΌΡ Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ Π·Π°ΠΏΠΈΡΠ°ΡΡ ΡΠΏΠ΅ΡΠΈΠ°Π»ΡΠ½ΠΎ ΠΎΡΠΎΡΠΌΠ»Π΅Π½Π½ΡΡ ΡΡΡΠΎΠΊΡ Π² /proc/ksguard/state.
static ssize_t ksg_state_write(struct file *file, const char __user *buf,
size_t len, loff_t *offset)
{
u64 value;
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