Π Π°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΈ ΠΏΡΠΎΠ΅ΠΊΡΠ° Grsecurity Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° Π½Π°Π»ΠΈΡΠΈΠ΅ ΡΡΠΈΠ²ΠΈΠ°Π»ΡΠ½ΠΎ ΡΠΊΡΠΏΠ»ΡΠ°ΡΠΈΡΡΠ΅ΠΌΠΎΠΉ ΡΡΠ·Π²ΠΈΠΌΠΎΡΡΠΈ Π² Π½Π°Π±ΠΎΡΠ΅ ΠΏΠ°ΡΡΠ΅ΠΉ (Huawei Kernel Self Protection), Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ Π΄Π½Π΅ΠΉ Π½Π°Π·Π°Π΄ Π΄Π»Ρ ΠΏΠΎΠ²ΡΡΠ΅Π½ΠΈΡ Π·Π°ΡΠΈΡΡ ΡΠ΄ΡΠ° Linux. Π‘ΠΈΡΡΠ°ΡΠΈΡ Π½Π°ΠΏΠΎΠΌΠΈΠ½Π°Π΅Ρ , Π² ΠΊΠΎΡΠΎΡΠΎΠΌ ΠΏΠΎΠΏΡΡΠΊΠ° ΠΏΠΎΠ²ΡΡΠ΅Π½ΠΈΡ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡΠΈ ΡΠΈΡΡΠ΅ΠΌΡ ΠΏΡΠΈΠ²Π΅Π»Π° ΠΊ ΠΏΠΎΡΠ²Π»Π΅Π½ΠΈΡ Π½ΠΎΠ²ΠΎΠΉ ΡΡΠ·Π²ΠΈΠΌΠΎΡΡΠΈ ΠΈ ΡΠΏΡΠΎΡΡΠΈΠ»Π° ΠΊΠΎΠΌΠΏΡΠΎΠΌΠ΅ΡΠ°ΡΠΈΡ ΡΡΡΡΠΎΠΉΡΡΠ².
ΠΠ°ΡΡΠΈ HKSP Π±ΡΠ»ΠΈ ΠΎΠΏΡΠ±Π»ΠΈΠΊΠΎΠ²Π°Π½Ρ ΡΠΎΡΡΡΠ΄Π½ΠΈΠΊΠΎΠΌ ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΠΈ Huawei, Π²ΠΊΠ»ΡΡΠ°ΡΡ ΡΠΏΠΎΠΌΠΈΠ½Π°Π½ΠΈΠ΅ Huawei Π² ΠΏΡΠΎΡΠΈΠ»Π΅ GitHub ΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡ ΡΠ»ΠΎΠ²ΠΎ Huawei Π² ΡΠ°ΡΡΠΈΡΡΠΎΠ²ΠΊΠ΅ Π½Π°Π·Π²Π°Π½ΠΈΡ ΠΏΡΠΎΠ΅ΠΊΡΠ° (HKSP β Huawei Kernel Self Protection). ΠΡΠΈ ΡΡΠΎΠΌ ΠΏΡΠ΅Π΄ΡΡΠ°Π²ΠΈΡΠ΅Π»ΠΈ Huawei ΠΎΠΏΡΠΎΠ²Π΅ΡΠ³Π»ΠΈ ΡΠ²ΡΠ·Ρ ΠΏΡΠΎΠ΅ΠΊΡΠ° HKSP Ρ ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΠ΅ΠΉ ΠΈ Π·Π°ΡΠ²ΠΈΠ»ΠΈ, ΡΡΠΎ ΠΊΠΎΠ΄ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠ°Π½ ΠΏΠΎ Π»ΠΈΡΠ½ΠΎΠΉ ΠΈΠ½ΠΈΡΠΈΠ°ΡΠΈΠ²Π΅ ΡΠ°Π±ΠΎΡΠ½ΠΈΠΊΠ°, Π½Π΅ ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΎΡΠΈΡΠΈΠ°Π»ΡΠ½ΡΠΌ ΠΏΡΠΎΠ΅ΠΊΡΠΎΠΌ Huawei ΠΈ Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ Π² ΠΏΡΠΎΠ΄ΡΠΊΡΠ°Ρ Π΄Π°Π½Π½ΠΎΠΉ ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΠΈ. ΠΠ° HKSP Π·Π°Π΄Π½ΠΈΠΌ ΡΠΈΡΠ»ΠΎΠΌ ΡΡΠ·Π²ΠΈΠΌΠΎΡΡΠΈ ΡΠ°ΠΊΠΆΠ΅ ΠΏΡΠΈΠΌΠ΅ΡΠ°Π½ΠΈΠ΅, ΡΡΠΎ ΠΏΡΠΎΠ΅ΠΊΡ ΡΠ°Π·Π²ΠΈΠ²Π°Π΅ΡΡΡ Π² ΡΠ²ΠΎΠ±ΠΎΠ΄Π½ΠΎΠ΅ Π²ΡΠ΅ΠΌΡ Π² ΠΈΡΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΠΈΡ ΡΠ΅Π»ΡΡ .
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, Π½Π°ΡΠ΅Π»Π΅Π½Π½ΡΠΉ Π½Π° ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΏΠΎΠΏΡΡΠΎΠΊ Π²Π½Π΅Π΄ΡΠ΅Π½ΠΈΡ ΡΠΈΠΏΠΎΠ²ΡΡ ΡΡΡΠΊΠΈΡΠΎΠ².
ΠΠ°ΡΡΠΈ ΠΈΠ½ΡΠ΅ΡΠ΅Ρ Ρ ΠΡΠ΅Π³Π° ΠΡΠΎΠ°-Π₯Π°ΡΡΠΌΠ°Π½Π° (Greg Kroah-Hartman), ΠΎΡΠ²Π΅ΡΠ°ΡΡΠ΅Π³ΠΎ Π·Π° ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΡ ΡΡΠ°Π±ΠΈΠ»ΡΠ½ΠΎΠΉ Π²Π΅ΡΠΊΠΈ ΡΠ΄ΡΠ° Linux, ΠΊΠΎΡΠΎΡΡΠΉ ΠΏΠΎΠΏΡΠΎΡΠΈΠ» Π°Π²ΡΠΎΡΠ° ΡΠ°Π·Π±ΠΈΡΡ ΠΌΠΎΠ½ΠΎΠ»ΠΈΡΠ½ΡΠΉ ΠΏΠ°ΡΡ Π½Π° ΡΠ°ΡΡΠΈ Π΄Π»Ρ ΡΠΏΡΠΎΡΠ΅Π½ΠΈΡ ΡΠ΅ΡΠ΅Π½Π·ΠΈΡΠΎΠ²Π½ΠΈΡ ΠΈ ΠΏΡΠΎΠ΄Π²ΠΈΠΆΠ΅Π½ΠΈΡ Π² ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠΉ ΡΠΎΡΡΠ°Π² ΡΠ΄ΡΠ°. ΠΠ΅Ρ ΠΡΠΊ (Kees Cook), Π²ΠΎΠ·Π³Π»Π°Π²Π»ΡΡΡΠΈΠΉ ΠΏΠΎ Π² ΡΠ΄ΡΠΎ Linux ΡΠ΅Ρ Π½ΠΎΠ»ΠΎΠ³ΠΈΠΈ Π°ΠΊΡΠΈΠ²Π½ΠΎΠΉ Π·Π°ΡΠΈΡΡ, ΡΠ°ΠΊΠΆΠ΅ ΠΎΡΠΎΠ·Π²Π°Π»ΡΡ ΠΎ ΠΏΠ°ΡΡΠ°Ρ ΠΈ ΠΈΠ· ΠΏΡΠΎΠ±Π»Π΅ΠΌ ΠΎΠ±ΡΠ°ΡΠΈΠ» Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° ΠΏΡΠΈΠ²ΡΠ·ΠΊΡ ΠΊ Π°ΡΡ ΠΈΡΠ΅ΠΊΡΡΡΠ΅ x86 ΠΈ ΡΠ²Π΅Π΄ΠΎΠΌΠΈΡΠ΅Π»ΡΠ½ΡΠΉ Ρ Π°ΡΠ°ΠΊΡΠ΅Ρ ΠΌΠ½ΠΎΠ³ΠΈΡ ΡΠ΅ΠΆΠΈΠΌΠΎΠ², ΠΊΠΎΡΠΎΡΡΠ΅ Π»ΠΈΡΡ Π²ΡΠ²ΠΎΠ΄ΡΡ Π² Π»ΠΎΠ³ ΡΠ²Π΅Π΄Π΅Π½ΠΈΡ ΠΎ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ΅, Π½ΠΎ Π½Π΅ ΠΏΡΡΠ°ΡΡΡΡ Π΅Ρ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²Π°ΡΡ.
ΠΠ·ΡΡΠ΅Π½ΠΈΠ΅ ΠΏΠ°ΡΡΠ° ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠ°ΠΌΠΈ 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
