O vulnerabilitate în nucleul Linux afectează protocolul de rețea CAN BCM

O vulnerabilitate a fost descoperită în nucleul Linux (CVE-2021-3609) care permite unui utilizator local să-și crească privilegiile în sistem. Problema este cauzată de o stare de competiție în implementarea protocolului CAN BCM și se manifestă în versiunile nucleului Linux de la 2.6.25 până la 5.13-rc6. În distribuțiile actuale, problema rămâne nerezolvată (RHEL, Fedora, Debian, Ubuntu, SUSE, Arch).

Cercetătorul care a identificat vulnerabilitatea a reușit să dezvolte un exploit pentru a obține drepturi root pe sistemele cu nucleele Linux 5.4 și mai recente, demonstrând inclusiv posibilitatea de a efectua un atac reușit în Ubuntu 20.04.02 LTS. Există posibilitatea adaptării exploit-ului și pentru a funcționa cu nuclee mai vechi (în nucleul 5.4, codul CAN BCM (net/can/bcm.c) a fost transformat din hrtimer_tasklet în HRTIMER_MODE_SOFT).

Protocolul CAN BCM permite înregistrarea propriului handler de mesaje care sosesc prin rețeaua CAN (controller area network) și asocierea acestuia cu un socket de rețea specific. La primirea unui mesaj de intrare, se apelează funcția bcm_rx_handler(). Atacatorul poate profita de starea de competiție și poate provoca închiderea socket-ului de rețea în același timp cu execuția bcm_rx_handler(). La închiderea socket-ului, se apelează funcția bcm_release(), în care se eliberează memoria alocată pentru structurile bcm_op și bcm_sock, care continuă să fie utilizate în handlerul bcm_rx_handler() încă în execuție. Aceasta duce la o situație în care se face referire la un bloc de memorie deja eliberat (use-after-free).

Atacul constă în deschiderea a două socket-uri CAN BCM și legarea acestora la interfața vcan. În primul socket, se execută apelul sendmsg() cu flag-ul RX_SETUP pentru a seta handlerul pentru mesajele CAN, iar în cel de-al doilea socket se face apelul sendmsg() pentru a trimite un mesaj în primul socket. După primirea mesajului, se declanșează apelul bcm_rx_handler(), iar atacatorul alege momentul potrivit pentru a închide primul socket, ceea ce duce la activarea bcm_release() și eliberarea structurilor bcm_op și bcm_sock, deși execuția bcm_rx_handler() nu s-a încheiat încă.

Prin intermediul manipulării conținutului bcm_sock, atacatorul poate suprascrie pointerul către funcția sk->sk_data_ready(sk), redirecționând execuția și folosind tehnici de programare orientată pe returnare (ROP — Return-Oriented Programming) pentru a re-scrie parametrul modprobe_path și a obține execuția codului său cu drepturi root. Utilizând tehnica ROP, atacatorul nu încearcă să plaseze codul său în memorie, ci lucrează cu bucăți existente de instrucțiuni de mașină în biblioteci încărcate, care se termină cu instrucțiunea de returnare a controlului (de obicei, acestea sunt capetele funcțiilor de bibliotecă). Funcționarea exploit-ului se reduce la construirea unei secvențe de apeluri către aceste blocuri asemănătoare „gadget-urilor” pentru a obține funcționalitatea dorită.

O vulnerabilitate în nucleul Linux afectează protocolul de rețea CAN BCM

Pentru atac, este necesar accesul pentru a crea socket-uri CAN și un interfesă de rețea vcan configurată. Autorizațiile necesare pentru efectuarea atacului pot fi obținute de un utilizator fără privilegii în containere create în sisteme cu suport activat pentru spații de nume ale identificatorilor de utilizatori (user namespaces). De exemplu, user namespaces este activat implicit în Ubuntu și Fedora, dar nu este activat în Debian și RHEL.

Sursa: opennet.ro

Cumpără un hosting fiabil pentru site-uri cu protecție DDoS, servere VPS VDS 🔥 Cumpără un hosting fiabil pentru site-uri cu protecție DDoS, servere VPS VDS | ProHoster