
CVE-2022-23093 Стековое переполнение FreeBSD
⚠️ Используемый по умолчанию шелл-код — FreeBSD/x86-64 - execve - 28 байт от Gitsnik; измените его и вставьте свой для запуска ⚠️
Утилита ping, используемая для запроса ICMP ECHO_RESPONSE от хоста или шлюза, вызывается с IPv4-целью, будь то IPv4-хост или IPv4-многоадресная группа, через обязательную дейтаграмму ECHO_REQUEST протокола ICMP. Дейтаграмма ECHO_REQUEST состоит из IP- и ICMP-заголовков, за которыми следуют «struct timeval» и переменное количество байтов «pad» для заполнения пакета.
Согласно уведомлению безопасности проекта FreeBSD, утилита ping извлекает необработанные IP-пакеты из сети для обработки ответов в функции pr_pack(). При обработке ответа ping восстанавливает IP-заголовок, ICMP-заголовок и, если присутствует, «цитируемый пакет» (quoted packet), представляющий пакет, вызвавший ошибку ICMP. Цитируемый пакет также включает IP-заголовок и ICMP-заголовок.
Функция pr_pack() копирует полученные IP- и ICMP-заголовки в буферы стека для дальнейшей обработки. Однако она не учитывает возможность наличия заголовков IP-опций, следующих после IP-заголовка как в ответе, так и в цитируемом пакете. При наличии IP-опций pr_pack() переполняет буфер назначения на величину до 40 байт.
Утилита ping работает в пространстве пользователя, и при вызове команды ping выполняется бинарный файл, расположенный по пути /sbin/ping. Исходный код утилиты общедоступен в исходниках FreeBSD. Уязвимая функция pr_pack() выводит информацию об ответе ICMP-пакета в стандартный вывод в строковом формате, например: «64 bytes from 1.3.3.7: icmp_seq=1 ttl=55 time=13.7 ms».
✔️ ICMP-пакет, как в запросе, так и в ответе, состоит из IP-заголовков с опциональным полем Options, как показано на диаграмме выше. При злонамеренной атаке эти IP-опции включаются и заполняются ненулевыми байтами. ✔️
Если ICMP-пакет поврежден или намеренно подделан на пути к хосту назначения, и IP-опции включены в исходном эхо-запросе, функция pr_pack() не выделяет достаточно места в стеке для размещения IP-опций, что приводит к переполнению стека.
🤝 В этих случаях ошибки ответ от хоста назначения также может включать «цитируемый пакет» в разделе данных, идентифицирующий конкретный пакет, вызвавший ошибку ICMP. Функция pr_pack() переполняет стек, когда цитируемый пакет содержит ICMP-заголовки. 🤝