Chyby v podsystéme eBPF, ktoré umožňujú spúšťanie kódu na úrovni jadra Linuxu

V subsystéme eBPF boli identifikované dve nové zraniteľnosti, ktoré vám umožňujú spúšťať obslužné programy vo vnútri linuxového jadra v špeciálnom virtuálnom stroji s JIT. Obe zraniteľnosti umožňujú spustiť váš kód s právami jadra mimo izolovaného virtuálneho počítača eBPF. Informácie o problémoch zverejnil tím Zero Day Initiative, ktorý prevádzkuje súťaž Pwn2Own, počas ktorej boli tento rok demonštrované tri útoky na Ubuntu Linux, ktoré využívali doteraz neznáme zraniteľnosti (či zraniteľnosti v eBPF súvisia s týmito útokmi sa neuvádza). .

  • CVE-2021-3490 – Chyba zabezpečenia je spôsobená nedostatkom 32-bitovej kontroly mimo hraníc pri vykonávaní bitových operácií AND, OR a XOR v eBPF ALU32. Útočník môže využiť túto chybu na čítanie a zápis údajov mimo hraníc pridelenej vyrovnávacej pamäte. Problém s operáciami XOR sa objavuje od verzie jadra 5.7-rc1 a AND a OR - od verzie 5.10-rc1.
  • CVE-2021-3489 – Zraniteľnosť je spôsobená chybou v implementácii kruhovej vyrovnávacej pamäte a je spôsobená skutočnosťou, že funkcia bpf_ringbuf_reserve neskontrolovala možnosť, že veľkosť oblasti pridelenej pamäte môže byť menšia ako skutočná veľkosť z ringbuf. Problém sa objavuje od vydania 5.8-rc1.

Stav opravných zraniteľností v distribúciách je možné sledovať na týchto stránkach: Ubuntu, Debian, RHEL, Fedora, SUSE, Arch). Opravy sú dostupné aj ako opravy (CVE-2021-3489, CVE-2021-3490). Či je možné problém zneužiť, závisí od toho, či je systémové volanie eBPF prístupné používateľovi. Napríklad v predvolenej konfigurácii v RHEL si využitie zraniteľnosti vyžaduje, aby mal používateľ práva CAP_SYS_ADMIN.

Samostatne si môžeme všimnúť ďalšiu zraniteľnosť v jadre Linuxu - CVE-2021-32606, ktorá umožňuje lokálnemu používateľovi zvýšiť svoje privilégiá na koreňovú úroveň. Problém je zrejmý už od jadra Linuxu 5.11 a je spôsobený konfliktným stavom pri implementácii protokolu CAN ISOTP, ktorý umožňuje zmeniť parametre väzby soketu z dôvodu chýbajúceho nastavenia správnych zámkov vo funkcii isotp_setsockopt() pri spracovaní príznaku CAN_ISOTP_SF_BROADCAST.

Po zatvorení soketu ISOTP zostane v platnosti väzba na soket príjemcu, ktorý môže pokračovať v používaní štruktúr priradených k soketu po uvoľnení pamäte, ktorá je s nimi spojená (použitie-po-voľné kvôli volaniu štruktúry isotp_sock ktorý už bol uvoľnený pri volaní isotp_rcv(). Prostredníctvom manipulácie s údajmi môžete prepísať ukazovateľ na funkciu sk_error_report() a spustiť svoj kód na úrovni jadra.

Zdroj: opennet.ru

Pridať komentár