Критична уязвимост в реализацията на функцията memcpy за ARMv7

0
345

Експертите на Cisco публикуваха подробностите относно новата уязвимост, класифицирана като CVE-2020-6096. Уязвимостта съществува в реализацията на наличната в Glibc функция memcpy() за 32-битовата платформа ARMv7. Проблемът е в некоректната обработка на отрицателните значения на параметъра, определящ максималния размер на областта за копиране, и е възникнал заради използваните асемблерни оптимизации на алгоритъма за работа с 32-битови цели числа със знак. Извикването на функцията memcpy() в системи с ARMv7 процесорна архитектура със зададени отрицателни значения води до некоректно сравняване на значението и запис на данни извън границите на зададения буфер.

Уязвимостта може да бъде използвана за изпълнение на произволен код в ситуации, когато атакуващият може да организира формирането на отрицателно значение за променливата, чрез която се определя размера на данните за копиране (например, като се зададе да бъде копиран блок от нас 4 GB данни). Функцията memcpy() активно се използва в на практика всички приложения, а ARMv7 процесорите масово се използват в автомобилните системи, в промишлените, потребителските, комуникационните и вградените устройства, и в още много други места. Тази техника лесно може да стане обект на атаки с използването на Bluetooth, HD Radio/DAB, USB, CAN bus, Wi-Fi и други външни източници на данни.

Експертите дадоха като пример създаването на работещ експлойт за атака на вградения в автомобилните информационни системи http сървър, който е достъпен чрез автомобилната Wi-Fi мрежа. Външен хакер може да използва уязвимостта в memcpy в тази сървър чрез подаването на GET запитване с много голям размер и по този начин да получи root достъп до системата.

Корекцията на тази уязвимост засега се предлага във вид на пач, който е включен в августовското обновяване на Glibc 2.32. Промяната се свежда само до замяната на използваните асемблерни инструкции bge и blt работещи със знакови операнди, на беззнаковите lo и bhs.

Засега проблемът не е отстранен в Debian 9 и 10 (в Debian 8 той не се проявява), Fedora, Ubuntu, OpenEmbedded, Tizen (тук се използва memcpy(). Проблемът не засяга RHEL и SUSE, понеже те не поддържат 32-битовите ARMv7 компютърни системи. Android не е уязвим към CVE-2020-6096, понеже използва собствена реализация на libc (Bionic), в която се използват по-различни алгоритми. В OpenWRT по подразбиране в повечето компилации се използва Musl, но в хранилищата се предлага и glibc.

В 32-битовите x86 системи проблемът не се проявява, понеже реализацията на memcpy за тази процесорна архитектура коректно интерпретира променливата с голям размер като беззнаково цяло число от типа size_t (в реализацията за архитектурата ARMv7 вместо като size_t, това число се обработва като signed integer).

0 0 глас
Оценете статията
Абонирай се
Извести ме за
guest
0 Коментара
Отзиви
Всички коментари