У фоновому процесі slaacd, що відповідає в OpenBSD за автоконфігурацію адрес IPv6 (IPv6 Stateless Address Autoconfiguration, RFC 4862), виявлена вразливість, що призводить до переповнення буфера при отриманні спеціально оформленого анонсу маршрутизатора IPv6 (RA, Router Advertise).
Спочатку функціональність автоналаштування адрес 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