В процеса на работа slaacd, отговорен за автоматичната конфигурация на IPv6 адреси в OpenBSD (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 с параметър, при който размерът на копираните данни надвишава размера на буфера.


Източник: opennet.ru
