eBPF posistemio pažeidžiamumas, leidžiantis vykdyti kodą Linux branduolio lygiu

Buvo nustatyti du nauji eBPF posistemio pažeidžiamumas, leidžiantis paleisti tvarkykles Linux branduolio viduje specialioje virtualioje mašinoje su JIT. Abu pažeidžiamumai leidžia vykdyti kodą su branduolio teisėmis ne izoliuotoje eBPF virtualioje mašinoje. Informaciją apie problemas paskelbė „Zero Day Initiative“ komanda, vykdanti konkursą „Pwn2Own“, kurio metu šiais metais buvo pademonstruotos trys „Ubuntu Linux“ atakos, kuriose buvo panaudotos anksčiau nežinomos spragos (ar eBPF pažeidžiamumas yra susijęs su šiomis atakomis, nepranešama) .

  • CVE-2021-3490 – pažeidžiamumą sukelia 32 bitų užribio tikrinimo trūkumas atliekant bitų IR, ARBA ir XOR operacijas eBPF ALU32. Užpuolikas gali pasinaudoti šia klaida, kad galėtų skaityti ir rašyti duomenis už paskirto buferio ribų. Problema su XOR operacijomis atsiranda nuo 5.7-rc1 branduolio versijos, o AND ir OR – nuo ​​5.10-rc1.
  • CVE-2021-3489 – pažeidžiamumas atsirado dėl skambėjimo buferio diegimo klaidos ir atsirado dėl to, kad funkcija bpf_ringbuf_reserve nepatikrino galimybės, kad skirtos atminties srities dydis gali būti mažesnis nei tikrasis dydis. iš ringbufo. Problema atsiranda nuo 5.8-rc1 leidimo.

Platinimo pažeidžiamumų pataisymo būseną galima stebėti šiuose puslapiuose: Ubuntu, Debian, RHEL, Fedora, SUSE, Arch). Pataisymai taip pat galimi kaip pataisos (CVE-2021-3489, CVE-2021-3490). Ar problema gali būti išnaudota, priklauso nuo to, ar eBPF sistemos iškvietimas pasiekiamas vartotojui. Pavyzdžiui, pagal numatytąją RHEL konfigūraciją, norint išnaudoti pažeidžiamumą, vartotojas turi turėti CAP_SYS_ADMIN teises.

Atskirai galime pastebėti dar vieną Linux branduolio pažeidžiamumą – CVE-2021-32606, leidžiantį vietiniam vartotojui pakelti savo teises iki šakninio lygio. Problema buvo akivaizdi nuo Linux branduolio 5.11 ir ją sukelia lenktynių sąlyga diegiant CAN ISOTP protokolą, leidžiantį pakeisti lizdo surišimo parametrus, nes nėra nustatyti tinkami užraktai funkcijoje isotp_setsockopt() apdorojant CAN_ISOTP_SF_BROADCAST vėliavėlę.

Kai ISOTP lizdas uždaromas, susiejimas su gavėjo lizdu lieka galioti, kuris gali toliau naudoti su lizdu susietas struktūras, kai su jomis susieta atmintis bus atlaisvinta (nenaudojama po to, kai iškviečiama isotp_sock struktūra kuris jau buvo atlaisvintas, kai iškviečiamas isotp_rcv(). Manipuliuodami duomenimis galite nepaisyti rodyklės į funkciją sk_error_report() ir vykdyti savo kodą branduolio lygiu.

Šaltinis: opennet.ru

Добавить комментарий