<?xml version='1.0' encoding='UTF-8'?>
<?xml-stylesheet href="/static/style.xsl" type="text/xsl"?>
<rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/" version="2.0">
  <channel>
    <title>Most recent entries from all</title>
    <link>https://db.gcve.eu</link>
    <description>Contains only the most 10 recent entries.</description>
    <docs>http://www.rssboard.org/rss-specification</docs>
    <generator>python-feedgen</generator>
    <language>en</language>
    <lastBuildDate>Tue, 29 Sep 2026 07:25:40 +0000</lastBuildDate>
    <item>
      <title>CVE-2026-67425 — Flyto2 Core: LLM/API keys leak to an attacker-controlled base_url</title>
      <link>https://db.gcve.eu/vuln/cve-2026-67425</link>
      <description>&lt;p&gt;&lt;strong&gt;Affected:&lt;/strong&gt; flytohub flyto-core&lt;/p&gt;
&lt;p&gt;Flyto2 Core is an execution kernel for automation and AI-agent workflows. Prior to 2.26.6, llm.chat reads provider keys such as OPENAI_API_KEY and ANTHROPIC_API_KEY from the environment and sends them in the Authorization: Bearer header to caller-controlled base_url, allowing an attacker to receive the operator&amp;#39;s key on a public host that passes the SSRF guard. This issue is fixed in version 2.26.6.&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;&lt;strong&gt;Affected:&lt;/strong&gt; flytohub flyto-core&lt;/p&gt;
&lt;p&gt;Flyto2 Core is an execution kernel for automation and AI-agent workflows. Prior to 2.26.6, llm.chat reads provider keys such as OPENAI_API_KEY and ANTHROPIC_API_KEY from the environment and sends them in the Authorization: Bearer header to caller-controlled base_url, allowing an attacker to receive the operator&amp;#39;s key on a public host that passes the SSRF guard. This issue is fixed in version 2.26.6.&lt;/p&gt;</content:encoded>
      <guid isPermaLink="false">https://db.gcve.eu/vuln/cve-2026-67425</guid>
    </item>
    <item>
      <title>GHSA-qq9q-xgm3-xv9g — Flyto2 Core: LLM/API keys leak to an attacker-controlled base_url</title>
      <link>https://db.gcve.eu/vuln/ghsa-qq9q-xgm3-xv9g</link>
      <description>&lt;p&gt;&lt;strong&gt;Affected:&lt;/strong&gt; PyPI: flyto-core&lt;/p&gt;
&lt;p&gt;## Summary&lt;/p&gt;
&lt;p&gt;`llm.chat` reads the operator&amp;#39;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&amp;#39;s server hands them the operator&amp;#39;s key. flyto-core&amp;#39;s own bounty scale rates &amp;#34;environment access exposing secrets (e.g. `ANTHROPIC_API_KEY`)&amp;#34; as High.&lt;/p&gt;
&lt;p&gt;## Affected code&lt;/p&gt;
&lt;p&gt;`src/core/modules/atomic/llm/chat.py` (`_call_openai`):&lt;/p&gt;
&lt;p&gt;```python
base_url = params.get(&amp;#39;base_url&amp;#39;)            # 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(&amp;#39;OPENAI_API_KEY&amp;#39;)     # operator&amp;#39;s key
...
url = (base_url or &amp;#34;https://api.openai.com/v1&amp;#34;).rstrip(&amp;#39;/&amp;#39;) + &amp;#34;/chat/completions&amp;#34;
headers = {&amp;#34;Authorization&amp;#34;: f&amp;#34;Bearer {api_key}&amp;#34;}
await client.post(url, headers=headers, json=payload)   # sent to base_url
```&lt;/p&gt;
&lt;p&gt;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&amp;#39;s public host.&lt;/p&gt;
&lt;p&gt;## Reproduction&lt;/p&gt;
&lt;p&gt;Save as `keyexfil_poc.py`, run with `PYTHONPATH=src/src python keyexfil_poc.py`. It sets an operator…&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;&lt;strong&gt;Affected:&lt;/strong&gt; PyPI: flyto-core&lt;/p&gt;
&lt;p&gt;## Summary&lt;/p&gt;
&lt;p&gt;`llm.chat` reads the operator&amp;#39;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&amp;#39;s server hands them the operator&amp;#39;s key. flyto-core&amp;#39;s own bounty scale rates &amp;#34;environment access exposing secrets (e.g. `ANTHROPIC_API_KEY`)&amp;#34; as High.&lt;/p&gt;
&lt;p&gt;## Affected code&lt;/p&gt;
&lt;p&gt;`src/core/modules/atomic/llm/chat.py` (`_call_openai`):&lt;/p&gt;
&lt;p&gt;```python
base_url = params.get(&amp;#39;base_url&amp;#39;)            # 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(&amp;#39;OPENAI_API_KEY&amp;#39;)     # operator&amp;#39;s key
...
url = (base_url or &amp;#34;https://api.openai.com/v1&amp;#34;).rstrip(&amp;#39;/&amp;#39;) + &amp;#34;/chat/completions&amp;#34;
headers = {&amp;#34;Authorization&amp;#34;: f&amp;#34;Bearer {api_key}&amp;#34;}
await client.post(url, headers=headers, json=payload)   # sent to base_url
```&lt;/p&gt;
&lt;p&gt;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&amp;#39;s public host.&lt;/p&gt;
&lt;p&gt;## Reproduction&lt;/p&gt;
&lt;p&gt;Save as `keyexfil_poc.py`, run with `PYTHONPATH=src/src python keyexfil_poc.py`. It sets an operator…&lt;/p&gt;</content:encoded>
      <guid isPermaLink="false">https://db.gcve.eu/vuln/ghsa-qq9q-xgm3-xv9g</guid>
    </item>
  </channel>
</rss>
