Grsecurity projekti arendajad
HKSP plaastrid avaldas Huawei töötaja, need sisaldavad GitHubi profiilis Huawei mainimist ja kasutavad projekti nimes sõna Huawei (HKSP – Huawei Kernel Self Protection). Samas eitasid Huawei esindajad HKSP projekti seotust ettevõttega ja väitsid, et kood töötati välja töötaja isiklikul initsiatiivil, see ei ole ametlik Huawei projekt ning seda ei kasutata ettevõtte toodetes. Peal
HKSP sisaldab selliseid muudatusi nagu nihkete randomiseerimine krediitstruktuuris, kaitse kasutaja identifikaatori nimeruumi (pid nimeruumi) rünnakute eest, protsessipinu eraldamine mmap piirkonnast, kfree funktsiooni topeltkutsete tuvastamine, pseudo kaudu lekete blokeerimine. -FS /proc (/proc/ {moodulid, võtmed, võtmekasutajad}, /proc/sys/kernel/* ja /proc/sys/vm/mmap_min_addr, /proc/kallsyms), täiustatud kasutajaruumi aadresside randomiseerimine, täiendav Ptrace kaitse, täiustatud smp- ja smep-kaitse, võimalus keelata andmete saatmine töötlemata pesade kaudu, UDP-pesades ebaõigete aadresside blokeerimine ja töötavate protsesside terviklikkuse kontrollimine. See sisaldab ka Ksguardi tuumamoodulit, mis on suunatud tüüpiliste juurkomplektide juurutamise katsete tuvastamisele.
Plaastrid
Grsecurity arendajate plaastri uuring paljastas koodis palju vigu ja nõrkusi ning näitas ka ohumudeli puudumist, mis võimaldaks neil projekti võimalusi adekvaatselt hinnata. Et selgelt näidata, et kood on kirjutatud ilma turvalisi programmeerimismeetodeid kasutamata, on toodud näide töötleja triviaalsest haavatavusest.
fail /proc/ksguard/state, mis luuakse õigustega 0777, mis tähendab, et kõigil on kirjutamisõigus. Funktsioon ksg_state_write, mida kasutatakse faili /proc/ksguard/state kirjutatud käskude sõelumiseks, loob tmp[32] puhvri, kuhu kirjutatakse andmed edastatud operandi suuruse alusel, võtmata arvesse sihtpuhvri suurust ja ilma parameetri kontrollimine stringi suurusega. Need. Osa kerneli pinu ülekirjutamiseks peab ründaja lihtsalt kirjutama faili /proc/ksguard/state spetsiaalselt vormindatud rea.
static ssize_t ksg_state_write(struct fail *fail, const char __user *buf,
suurus_t len, loff_t *nihe)
{
u64 väärtus;
char tmp[32];
suurus_t n = 0;
if (copy_from_user(tmp, buf, len))
tagasitulek -1;
väärtus = simple_strtoul(tmp, '\0', 10);
...
Kasutage prototüüpi:
char buf[4096] = { };
int fd = avatud (“/proc/ksguard/state”, O_WRONLY);
if (fd >= 0) {
write(fd, buf, sizeof(buf));
sulge(fd);
}
Allikas: opennet.ru