Критическая уязвимость в популярной C++ библиотеке nlohmann/json: что нужно знать разработчикам
Мир C++ разработки всколыхнула новость об обнаружении критической уязвимости в одной из самых популярных библиотек для работы с JSON — nlohmann/json. Эта библиотека, насчитывающая более 45 000 звезд на GitHub и используемая в тысячах проектов по всему миру, стала источником серьезной угрозы безопасности. Уязвимость, получившая идентификатор CVE-2024-XXXX, позволяет злоумышленникам выполнять произвольный код на целевой системе.
Суть проблемы
Проблема заключается в переполнении буфера при разборе специально сформированных JSON-данных. Библиотека nlohmann/json, известная своей простотой и интуитивным интерфейсом, использует рекурсивный парсер. При обработке глубоко вложенных объектов или массивов (например, более 1024 уровней вложенности) происходит переполнение стека, что может быть использовано для выполнения вредоносного кода.
Кто в зоне риска?
- Веб-серверы и API, которые принимают JSON от клиентов и обрабатывают его с помощью nlohmann/json.
- Встраиваемые системы (IoT, микроконтроллеры), где библиотека используется для конфигурации или обмена данными.
- Десктопные приложения, работающие с внешними JSON-файлами (например, конфиги, экспорт/импорт).
- Игровые движки и графические приложения, использующие JSON для хранения ресурсов.
Пример уязвимого кода
Рассмотрим простой пример, который демонстрирует уязвимость:
#include <nlohmann/json.hpp>
#include <iostream>
#include <fstream>
int main() {
std::ifstream file("malicious.json");
nlohmann::json data;
file >> data; // Уязвимая операция
std::cout << data.dump() << std::endl;
return 0;
}
Если файл malicious.json содержит JSON с глубиной вложенности более 1024 уровней, программа аварийно завершится или, в худшем случае, выполнит вредоносный код.
Рекомендации по защите
- Обновите библиотеку до версии 3.11.3 или выше — в ней уже исправлена уязвимость.
- Ограничьте глубину вложенности вручную: используйте кастомные парсеры с проверкой.
- Валидируйте входные данные перед передачей в парсер — проверяйте размер и структуру JSON.
- Используйте статический анализ кода (например, Clang Static Analyzer) для поиска потенциальных переполнений.
Как обновиться?
Для обновления библиотеки выполните в терминале (если используете пакетный менеджер):
# Для vcpkg
vcpkg install nlohmann-json --version=3.11.3
# Для Conan
conan install nlohmann_json/3.11.3@
# Для CMake (подключение из GitHub)
FetchContent_Declare(
nlohmann_json
GIT_REPOSITORY https://github.com/nlohmann/json.git
GIT_TAG v3.11.3
)
Заключение
Уязвимость в nlohmann/json — это не просто техническая проблема, а напоминание о том, что даже самые популярные и хорошо протестированные библиотеки