Calif демонстрира верига от ядрени уязвимости, заобикаляща KARL, SMAP и SMEP; кръпки вече са налични
Изследователят Андрю Грифитс от компанията Calif е демонстрирал работещ експлойт за OpenBSD, наречен Big Fish, който позволява на обикновен локален потребител да получи root права. За атаката е била нужна верига от няколко грешки в ядрото, а не само една стара уязвимост, съобщава Calif.
Грешка, наследена от ранните BSD системи
Отправната точка е броячът на връзките към споделената памет на System V. Разработчиците на старата BSD са задали за него 16-битов тип със знак, който допуска стойности само до 32 767. При превишаване на границата броячът става отрицателен, а грешката се е запазила в наследения код и е позволила нарушаване на отчитането на препратките към обектите в паметта.
В демонстрацията на Calif са създадени 127 сегмента от общата памет и са стартирани 259 дъщерни процеса. Така стойността на брояча е стигнала до минус 32 643. След това експлойтът се е възползвал от състояние на състезание между изтриването на сегмента и новото свързване към паметта, при което ядрото може да се обърне към вече освободен обект.
Втората стъпка: запис извън разпределената област
Едно препълване на брояча не е достатъчно за получаване на root права. Авторите свързват грешката при освобождаването на паметта с отделен запис извън разпределената област. Подмяната на данни в структурата на мрежовия сокет позволява да се повлияе на таблиците на паметните страници, да се променят правата за достъп до представянето и да се подготви изпълнение на код на ниво ядро.
Заобикаляне на защитите
Експлойтът е проработил дори при активирани механизми KARL, SMAP и SMEP, които затрудняват търсенето на адреси в ядрото и блокират опасния достъп до потребителската памет. Според Calif ограниченията са били заобиколени без допълнителна уязвимост за изтичане на адреси, като е помогнало предсказуемото разположение на някои обекти в ядрото.
Макар KARL да променя разположението на функциите и данните на ядрото, използваните от OpenBSD дистрибутори на паметта не винаги избират адресите случайно. След рестартиране на едно и също оборудване отделни структури се оказват на предсказуеми места. Експлойтът използва обработващите модули на мрежовите интерфейси lo0 и enc0, а след получаване на root права възстановява променения указател.
Кръпки преди публикуването
Разработчиците на OpenBSD са пуснали поправки още преди публикуването на Big Fish. Актуализация 018 от 14 септември отстранява грешката в shmat, а актуализация 026 от 30 септември решава проблема с брояча на препратките, който може да доведе до достъп до освободена памет. За OpenBSD 7.9 са налични кръпки чрез syspatch. Оценката по CVSS и версията на методологията за веригата не са публикувани.
Потвърдено и непотвърдено
Публикуваният код потвърждава възможността за локално повишаване на привилегии, но не свидетелства за реални атаки чрез Big Fish. За експлоатация е необходим достъп до изпълнение на програми на целевата машина. По-ранното издание на OpenBSD 7.9 вече беше съпроводено с дискусия относно друга уязвимост, съществувала в продължение на 27 години. Новата верига показва, че дори няколко нива на защита на ядрото не елиминират риска, дължащ се на стария код.