Au fost identificate două noi vulnerabilități în subsistemul eBPF, care permite executarea handler-elor în cadrul nucleului Linux într-o mașină virtuală specială cu JIT. Ambele vulnerabilități oferă posibilitatea de a executa cod propriu cu privilegii de nucleu, în afara mașinii virtuale izolate eBPF. Informații despre probleme au fost publicate de echipa Zero Day Initiative, care organizează competiții Pwn2Own, în cadrul cărora anul acesta au fost demonstrate trei atacuri asupra Ubuntu Linux, utilizând vulnerabilități anterior necunoscute (nu se specifică dacă vulnerabilitățile în eBPF sunt legate de aceste atacuri).
- CVE-2021-3490 — vulnerabilitatea este cauzată de absența verificării depășirii limitelor valorilor de 32 de biți în timpul executării operațiunilor bitwise AND, OR și XOR în eBPF ALU32. Atacatorul poate profita de această eroare pentru a citi și scrie date în afara granițelor buffer-ului alocat. Problema cu operațiunea XOR apare începând cu versiunea nucleului 5.7-rc1, iar AND și OR — începând cu lansarea 5.10-rc1.
- CVE-2021-3489 — vulnerabilitatea este cauzată de o eroare în implementarea buffer-ului circular și este legată de faptul că funcția bpf_ringbuf_reserve nu verifica dacă dimensiunea zonei de memorie alocate poate fi mai mică decât dimensiunea efectivă a buffer-ului circular ringbuf. Problema apare începând cu lansarea 5.8-rc1.
Starea remedierii vulnerabilităților în distribuții poate fi urmărită pe următoarele pagini: Ubuntu, Debian, RHEL, Fedora, SUSE, Arch). Remediile sunt de asemenea disponibile sub formă de patch-uri (CVE-2021-3489, CVE-2021-3490). Posibilitatea de exploatare a problemei depinde de disponibilitatea apelului de sistem eBPF pentru utilizator. De exemplu, în configurația implicită în RHEL, pentru exploatarea vulnerabilității este necesară privilegii CAP_SYS_ADMIN pentru utilizator.
De asemenea, merită menționată o altă vulnerabilitate în nucleul Linux — CVE-2021-32606, care permite unui utilizator local să își crească privilegiile la nivel de root. Problema apare începând cu nucleul Linux 5.11 și este cauzată de o stare de competiție în implementarea protocoalelor CAN ISOTP, care permite modificarea parametrilor de legare la socket din cauza absenței blocajelor corespunzătoare în funcția isotp_setsockopt() la procesarea steagului CAN_ISOTP_SF_BROADCAST.
După închiderea socket-ului, ISOTP continuă să mențină legătura cu socket-ul receptor, care poate continua să utilizeze structurile legate de socket după eliberarea memoriei asociate (use-after-free din cauza apelului la isotp_rcv() pe o structură isotp_sock deja eliberată). Prin manipularea datelor poate fi realizată suprascrierea pointer-ului funcției sk_error_report() și executarea propriului cod la nivel de kernel.
Sursa: opennet.ro
