Експлойт за локална ескалация на привилегиите, публикуван днес, осигурява достъп с права на root в OpenBSD 7.9 чрез навързване във верига на приблизително 37-годишно препълване на целочислени стойности (integer overflow) с отделен дефект в ядрото. Това позволява заобикаляне на рандомизацията на адресните пространства на ядрото в OpenBSD (KARL), както и на хардуерните защити SMAP и SMEP.
Компанията за сигурност Calif, която откри и докладва уязвимостите, публикува подробен технически анализ и пълен код за демонстрация на концепцията (proof-of-concept), след като през септември OpenBSD пусна корекции за сигурност за двата проблема.
Целочисленото препълване във функцията за свързване shmat(4) беше отстранено в errata 018, издадена на 14 септември като корекция за надеждност. Грешката от тип use-after-free при броенето на референциите, която завършва веригата, беше коригирана отделно в errata 026, издадена на 30 септември като корекция за сигурност.
И двете обновявания са налични чрез syspatch и покриват всички архитектури. OpenBSD 7.8 също получи коригиране на целочисленото препълване. Самото целочислено препълване, което е входната точка за цялата верига, е класифицирано като подобрение на надеждността, а не като корекция за сигурност.
Към момента на публикацията няма присвоен CVE идентификатор за нито една от уязвимостите. Няма данни дефектите да са били използвани при атаки.
Броячът за прикачване на споделена памет shm_nattch е дефиниран като 16-битов short със знак с максимална стойност 32 767 в оригиналния изходен код на BSD от 1988 г. OpenBSD е наследила този тип и никога не го е разширявала.
Експлойтът мапира 127 сегмента на споделена памет и разклонява 259 процеса, превишавайки максимума на брояча и превъртайки го до −32 643. Условие за конкурентност (race condition) след това задейства use-after-free: компрометираният брой референции кара ядрото да освободи памет, която други процеси все още използват.
Отделно записване извън границите на буфера презаписва броячите за членство в мултикаст групи в ядрото. Когато засегнатият сокет се затвори, произтичащите декрементирания модифицират записите в таблицата със страници, превключвайки разпределението на потребителската памет до такова, достъпно от супервайзър, заобикаляйки SMAP и SMEP. След това експлойтът презаписва указател към функция на предвидим адрес в ядрото, за да изпълни собствен злонамерен код.
„Докато KARL в OpenBSD свързва повторно двоичния файл на ядрото, за да рандомизира адресите на функциите и данните, механизмите за заделяне на памет в ядрото остават детерминирани“, написа изследователят Андрю Грифитс. Както модулът за заделяне на памет по време на зареждане, така и този от тип best-fit нямат рандомизация на базовия адрес, така че структурите от ранния етап на зареждане, включително указателите към функции в манипулаторите на мрежовите интерфейси lo0 и enc0, попадат на едни и същи адреси при рестартиране на един и същ хардуер. За целта на атаката не се изисква уязвимост за разкриване на информация.
Освен двете корекции, Calif предлага четири категории за засилване на защитата: безопасно разкачване (safe-unlinking) за свързани списъци в ядрото (вече използвано във FreeBSD и NetBSD), рандомизация на самореферентните съпоставяния в таблицата със страници, рандомизация на модула за заделяне на памет в ядрото и проверка на границите на ниво компилатор.
От Calif заявиха, че са докладвали уязвимостите на OpenBSD „по-рано тази година“. Кодът за демонстрация на концепцията е достъпен в GitHub.