Изследователи по безопасността от компания Cisco детайли () в реализация на предоставяната в Glibc функция memcpy() за 32-битова платформа ARMv7. Проблемата е предизвикана от неправилната обработка на отрицателни стойности на параметъра, определящ размера на копираната област, поради използването на асемблерни оптимизации, манипулиращи със знакови 32-битови цели числа. Извикването на memcpy() на системи ARMv7 с отрицателен размер води до неправилно сравнение на стойности и записи извън границите на указанния буфер.
Уязвимостта може да бъде експлоатирана за изпълнение на код в ситуация, при която атакуващият може да организира формирането на отрицателна стойност на променливата, през която се предава размерът на копираните данни (например, отрицателна стойност ще се получи при предаване на повече от 2 ГБ данни, но в процеса на атака е необходимо да се предаде поне 4 ГБ извън границите на буфера). Функцията memcpy() активно се използва в приложения, а процесорите ARMv7 са разпространени в автомобилни системи, мобилни, индустриални, потребителски, комуникационни и вградени устройства, които потенциално могат да станат обекти на атаки с използване на Bluetooth, HD Radio/DAB, USB, CAN bus, Wi-Fi и други външни източници на данни (например, могат да бъдат атакувани достъпните по мрежата услуги и приложения, които приемат входни данни без ограничение на размера).
Като пример се дава създаването на работещ експлоит за атака на вграден в автомобилните информационни системи http-сървър, достъпен през автомобилната Wi-Fi мрежа. Външен атакуващ може да експлоатира уязвимостта в memcpy в този сървър чрез предаване на GET-заявка с много голям размер и да получи root-достъп до системата.
На 32-битови системи x86 проблемът не се проявява, тъй като реализацията на memcpy за тази архитектура коректно интерпретира променливата с размер като беззнаково цяло число от тип size_t (в написаната на асемблер) за ARMv7 вместо size_t тя се обработва като знаково цяло число). Поправката в момента е налична като , който ще влезе в авготстовското обновление на Glibc 2.32.
Поправката се състои в замяната на използването на асемблерни инструкции, опериращи с знакови операнди (bge и blt), с беззнакови аналози (blo и bhs).
Проблемът все още не е отстранен в (в Debian 8 не се проявява), , , OpenEmbedded, Tizen (използва glibc). и проблемата не засяга, тъй като те не поддържат 32-битови системи ARMv7. Android не е уязвим, тъй като използва собствена реализация на libc (Bionic). В по подразбиране в повечето сборки се използва Musl, но в репозитория има и glibc.
Източник: opennet.ru
