Выдаленая ўразлівасць у IPv6-стэку OpenBSD

У фонавым працэсе 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 з параметрам, памер якія капіююцца дадзеных пры якім перавышае памер буфера.

Выдаленая ўразлівасць у IPv6-стэку OpenBSD
Выдаленая ўразлівасць у IPv6-стэку OpenBSD


Крыніца: opennet.ru

Дадаць каментар