Két új sebezhetőséget fedeztek fel az eBPF alrendszerben, amely lehetővé teszi a kezelők futtatását a Linux kernel belsejében egy különleges JIT virtuális gépen. Mindkét sebezhetőség lehetőséget ad a káros kód kernel szintű végrehajtására, az eBPF izolált virtuális gépén kívül. A problémákról a Zero Day Initiative csapata számolt be, amely a Pwn2Own versenyeket szervezi, ahol idén három támadást mutattak be az Ubuntu Linux ellen eddig ismeretlen sebezhetőségekkel (az eBPF sebezhetőségek kapcsolata ezekkel a támadásokkal nem ismert).
- CVE-2021-3490 — A sebezhetőség a 32 bites értékek határának ellenőrzésének hiányából adódik az AND, OR és XOR bitműveletek végrehajtása során az eBPF ALU32-ben. A támadó kihasználhatja ezt a hibát, hogy adatokat olvasson és írjon a lefoglalt puffer határain kívül. Az XOR művelet problémája a 5.7-rc1 kernel verziótól kezdődően jelentkezik, míg az AND és OR műveletek a 5.10-rc1 verziótól.
- CVE-2021-3489 — A sebezhetőség egy körkörös puffer megvalósításában fellépő hibából fakad, amely abból ered, hogy a bpf_ringbuf_reserve funkció nem ellenőrizte, hogy a lefoglalt memória terület mérete kisebb lehet-e, mint a körkörös puffer tényleges mérete. A probléma a 5.8-rc1 verziótól kezdve jelentkezik.
A sebezhetőségek javításának állapotát a következő oldalakon követhetjük nyomon: Ubuntu, Debian, RHEL, Fedora, SUSE, Arch. A javítások rendelkezésre állnak javítócsomagok formájában (CVE-2021-3489, CVE-2021-3490). A probléma kihasználásának lehetősége a felhasználónak az eBPF rendszerhívás elérésétől függ. Például az alapértelmezett konfigurációban RHEL esetében a sebezhetőség kihasználásához a felhasználónak CAP_SYS_ADMIN jogokkal kell rendelkeznie.
Külön említést érdemel egy másik sebezhetőség a Linux kernelben — CVE-2021-32606, amely lehetővé teszi egy helyi felhasználó számára, hogy emelje a jogosultságait root szintre. A probléma a Linux kernel 5.11-es verziójától kezdődően jelentkezik, és egy versenyfeltétel okozza a CAN ISOTP protokoll implementációjában, amely lehetővé teszi a sockethez való kötődési paraméterek megváltoztatását a megfelelő zárolások beállításának hiánya miatt az isotp_setsockopt() funkcióban a CAN_ISOTP_SF_BROADCAST jelző feldolgozása során.
Az ISOTP socket bezárása után a címzett sockethez való kötődés továbbra is aktív marad, ami lehetővé teszi a sockethez kapcsolódó struktúrák használatát a velük kapcsolatos memória felszabadítása után (use-after-free, mivel az isotp_rcv() hívásakor már felszabadított isotp_sock struktúrára hivatkozunk). Az adatok manipulációjával elérhetjük a sk_error_report() funkció mutatójának felülírását, és végrehajthatjuk a saját kódunkat a kernel szintjén.
Forrás: opennet.ru
