Компания Google активно совершенствует безопасность C++ кода, устраняя уязвимости, связанные с пространственной безопасностью памяти. Такие уязвимости возникают, когда код обращается к данным за пределами выделенной памяти, что злоумышленники могут использовать для компрометации систем и кражи данных.
По данным проекта Google Project Zero, на пространственные уязвимости приходится 40% всех эксплойтов, обнаруженных “в дикой природе” за последние 10 лет. Чтобы повысить безопасность своих продуктов, Google внедряет методы безопасного программирования и использование языков с защитой памяти для нового кода. Однако, учитывая огромный объём уже существующего C++ кода, компании потребуются годы для полного перехода.
Для устранения этих проблем Google начала модификацию своих C++ кодов с использованием усовершенствованной библиотеки libc++. Это обновление включает проверку границ данных в стандартных структурах, таких как std::vector и std::optional, предотвращая обращения за пределы допустимой области памяти и доступ к неинициализированным данным.
Изначально проверка безопасности была введена в браузере Chrome в 2022 году, а сейчас её внедрение расширено на серверные системы Google. Это охватывает ключевые сервисы компании, включая Поиск, Почту, Карты и YouTube. Хотя небольшое число критически важных компонентов временно остаётся вне новой системы, Google уже вовсю работает над полным переходом.
Несмотря на ожидания о значительных задержках в производительности, проверка границ вызвала лишь 0,3% замедления в сервисах Google. Благодаря оптимизации компилятора и использованию методов профилирования, такой низкий показатель практически не влияет на опыт пользователей.
Переход к защищённой версии libc++ осуществлялся в три этапа: тестирование, адаптация и постепенный запуск на реальных системах. В результате были выявлены и устранены более тысячи багов, что снизило количество сбоев на 30%. Кроме того, проверка помогла предотвратить несколько внутренних атак и ускорила диагностику устаревших ошибок в коде.
В перспективе Google планирует расширить проверки на другие библиотеки и перейти на использование Safe Buffers для дальнейшего повышения безопасности. Это позволит упростить взаимодействие с языками, изначально поддерживающими защиту памяти, и ускорить автоматизированный перевод кода.