Разработчиците на проекта Chromium 912 опасни и критични уязвимости, открити в стабилните версии на Chrome от 2015 г. насам, и стигнаха до извода, че 70% от тях са причинени от небезопасна работа с паметта (грешки при обработката на указатели в код на C/C++). Половината от тези проблеми (36.1%) са причинени от заявки към буфера след освобождаването на свързаната с него памет (use-after-free).
При проектирането на Chromium първоначално , че в кода не е изключено появата на грешки, затова голямото внимание беше насочено към прилагането на sandbox-изолация за ограничаване на последствията от проявите на уязвимости. В момента възможностите за прилагането на тази технология достигнаха пределите на своите възможности и по-нататъшното разбиване на процеси е нецелесъобразно от гледна точка на потреблението на ресурси.
За поддържането на безопасността на кода Google също прилага „“, съгласно което всеки добавен код трябва да отговаря на не повече от две условия от трите: работа с непроверени входни данни, използване на небезопасен език за програмиране (C/C++) и изпълнение с повишени привилегии. От това правило следва, че кодът за обработка на външни данни трябва или да бъде намален до минимални привилегии (изолиран), или да бъде написан на безопасен език за програмиране.
За допълнително усилване на защитата на кодовата база е стартиран проект за предотвратяване появата на грешки в работата с паметта в кодовата база. Определят се три основни подхода: създаване на C++ библиотеки с функции за безопасна работа с паметта и разширяване на обхвата на прилагане на сборщика на боклука, прилагане на хардуерни механизми за защита (Memory Tagging Extension) и писане на компоненти на езици, осигуряващи безопасна работа с паметта (Java, Kotlin, JavaScript, Rust, Swift).
Очаква се работата да бъде фокусирана в две направления:
- Съществени изменения в процеса на разработка на C++, които не изключват негативно влияние върху производителността (допълнителни проверки на граници и сборка на боклука). Вместо raw-указатели се предлага използването в кода на тип , позволяващ да се сведат експлоатираните грешки от класа use-after-free до безвредни сривове, без осезаемо негативно влияние върху производителността, потреблението на памет и стабилността.
- Използването на езици, проектирани за извършване на проверки за безопасна работа с паметта по време на компилация (ще позволи да се изключи негативното влияние върху производителността, присъщо за такива проверки по време на изпълнение на кода, но ще доведе до допълнителни разходи за организиране на взаимодействието между кода на новия език и кода на C++).
Използването на библиотеки за безопасна работа с паметта е най-простият, но и по-малко ефективен начин. Преписването на кода на Rust се оценява като най-ефективния, но и много скъп подход.
Източник: opennet.ru
