В системе мониторинга сетевых устройств LibreNMS обнаружены две уязвимости, затрагивающие все версии до 26.8.0 включительно. Одна из них позволяет неавторизованному атакующему обойти проверку API-токенов и получить доступ к данным и административным функциям, вплоть до выполнения кода на сервере. Вторая связана с недостаточной фильтрацией параметров при построении графиков и дает возможность авторизованному пользователю прочитать файлы данных других устройств, а в некоторых случаях и изменить их. Обе проблемы закрыты в версии 26.8.0, которую разработчики выпустили после получения отчетов об уязвимостях.
Детали уязвимостей
Первая и наиболее серьезная проблема связана с механизмом аутентификации в REST API. LibreNMS защищает все запросы к API проверкой токена - длинной строки из случайных символов, которая хранится в базе данных. Токен передается в заголовке запроса или в теле сообщения, и система сравнивает его с сохраненными значениями. Ошибка возникает из-за того, что тип данных, переданных в запросе, не проверяется. Если отправить в качестве токена число, а не строку, база данных при сравнении преобразует все текстовые значения в числа. Значительная часть реальных токенов при таком преобразовании сводится к небольшим числам вроде нуля или девятки, потому что их первые символы являются буквами или цифрами, которые MySQL интерпретирует как начало числа. Атакующему достаточно перебрать числа от нуля до нескольких сотен, чтобы найти совпадение с действующим токеном. При этом на API не установлено ограничение на количество запросов, поэтому перебор занимает секунды.
Если угаданный токен принадлежит администратору, злоумышленник получает полный доступ ко всем функциям LibreNMS. В частности, через API можно создавать шаблоны оповещений, которые поддерживают выполнение произвольного кода на сервере. Это штатная возможность, предназначенная для администраторов, но при обходе аутентификации она превращается в готовый вектор атаки. Таким образом, без каких-либо учетных данных можно выполнить команды операционной системы на сервере мониторинга. Для атаки достаточно, чтобы в системе существовал хотя бы один включенный API-токен, что является стандартной практикой при настройке интеграций.
Вторая уязвимость затрагивает функцию построения графиков. Когда пользователь запрашивает график, значение параметра, задающего заголовок, передается в утилиту rrdtool, которая формирует изображение. Разработчики пытались предотвратить инъекцию, удаляя из заголовка одинарные кавычки, однако двойные кавычки оставались без обработки. Именно двойные кавычки используются для обрамления аргументов при передаче данных в rrdtool через стандартный ввод. Внедрив в заголовок двойную кавычку и дополнительные аргументы, можно заставить rrdtool прочитать файл данных любого устройства, даже если у пользователя нет прав на это устройство. Более того, через URL-кодированный символ перевода строки в заголовок можно добавить целые команды rrdtool, например, для извлечения данных или их изменения. Это позволяет не только просматривать чужие графики, но и подделывать показатели мониторинга, что может скрыть реальную проблему в сети или создать ложную тревогу.
Обе уязвимости не имеют присвоенных идентификаторов CVE, однако информация о них опубликована в виде бюллетеней безопасности на GitHub. Разработчики уже выпустили исправление в версии 26.8.0. Пользователям рекомендуется как можно скорее обновить LibreNMS, особенно если система доступна из интернета или в ней работают пользователи с ограниченными правами. До установки обновления стоит отключить неиспользуемые API-токены и ограничить доступ к интерфейсу построения графиков.
Системы мониторинга все чаще становятся целью атак, поскольку содержат детальную информацию об инфраструктуре, а иногда и учетные данные для доступа к оборудованию. Обнаруженные проблемы показывают, насколько важно уделять внимание не только функциональности, но и корректной обработке пользовательского ввода. Даже незначительная на первый взгляд ошибка фильтрации может привести к полной компрометации сервера, если она сочетается с недостатками аутентификации.
Ссылки
- https://github.com/librenms/librenms/security/advisories/GHSA-cvq8-gqfq-3mvg
- https://github.com/librenms/librenms/security/advisories/GHSA-3hvv-wxpw-cx83