Kwetsbaarheid in de Linux-kernel die het netwerkprotocol CAN BCM betreft

Er is een kwetsbaarheid in de Linux-kernel vastgesteld (CVE-2021-3609) waarmee een lokale gebruiker zijn privileges in het systeem kan verhogen. Het probleem is veroorzaakt door een raceconditie in de implementatie van het CAN BCM-protocol en komt voor in versies van de Linux-kernel van 2.6.25 tot 5.13-rc6. In de distributies is het probleem tot nu toe niet verholpen (RHEL, Fedora, Debian, Ubuntu, SUSE, Arch).

De onderzoeker die de kwetsbaarheid ontdekte, kon een exploit opstellen om root-rechten te verkrijgen op systemen met Linux-kernels 5.4 en nieuwer, inclusief de mogelijkheid van een succesvolle aanval op Ubuntu 20.04.02 LTS. Het is mogelijk dat de exploit ook kan worden aangepast om met oudere kernels te werken (in kernel 5.4 is de CAN BCM-code (net/can/bcm.c) aangepast van hrtimer_tasklet naar HRTIMER_MODE_SOFT).

Het CAN BCM-protocol maakt het mogelijk om een eigen berichtverwerker te registreren die berichten ontvangt via de CAN-bus (controller area network) en deze aan een specifieke netwerksocket te koppelen. Wanneer een inkomend bericht arriveert, wordt de functie bcm_rx_handler() aangeroepen. De aanvaller kan profiteren van de raceconditie en de netwerksocket tegelijkertijd sluiten met de uitvoering van bcm_rx_handler(). Bij het sluiten van de socket wordt de functie bcm_release() aangeroepen, waarin het geheugen dat is toegewezen voor de structuren bcm_op en bcm_sock wordt vrijgegeven, terwijl deze nog worden gebruikt in de uitvoerende bcm_rx_handler(). Dit leidt tot een situatie waarin wordt verwezen naar een al vrijgegeven geheugenblok (use-after-free).

De aanval bestaat uit het openen van twee CAN BCM-sockets en het koppelen ervan aan de interface vcan. In de eerste socket wordt de functie sendmsg() aangeroepen met de vlag RX_SETUP om de verwerker voor inkomende CAN-berichten in te stellen, en in de tweede socket wordt sendmsg() aangeroepen om een bericht naar de eerste socket te verzenden. Na ontvangst van het bericht wordt bcm_rx_handler() aangeroepen, en de aanvaller kiest het juiste moment om de eerste socket te sluiten, wat leidt tot het aanroepen van bcm_release() en het vrijgeven van de structuren bcm_op en bcm_sock, hoewel de uitvoer van bcm_rx_handler() nog niet is voltooid.

Door manipulaties met de inhoud van bcm_sock kan een aanvaller de aanwijzer naar de functie sk->sk_data_ready(sk) overschrijven, de uitvoering omleiden en door gebruik te maken van technieken voor Return-Oriented Programming (ROP) de parameter modprobe_path herschrijven om zijn code met root-rechten uit te voeren. Bij het gebruik van ROP probeert de aanvaller zijn code niet in het geheugen te plaatsen, maar gebruikt hij al bestaande stukjes machine-instructies in geladen bibliotheken die eindigen met een return-instructie (meestal het einde van bibliotheekfuncties). Het doel van de exploit is het bouwen van een keten van aanroepen van dergelijke blokken (ā€œgadgetsā€) om de gewenste functionaliteit te verkrijgen.

Kwetsbaarheid in de Linux-kernel die het netwerkprotocol CAN BCM betreft

Voor de aanval is toegang nodig om CAN-sockets te creƫren en een geconfigureerde netwerinterfaces vcan. De benodigde bevoegdheden om de aanval uit te voeren kunnen door een niet-bevoorrechte gebruiker worden verkregen in containers die zijn gemaakt in systemen met ingeschakelde ondersteuning voor gebruikersnamespaces (user namespaces). Gebruikersnamespaces zijn standaard ingeschakeld in Ubuntu en Fedora, maar niet geactiveerd in Debian en RHEL.

Bron: opennet.ru

Koop betrouwbare webhosting met bescherming tegen DDoS, VPS VDS servers šŸ”„ Koop betrouwbare webhosting met bescherming tegen DDoS, VPS VDS servers | ProHoster