В фоновом процессе slaacd, отвечающем в OpenBSD за автоконфигурацию адресов IPv6 (IPv6 Stateless Address Autoconfiguration, RFC 4862), выявлена уязвимость, приводящая к переполнению буфера при получении специально оформленного анонса маршрутизатора IPv6 (RA, Router Advertisement).
Изначально функциональность автонастройки адресов IPv6 была реализована на уровне ядра, но начиная с OpenBSD 6.2 была вынесена в отдельный непривилегированный процесс slaacd. Указанный процесс отвечает за отправку сообщений RS (Router Solicitation) и разбора ответов RA (Router Advertisement) с информацией о маршрутизаторе и параметрах сетевого подключения.
В феврале в slaacd была исправлена ошибка, приводящая к аварийному завершению в случае указания 7 серверов в списке RDNSS (Recursive DNS Servers). Подобная оплошность привлекла внимание независимых исследователей, которые попытались изучить код slaacd на предмет других ошибок, возникающих при разборе полей в сообщениях RA. Анализ показал, что в коде имеется ещё одна проблема, проявляющаяся при обработке поля DNSSL (DNS Search List), включающего списков доменных имён и шаблонов хостов для DNS.
Каждое имя в списке DNSSL кодируется с использованием разделителя с нулевым кодом и промежуточных однобайтовых меток, определяющих размер следом идущих данных. Уязвимость вызвана тем, что в коде разбора списка поле с размером копируется в переменную со знаковым типом integer (“len = data[pos]”). Соответственно, в случае указания в поле значения с выставленным старшим битом, это значение будет воспринято в условном операторе как отрицательное число и проверка на максимальный допустимый размер (“if (len > 63 || len + pos + 1 > datalen) {“) не сработает, что приведёт к выполнению вызова memcpy с параметром, размер копируемых данных при котором превышает размер буфера.
![](https://www.opennet.ru/opennews/pics_base/0_1648211205.png)
![](https://www.opennet.ru/opennews/pics_base/0_1648211175.png)