Введение: В этой статье мы рассмотрим серьезную уязвимость типа Server-Side Template Injection (SSTI), которая позволяет авторизованным пользователям выполнять произвольные команды на сервере. Уязвимость демонстрируется на примере популярного проекта RAGFlow и может быть реализована всего одной строкой кода.
О проекте RAGFlow
RAGFlow представляет собой открытый исходный код генеративный движок, который завоевал значительную популярность в сообществе. На платформе GitHub проект получил более 87 тысяч звезд и более 10 200 ветвлений репозитория. Основные преимущества продукта включают визуальный конструктор для создания рабочих процессов и продвинутую систему гибридного поиска. Движок объединяет три подхода: поиск на основе векторных представлений для определения семантического смысла, классический полнотекстовый поиск с использованием алгоритма BM25 и интеллектуальное переранжирование полученных результатов.
Понимание технологии RAG
RAG (генерация с расширенной выборкой информации) представляет собой инновационный метод создания текстовых ответов, при котором система находит релевантные факты и информацию во внешних хранилищах данных или документах, а затем передает эту информацию нейросети для формирования обоснованного ответа. Такой подход не только повышает точность и релевантность генерируемых ответов, но также значительно снижает вероятность возникновения галлюцинаций или появления ложной информации в результатах.
Описание уязвимости CVE-2026-28797
CVE-2026-28797 является критической уязвимостью типа SSTI, которая предоставляет любому аутентифицированному пользователю возможность выполнения произвольных команд непосредственно на сервере. По шкале оценки критичности CVSS 4.0 этой уязвимости присвоена оценка 8,7 балла, что указывает на высокий уровень риска. Согласно информации об уязвимости, подвержены атаке все версии RAGFlow, начиная с самых ранних и заканчивая версией 0.24.0 включительно.
Технический анализ уязвимости
В системе RAGFlow предусмотрена функция создания автоматизированных ИИ-агентов, которые могут включать различные процессоры данных. Среди доступных инструментов находится простой процессор для обработки текста, входящий в состав блока преобразования и манипуляции данными. Этот компонент поддерживает синтаксис шаблонов Jinja, однако реализованная система защиты от инъекций содержит уязвимость. Для успешной эксплуатации атакующему необходимо сконструировать специально подобранную последовательность объектов Python, которая позволит обойти защиту и получить доступ к полному выполнению команд на сервере.
Подготовка тестового стенда
Для демонстрации уязвимости необходимо развернуть тестовую окружение с уязвимой версией RAGFlow. Поскольку текущая стабильная версия — 0.26.4, требуется явное переключение на версию 0.24.0 с помощью системы контроля версий:
git clone https://github.com/infiniflow/ragflow.git
cd ragflow
git checkout v0.24.0
cd docker
Требования к ресурсам: Система требовательна к вычислительным ресурсам. Для пользователей Linux необходимо увеличить максимальное количество отображений памяти:
sudo sysctl -w vm.max_map_count=262144
Для пользователей Windows с WSL2: Отредактируйте конфигурационный файл %USERPROFILE%\.wslconfig и добавьте следующие параметры:
[wsl2]
memory=8GB
processors=4
swap=4GB
localhostForwarding=true
Эти настройки предотвратят сбои системы во время запуска. При недостаточных ресурсах сервер может запуститься, отобразить веб-интерфейс, но приведет к краху при попытке регистрации или входа пользователя.
Конфигурирование версии: В директории ragflow/docker найдите и отредактируйте файл .env. Убедитесь, что параметр RAGFLOW_IMAGE указывает на требуемую версию:
RAGFLOW_IMAGE=infiniflow/ragflow:v0.24.0
Запуск приложения: Выполните команду для сборки и развертывания контейнеров:
docker compose -f docker-compose.yml up -d
Первоначальный запуск может занять от нескольких минут до десяти минут. Docker развернет следующие сервисы: база данных MySQL, кэш Redis, хранилище объектов MinIO, поисковую систему Elasticsearch (или альтернативный модуль Infinity) и основной сервер приложения RAGFlow. Проверить готовность можно командой:
docker logs -f ragflow-server | grep 'Running on'
После появления URL в логах откройте браузер и перейдите по адресу http://localhost. Рекомендуется добавить локальный домен в файл hosts для избежания проблем при работе с инструментами тестирования безопасности.
Создание учетной записи: Для проведения тестирования требуется учетная запись пользователя. На тестовом сервере по умолчанию включена свободная регистрация (параметр REGISTER_ENABLED=1). Уровень прав пользователя не влияет на возможность эксплуатации уязвимости.
Практическое воспроизведение атаки
Процесс начинается с создания новой учетной записи. Можно указать произвольные учетные данные, так как система не отправляет письма подтверждения и не требует верификации электронной почты. После успешной регистрации выполните вход в систему через форму авторизации. Обратите внимание, что система не производит автоматический вход после регистрации.
