Razvijalci projekta Grsecurity
Popravke HKSP je objavil Huaweijev zaposleni, vključujejo omembo Huaweija v profilu GitHub in uporabljajo besedo Huawei v imenu projekta (HKSP - Huawei Kernel Self Protection). Hkrati so predstavniki Huaweia zanikali povezavo projekta HKSP s podjetjem in izjavili, da je bila koda razvita na osebno pobudo zaposlenega, ni uradni projekt Huawei in se ne uporablja v izdelkih podjetja. Vklopljeno
HKSP vključuje spremembe, kot so randomizacija odmikov v strukturi verodostojnosti, zaščita pred napadi na imenski prostor identifikatorja uporabnika (imenski prostor pid), ločevanje sklada procesa od območja mmap, zaznavanje dvojnih klicev k funkciji kfree, blokiranje puščanja prek psevdo -FS /proc (/proc/ {modules, keys, key-users}, /proc/sys/kernel/* in /proc/sys/vm/mmap_min_addr, /proc/kallsyms), izboljšana randomizacija naslovov uporabniškega prostora, dodatni Ptrace zaščita, izboljšana zaščita smap in smep, zmožnost prepovedi pošiljanja podatkov prek neobdelanih vtičnic, blokiranje nepravilnih naslovov v vtičnicah UDP in preverjanje celovitosti izvajajočih se procesov. Vključuje tudi jedrni modul Ksguard, ki je namenjen zaznavanju poskusov uvajanja tipičnih rootkitov.
Obliži
Študija popravka razvijalcev Grsecurity je razkrila številne napake in slabosti v kodi ter pokazala odsotnost modela groženj, ki bi jim omogočil ustrezno presojo zmogljivosti projekta. Da bi jasno prikazali, da je bila koda napisana brez uporabe varnih metod programiranja, je podan primer trivialne ranljivosti v upravljalniku.
datoteka /proc/ksguard/state, ki je ustvarjena s pravicami 0777, kar pomeni, da imajo vsi dostop za pisanje. Funkcija ksg_state_write, ki se uporablja za razčlenjevanje ukazov, zapisanih v /proc/ksguard/state, ustvari medpomnilnik tmp[32], v katerega se zapišejo podatki glede na velikost posredovanega operanda, ne da bi upoštevala velikost ciljnega medpomnilnika in brez preverjanje parametra z velikostjo niza. Tisti. Če želite prepisati del sklada jedra, mora napadalec samo napisati posebej oblikovano vrstico v /proc/ksguard/state.
statična ssize_t ksg_state_write(strukturna datoteka *datoteka, const char __uporabnik *buf,
size_t len, loff_t *offset)
{
vrednost u64;
char tmp[32];
velikost_t n = 0;
if (copy_from_user(tmp, buf, len))
vrnitev -1;
vrednost = simple_strtoul(tmp, '\0', 10);
...
Prototip izkoriščanja:
char buf[4096] = {};
int fd = open(“/proc/ksguard/state”, N_NAPAKA);
if (fd >= 0) {
pisanje (fd, buf, sizeof(buf));
zapri (fd);
}
Vir: opennet.ru