Sårbarheder i eBPF-undersystemet, der tillader kodekørsel på Linux-kerneniveau

To nye sårbarheder er blevet identificeret i eBPF-undersystemet, som giver dig mulighed for at køre handlere inde i Linux-kernen i en speciel virtuel maskine med JIT. Begge sårbarheder gør det muligt at udføre din kode med kernerettigheder uden for en isoleret eBPF virtuel maskine. Oplysninger om problemerne blev offentliggjort af Zero Day Initiative-teamet, som kører Pwn2Own-konkurrencen, hvor der i år blev demonstreret tre angreb på Ubuntu Linux, der brugte hidtil ukendte sårbarheder (om sårbarhederne i eBPF er relateret til disse angreb er ikke rapporteret) .

  • CVE-2021-3490 - Sårbarheden er forårsaget af en mangel på 32-bit out-of-bounds-kontrol, når der udføres bitvise AND-, OR- og XOR-operationer i eBPF ALU32. En angriber kan drage fordel af denne fejl til at læse og skrive data uden for grænserne af den tildelte buffer. Problemet med XOR-operationer dukker op fra kerneversion 5.7-rc1, og AND og OR - startende fra 5.10-rc1.
  • CVE-2021-3489 - Sårbarheden er forårsaget af en fejl i implementeringen af ​​ringbufferen og skyldes, at funktionen bpf_ringbuf_reserve ikke kontrollerede muligheden for, at størrelsen af ​​den allokerede hukommelsesregion kunne være mindre end den faktiske størrelse af ringbuf. Problemet dukker op siden release 5.8-rc1.

Status for patchning af sårbarheder i distributioner kan spores på disse sider: Ubuntu, Debian, RHEL, Fedora, SUSE, Arch). Rettelser er også tilgængelige som patches (CVE-2021-3489, CVE-2021-3490). Om problemet kan udnyttes afhænger af, om eBPF-systemkaldet er tilgængeligt for brugeren. For eksempel, i standardkonfigurationen i RHEL, kræver udnyttelse af sårbarheden, at brugeren har CAP_SYS_ADMIN-rettigheder.

Separat kan vi bemærke en anden sårbarhed i Linux-kernen - CVE-2021-32606, som tillader en lokal bruger at hæve deres privilegier til rodniveauet. Problemet har været tydeligt siden Linux-kerne 5.11 og er forårsaget af en race-tilstand i implementeringen af ​​CAN ISOTP-protokollen, som gør det muligt at ændre socket-bindingsparametrene på grund af manglende indstilling af de korrekte låse i isotp_setsockopt()-funktionen ved behandling af CAN_ISOTP_SF_BROADCAST-flaget.

Efter at ISOTP-socket er lukket, forbliver bindingen til modtagersocket i kraft, som kan fortsætte med at bruge de strukturer, der er knyttet til soklen, efter at den hukommelse, der er knyttet til dem, er frigivet (use-after-free på grund af opkaldet til en isotp_sock-struktur der allerede er frigivet, når isotp_rcv() kaldes). Gennem datamanipulation kan du tilsidesætte markøren til funktionen sk_error_report() og udføre din kode på kerneniveau.

Kilde: opennet.ru

Tilføj en kommentar