Sårbarheter i eBPF-undersystemet som tillåter kodexekvering på Linux-kärnnivå

Två nya sårbarheter har identifierats i eBPF-delsystemet, som låter dig köra hanterare inuti Linux-kärnan i en speciell virtuell maskin med JIT. Båda sårbarheterna gör det möjligt att exekvera din kod med kärnrättigheter, utanför en isolerad eBPF virtuell maskin. Information om problemen publicerades av Zero Day Initiative-teamet, som driver tävlingen Pwn2Own, under vilken det i år demonstrerades tre attacker på Ubuntu Linux som använde tidigare okända sårbarheter (om sårbarheterna i eBPF är relaterade till dessa attacker rapporteras inte) .

  • CVE-2021-3490 - Sårbarheten orsakas av en brist på 32-bitars kontroll utanför gränserna när man utför bitvisa OCH-, ELLER- och XOR-operationer i eBPF ALU32. En angripare kan dra fördel av detta fel för att läsa och skriva data utanför gränserna för den tilldelade bufferten. Problemet med XOR-operationer dyker upp med början från kärnversion 5.7-rc1, och AND och OR - från 5.10-rc1.
  • CVE-2021-3489 - Sårbarheten orsakas av ett fel i implementeringen av ringbufferten och beror på att funktionen bpf_ringbuf_reserve inte kontrollerade möjligheten att storleken på den allokerade minnesregionen kan vara mindre än den faktiska storleken av ringbuffen. Problemet har uppstått sedan release 5.8-rc1.

Statusen för korrigering av sårbarheter i distributioner kan spåras på dessa sidor: Ubuntu, Debian, RHEL, Fedora, SUSE, Arch). Fixar finns också som patchar (CVE-2021-3489, CVE-2021-3490). Huruvida problemet kan utnyttjas beror på om eBPF-systemanropet är tillgängligt för användaren. Till exempel, i standardkonfigurationen i RHEL, kräver exploatering av sårbarheten att användaren har CAP_SYS_ADMIN-rättigheter.

Separat kan vi notera en annan sårbarhet i Linux-kärnan - CVE-2021-32606, som tillåter en lokal användare att höja sina privilegier till rotnivån. Problemet har varit uppenbart sedan Linux-kärnan 5.11 och orsakas av ett racetillstånd i implementeringen av CAN ISOTP-protokollet, vilket gör det möjligt att ändra socketbindningsparametrarna på grund av bristen på att ställa in rätt lås i isotp_setsockopt()-funktionen vid bearbetning av CAN_ISOTP_SF_BROADCAST-flaggan.

Efter att ISOTP-socket har stängts förblir bindningen till mottagarsocket aktiv, som kan fortsätta att använda strukturerna som är associerade med sockeln efter att minnet som är kopplat till dem har frigjorts (use-after-free på grund av anropet till en isotp_sock-struktur som redan har frigjorts när isotp_rcv() anropas). Genom datamanipulation kan du åsidosätta pekaren till funktionen sk_error_report() och köra din kod på kärnnivå.

Källa: opennet.ru

Lägg en kommentar