vibe-trading-ai
"Vibe-Trading: Your Personal Trading Agent"
Activity
- Latest release
- 1w ago
- Total releases
- 19
- Cadence
- ~10 days
- Last 12 months
- 19
Reach
- Stars
- 36.7k
Details
- License
- MIT
- First release
- Mar 31, 2026
| Version | Released | |
|---|---|---|
0.1.18
patch
| ||
0.1.17
patch
| ||
0.1.16
patch
| ||
0.1.15
patch
| ||
0.1.14
patch
| ||
0.1.13
patch
| ||
0.1.12
patch
| ||
0.1.11
patch
| ||
0.1.10
patch
| ||
0.1.9
patch
| ||
0.1.8
patch
| ||
0.1.7
patch
| ||
0.1.6
patch
3 CVEs
CVE-2026-114108
GHSA-v2f8-6655-7grj
Oct 02, 2026
Vibe-Trading FastAPI endpoints permit unauthenticated access, file upload, and an RCE chain
10.0
/ 10
Critical
Network
Low
None
None
Changed
High
High
High
Summary:5 findings — unauthenticated full-API exposure (F1, lead Critical), read-side authorization gap that persists even with Shared baseline (applies to all 5 findings)The shipped The only operator action required beyond a clean install is supplying a working LLM API key so the agent loop can complete its tool-call round trip — this is the normal first step to make the agent functional, not an additional security opt-in. F-A4 and F-A5 do not require an LLM key (see per-finding notes); F1 and F3 do not require an LLM key for the unauth surface itself, only for the chained RCE demonstration in F1. Reproducer environment (common)
Finding 1 — Critical: Unauthenticated network client reaches shell execution via POST /sessions/{id}/messages
Affected files:
Intent vs actual: The session API is intended to serve authenticated users only. When Steps to observe:
Impact: An unauthenticated caller with TCP access to port 8899 can execute arbitrary shell commands as root inside the container. This is the top-severity entry point of the RCE chain. Combined with the absent Finding 2 — High: Read endpoints return full session history with no authentication, even when API_AUTH_KEY is set
Affected file:
Intent vs actual: When Steps to observe:
Impact: An unauthenticated caller can enumerate the full history of every agent session — including any broker tokens, LLM API keys, or trading account details the operator has pasted into prompts. The gap persists when the operator believes their write operations are protected, making it deceptive for operators who have followed the SECURITY.md spirit and turned auth on. Finding 3 — High: Unauthenticated POST /upload writes arbitrary .py/.sh/.yaml files to server filesystem with full path returned
Affected file:
Intent vs actual: Steps to observe (no LLM key required):
Impact: Any unauthenticated caller can write arbitrary Python scripts, shell scripts, or YAML configuration to a known, server-returned path. F3 is independent of any LLM API key — it is the cleanest unauth-write primitive in the codebase. The uploaded file is reachable from the LLM agent's tool envelope and chains into Group B / F8 (backtest exec_module premature exec) for a non-bash RCE path. Finding A4 — Medium: Default-permissive CORS allowlist + loopback-only check on /settings let any localhost-served browser page drive credentialed cross-origin requests
Affected file:
Intent vs actual: The CORS allowlist is intended to permit the bundled Vite/React frontend to make credentialed API calls during development. The intent is a development-convenience configuration. The actual configuration permits any local web page served from one of the six listed origins — which includes any other application, IDE preview pane, local web tool, or static HTML file served by another process listening on those ports — to issue credentialed cross-origin POSTs/GETs and read the responses in JavaScript. Because the loopback check at Steps to observe (no LLM key required):
Impact: Any malicious or compromised local web page on a whitelisted localhost port can silently drive the Vibe-Trading API in the operator's browser context — creating sessions, posting messages (which chain into F1's BashTool RCE), reading session histories (F2), and reading settings including the partial-key hint exposed by F-A5. Required user interaction is limited to the operator visiting a page that issues background Finding A5 — Medium: Settings endpoints expose first-4 + last-4 characters of every configured API key via _mask_secret()
Affected files:
Intent vs actual: The frontend needs to confirm to the operator that an API key is configured, so the appropriate hint is a boolean presence indicator or a fixed placeholder. The actual implementation reveals the first 4 and last 4 characters. For structured provider keys with predictable prefixes ( Steps to observe (no LLM key required other than the configured value being non-placeholder; the call itself does not consume the LLM):
Impact: Every functional deployment leaks structured bytes of the configured API keys. Combined with offline guessing against bounded-entropy provider keys (notably Tushare tokens), the partial reveal can narrow the attack space to a tractable bruteforce window. The leak is reachable from the F-A4 cross-origin browser path, so it does not require even loopback TCP access — only an operator who visits a malicious local web page in a browser running on the same host as the agent. Suggested remediation (per finding)
Affected versions
0.1.0
0.1.1
0.1.2
0.1.3
0.1.4
0.1.5
0.1.6
Fixed in
0.1.7
References Updated Oct 21, 2026 · Source: OSV.dev
CVE-2026-114106
GHSA-5rmq-chc7-m22f
Oct 02, 2026
Vibe-Trading file-read tools expose arbitrary server-readable files
7.5
/ 10
High
Network
Low
None
None
Unchanged
High
None
None
Summary:2 findings — Shared baseline (applies to both findings)The container has no The two file-read tools described here are members of the auto-discovered LLM tool registry.
Combined with GHSA-1 / F1, they are reachable from any anonymous TCP client to port 8899, but the same defects also apply to authenticated sessions and to prompt-injection in any document the agent processes.
See GHSA-1's shared reproducer block for the install steps; the same
Finding 9 — High: safe_user_path() accepts the entire user home directory and process CWD, allowing LLM tool calls to read /root credentials
Affected file:
Intent vs actual:
A runtime probe inside the container confirmed that Steps to observe:
Impact:
Any unauthenticated caller can instruct the LLM to attempt to parse any file under Finding 10 — High: read_document() opens any server-readable file with no sandbox enforcement, returning full content of /etc/shadow and /proc/self/environ
Affected file:
Intent vs actual:
This is strictly wider than F9: F9 is bounded to Steps to observe:
Impact:
An unauthenticated caller can retrieve any file the server process can read. Running as root, that includes Why F9 and F10 are listed separatelyA maintainer might be tempted to fix only one, on the theory that F10 dominates F9. Two reasons to fix both:
Suggested remediation
Affected versions
0.1.0
0.1.1
0.1.2
0.1.3
0.1.4
0.1.5
0.1.6
Fixed in
0.1.7
References Updated Oct 21, 2026 · Source: OSV.dev
CVE-2026-114107
GHSA-jqmf-mx4f-hfr6
Oct 02, 2026
Vibe-Trading LLM-callable tools permit command execution, code injection, and SSRF
10.0
/ 10
Critical
Network
Low
None
None
Changed
High
High
High
Summary:5 findings — Shared baseline (applies to all 5 findings)All five tools are members of the auto-discovered tool registry the LLM agent gets at startup; the LLM is free to call any of them based on the user prompt. The tool registration is unconditional in default config — no operator opt-in flag gates them. Combined with GHSA-1 / F1 (unauthenticated POST /sessions/{id}/messages), every primitive in this advisory is reachable from any anonymous TCP client to port 8899. The container has no The five primitives also share a second exposure: prompt-injection in any document the LLM agent processes. If the agent is asked to summarise an uploaded document containing the embedded instruction
Finding 6 — High: BashTool passes LLM-emitted command verbatim to subprocess.run(shell=True) with zero filtering
Affected file:
Intent vs actual: Steps to observe:
Impact: Finding 7 — High: BackgroundRunTool executes arbitrary shell commands asynchronously via subprocess.run(shell=True)
Affected file:
Intent vs actual: A runtime probe invoked the tool with Steps to observe:
Impact: Same as F6, with two additions: the asynchronous design makes the exfiltration harder to spot in access logs (the originating HTTP returns before the command completes), and Finding 8 — High: Backtest runner exec_modules attacker-stageable signal_engine.py before validation, executing top-level statements unconditionally
Affected file:
Intent vs actual: A runtime probe wrote Steps to observe:
Impact: This is an independent RCE path that does not match signatures for "shell command invocation" — endpoint or process monitoring tuned to flag Finding B4 — Medium: read_url tool forwards LLM-supplied URL to Jina Reader without schema or host validation, enabling SSRF via the agent session
Affected file:
Intent vs actual: Steps to observe:
Impact: An unauthenticated attacker can use the agent as an outbound proxy via Jina's infrastructure, fingerprinting reachable internal services through HTTP status / title / partial content leaked back through the session stream. The absence of schema validation also forwards Finding B5 — Low: Jinja2 codegen with autoescape disabled for .py.j2 templates allows code injection into generated signal_engine.py
Affected file:
Intent vs actual: The Jinja2 autoescape system is intended to prevent arbitrary string content from being rendered verbatim into generated source. The actual configuration restricts autoescape to Reachability: In normal session flows, Why I am including this finding rather than dropping it: if the team patches F8 by adding a stronger AST validator at line 115 (e.g. rejecting top-level non-import / non-class statements), the F-B5 sink remains a way to inject code that passes validation by closing the Python string literal and emitting valid statements that still leave the Steps to observe (runs entirely inside the running container; no LLM key required):
Suggested fix: change Suggested remediation (per finding)
Affected versions
0.1.0
0.1.1
0.1.2
0.1.3
0.1.4
0.1.5
0.1.6
Fixed in
0.1.7
References Updated Oct 21, 2026 · Source: OSV.dev | ||
0.1.5
patch
3 CVEs
CVE-2026-114108
GHSA-v2f8-6655-7grj
Oct 02, 2026
Vibe-Trading FastAPI endpoints permit unauthenticated access, file upload, and an RCE chain
10.0
/ 10
Critical
Network
Low
None
None
Changed
High
High
High
Summary:5 findings — unauthenticated full-API exposure (F1, lead Critical), read-side authorization gap that persists even with Shared baseline (applies to all 5 findings)The shipped The only operator action required beyond a clean install is supplying a working LLM API key so the agent loop can complete its tool-call round trip — this is the normal first step to make the agent functional, not an additional security opt-in. F-A4 and F-A5 do not require an LLM key (see per-finding notes); F1 and F3 do not require an LLM key for the unauth surface itself, only for the chained RCE demonstration in F1. Reproducer environment (common)
Finding 1 — Critical: Unauthenticated network client reaches shell execution via POST /sessions/{id}/messages
Affected files:
Intent vs actual: The session API is intended to serve authenticated users only. When Steps to observe:
Impact: An unauthenticated caller with TCP access to port 8899 can execute arbitrary shell commands as root inside the container. This is the top-severity entry point of the RCE chain. Combined with the absent Finding 2 — High: Read endpoints return full session history with no authentication, even when API_AUTH_KEY is set
Affected file:
Intent vs actual: When Steps to observe:
Impact: An unauthenticated caller can enumerate the full history of every agent session — including any broker tokens, LLM API keys, or trading account details the operator has pasted into prompts. The gap persists when the operator believes their write operations are protected, making it deceptive for operators who have followed the SECURITY.md spirit and turned auth on. Finding 3 — High: Unauthenticated POST /upload writes arbitrary .py/.sh/.yaml files to server filesystem with full path returned
Affected file:
Intent vs actual: Steps to observe (no LLM key required):
Impact: Any unauthenticated caller can write arbitrary Python scripts, shell scripts, or YAML configuration to a known, server-returned path. F3 is independent of any LLM API key — it is the cleanest unauth-write primitive in the codebase. The uploaded file is reachable from the LLM agent's tool envelope and chains into Group B / F8 (backtest exec_module premature exec) for a non-bash RCE path. Finding A4 — Medium: Default-permissive CORS allowlist + loopback-only check on /settings let any localhost-served browser page drive credentialed cross-origin requests
Affected file:
Intent vs actual: The CORS allowlist is intended to permit the bundled Vite/React frontend to make credentialed API calls during development. The intent is a development-convenience configuration. The actual configuration permits any local web page served from one of the six listed origins — which includes any other application, IDE preview pane, local web tool, or static HTML file served by another process listening on those ports — to issue credentialed cross-origin POSTs/GETs and read the responses in JavaScript. Because the loopback check at Steps to observe (no LLM key required):
Impact: Any malicious or compromised local web page on a whitelisted localhost port can silently drive the Vibe-Trading API in the operator's browser context — creating sessions, posting messages (which chain into F1's BashTool RCE), reading session histories (F2), and reading settings including the partial-key hint exposed by F-A5. Required user interaction is limited to the operator visiting a page that issues background Finding A5 — Medium: Settings endpoints expose first-4 + last-4 characters of every configured API key via _mask_secret()
Affected files:
Intent vs actual: The frontend needs to confirm to the operator that an API key is configured, so the appropriate hint is a boolean presence indicator or a fixed placeholder. The actual implementation reveals the first 4 and last 4 characters. For structured provider keys with predictable prefixes ( Steps to observe (no LLM key required other than the configured value being non-placeholder; the call itself does not consume the LLM):
Impact: Every functional deployment leaks structured bytes of the configured API keys. Combined with offline guessing against bounded-entropy provider keys (notably Tushare tokens), the partial reveal can narrow the attack space to a tractable bruteforce window. The leak is reachable from the F-A4 cross-origin browser path, so it does not require even loopback TCP access — only an operator who visits a malicious local web page in a browser running on the same host as the agent. Suggested remediation (per finding)
Affected versions
0.1.0
0.1.1
0.1.2
0.1.3
0.1.4
0.1.5
0.1.6
Fixed in
0.1.7
References Updated Oct 21, 2026 · Source: OSV.dev
CVE-2026-114106
GHSA-5rmq-chc7-m22f
Oct 02, 2026
Vibe-Trading file-read tools expose arbitrary server-readable files
7.5
/ 10
High
Network
Low
None
None
Unchanged
High
None
None
Summary:2 findings — Shared baseline (applies to both findings)The container has no The two file-read tools described here are members of the auto-discovered LLM tool registry.
Combined with GHSA-1 / F1, they are reachable from any anonymous TCP client to port 8899, but the same defects also apply to authenticated sessions and to prompt-injection in any document the agent processes.
See GHSA-1's shared reproducer block for the install steps; the same
Finding 9 — High: safe_user_path() accepts the entire user home directory and process CWD, allowing LLM tool calls to read /root credentials
Affected file:
Intent vs actual:
A runtime probe inside the container confirmed that Steps to observe:
Impact:
Any unauthenticated caller can instruct the LLM to attempt to parse any file under Finding 10 — High: read_document() opens any server-readable file with no sandbox enforcement, returning full content of /etc/shadow and /proc/self/environ
Affected file:
Intent vs actual:
This is strictly wider than F9: F9 is bounded to Steps to observe:
Impact:
An unauthenticated caller can retrieve any file the server process can read. Running as root, that includes Why F9 and F10 are listed separatelyA maintainer might be tempted to fix only one, on the theory that F10 dominates F9. Two reasons to fix both:
Suggested remediation
Affected versions
0.1.0
0.1.1
0.1.2
0.1.3
0.1.4
0.1.5
0.1.6
Fixed in
0.1.7
References Updated Oct 21, 2026 · Source: OSV.dev
CVE-2026-114107
GHSA-jqmf-mx4f-hfr6
Oct 02, 2026
Vibe-Trading LLM-callable tools permit command execution, code injection, and SSRF
10.0
/ 10
Critical
Network
Low
None
None
Changed
High
High
High
Summary:5 findings — Shared baseline (applies to all 5 findings)All five tools are members of the auto-discovered tool registry the LLM agent gets at startup; the LLM is free to call any of them based on the user prompt. The tool registration is unconditional in default config — no operator opt-in flag gates them. Combined with GHSA-1 / F1 (unauthenticated POST /sessions/{id}/messages), every primitive in this advisory is reachable from any anonymous TCP client to port 8899. The container has no The five primitives also share a second exposure: prompt-injection in any document the LLM agent processes. If the agent is asked to summarise an uploaded document containing the embedded instruction
Finding 6 — High: BashTool passes LLM-emitted command verbatim to subprocess.run(shell=True) with zero filtering
Affected file:
Intent vs actual: Steps to observe:
Impact: Finding 7 — High: BackgroundRunTool executes arbitrary shell commands asynchronously via subprocess.run(shell=True)
Affected file:
Intent vs actual: A runtime probe invoked the tool with Steps to observe:
Impact: Same as F6, with two additions: the asynchronous design makes the exfiltration harder to spot in access logs (the originating HTTP returns before the command completes), and Finding 8 — High: Backtest runner exec_modules attacker-stageable signal_engine.py before validation, executing top-level statements unconditionally
Affected file:
Intent vs actual: A runtime probe wrote Steps to observe:
Impact: This is an independent RCE path that does not match signatures for "shell command invocation" — endpoint or process monitoring tuned to flag Finding B4 — Medium: read_url tool forwards LLM-supplied URL to Jina Reader without schema or host validation, enabling SSRF via the agent session
Affected file:
Intent vs actual: Steps to observe:
Impact: An unauthenticated attacker can use the agent as an outbound proxy via Jina's infrastructure, fingerprinting reachable internal services through HTTP status / title / partial content leaked back through the session stream. The absence of schema validation also forwards Finding B5 — Low: Jinja2 codegen with autoescape disabled for .py.j2 templates allows code injection into generated signal_engine.py
Affected file:
Intent vs actual: The Jinja2 autoescape system is intended to prevent arbitrary string content from being rendered verbatim into generated source. The actual configuration restricts autoescape to Reachability: In normal session flows, Why I am including this finding rather than dropping it: if the team patches F8 by adding a stronger AST validator at line 115 (e.g. rejecting top-level non-import / non-class statements), the F-B5 sink remains a way to inject code that passes validation by closing the Python string literal and emitting valid statements that still leave the Steps to observe (runs entirely inside the running container; no LLM key required):
Suggested fix: change Suggested remediation (per finding)
Affected versions
0.1.0
0.1.1
0.1.2
0.1.3
0.1.4
0.1.5
0.1.6
Fixed in
0.1.7
References Updated Oct 21, 2026 · Source: OSV.dev | ||
0.1.4
patch
3 CVEs
CVE-2026-114108
GHSA-v2f8-6655-7grj
Oct 02, 2026
Vibe-Trading FastAPI endpoints permit unauthenticated access, file upload, and an RCE chain
10.0
/ 10
Critical
Network
Low
None
None
Changed
High
High
High
Summary:5 findings — unauthenticated full-API exposure (F1, lead Critical), read-side authorization gap that persists even with Shared baseline (applies to all 5 findings)The shipped The only operator action required beyond a clean install is supplying a working LLM API key so the agent loop can complete its tool-call round trip — this is the normal first step to make the agent functional, not an additional security opt-in. F-A4 and F-A5 do not require an LLM key (see per-finding notes); F1 and F3 do not require an LLM key for the unauth surface itself, only for the chained RCE demonstration in F1. Reproducer environment (common)
Finding 1 — Critical: Unauthenticated network client reaches shell execution via POST /sessions/{id}/messages
Affected files:
Intent vs actual: The session API is intended to serve authenticated users only. When Steps to observe:
Impact: An unauthenticated caller with TCP access to port 8899 can execute arbitrary shell commands as root inside the container. This is the top-severity entry point of the RCE chain. Combined with the absent Finding 2 — High: Read endpoints return full session history with no authentication, even when API_AUTH_KEY is set
Affected file:
Intent vs actual: When Steps to observe:
Impact: An unauthenticated caller can enumerate the full history of every agent session — including any broker tokens, LLM API keys, or trading account details the operator has pasted into prompts. The gap persists when the operator believes their write operations are protected, making it deceptive for operators who have followed the SECURITY.md spirit and turned auth on. Finding 3 — High: Unauthenticated POST /upload writes arbitrary .py/.sh/.yaml files to server filesystem with full path returned
Affected file:
Intent vs actual: Steps to observe (no LLM key required):
Impact: Any unauthenticated caller can write arbitrary Python scripts, shell scripts, or YAML configuration to a known, server-returned path. F3 is independent of any LLM API key — it is the cleanest unauth-write primitive in the codebase. The uploaded file is reachable from the LLM agent's tool envelope and chains into Group B / F8 (backtest exec_module premature exec) for a non-bash RCE path. Finding A4 — Medium: Default-permissive CORS allowlist + loopback-only check on /settings let any localhost-served browser page drive credentialed cross-origin requests
Affected file:
Intent vs actual: The CORS allowlist is intended to permit the bundled Vite/React frontend to make credentialed API calls during development. The intent is a development-convenience configuration. The actual configuration permits any local web page served from one of the six listed origins — which includes any other application, IDE preview pane, local web tool, or static HTML file served by another process listening on those ports — to issue credentialed cross-origin POSTs/GETs and read the responses in JavaScript. Because the loopback check at Steps to observe (no LLM key required):
Impact: Any malicious or compromised local web page on a whitelisted localhost port can silently drive the Vibe-Trading API in the operator's browser context — creating sessions, posting messages (which chain into F1's BashTool RCE), reading session histories (F2), and reading settings including the partial-key hint exposed by F-A5. Required user interaction is limited to the operator visiting a page that issues background Finding A5 — Medium: Settings endpoints expose first-4 + last-4 characters of every configured API key via _mask_secret()
Affected files:
Intent vs actual: The frontend needs to confirm to the operator that an API key is configured, so the appropriate hint is a boolean presence indicator or a fixed placeholder. The actual implementation reveals the first 4 and last 4 characters. For structured provider keys with predictable prefixes ( Steps to observe (no LLM key required other than the configured value being non-placeholder; the call itself does not consume the LLM):
Impact: Every functional deployment leaks structured bytes of the configured API keys. Combined with offline guessing against bounded-entropy provider keys (notably Tushare tokens), the partial reveal can narrow the attack space to a tractable bruteforce window. The leak is reachable from the F-A4 cross-origin browser path, so it does not require even loopback TCP access — only an operator who visits a malicious local web page in a browser running on the same host as the agent. Suggested remediation (per finding)
Affected versions
0.1.0
0.1.1
0.1.2
0.1.3
0.1.4
0.1.5
0.1.6
Fixed in
0.1.7
References Updated Oct 21, 2026 · Source: OSV.dev
CVE-2026-114106
GHSA-5rmq-chc7-m22f
Oct 02, 2026
Vibe-Trading file-read tools expose arbitrary server-readable files
7.5
/ 10
High
Network
Low
None
None
Unchanged
High
None
None
Summary:2 findings — Shared baseline (applies to both findings)The container has no The two file-read tools described here are members of the auto-discovered LLM tool registry.
Combined with GHSA-1 / F1, they are reachable from any anonymous TCP client to port 8899, but the same defects also apply to authenticated sessions and to prompt-injection in any document the agent processes.
See GHSA-1's shared reproducer block for the install steps; the same
Finding 9 — High: safe_user_path() accepts the entire user home directory and process CWD, allowing LLM tool calls to read /root credentials
Affected file:
Intent vs actual:
A runtime probe inside the container confirmed that Steps to observe:
Impact:
Any unauthenticated caller can instruct the LLM to attempt to parse any file under Finding 10 — High: read_document() opens any server-readable file with no sandbox enforcement, returning full content of /etc/shadow and /proc/self/environ
Affected file:
Intent vs actual:
This is strictly wider than F9: F9 is bounded to Steps to observe:
Impact:
An unauthenticated caller can retrieve any file the server process can read. Running as root, that includes Why F9 and F10 are listed separatelyA maintainer might be tempted to fix only one, on the theory that F10 dominates F9. Two reasons to fix both:
Suggested remediation
Affected versions
0.1.0
0.1.1
0.1.2
0.1.3
0.1.4
0.1.5
0.1.6
Fixed in
0.1.7
References Updated Oct 21, 2026 · Source: OSV.dev
CVE-2026-114107
GHSA-jqmf-mx4f-hfr6
Oct 02, 2026
Vibe-Trading LLM-callable tools permit command execution, code injection, and SSRF
10.0
/ 10
Critical
Network
Low
None
None
Changed
High
High
High
Summary:5 findings — Shared baseline (applies to all 5 findings)All five tools are members of the auto-discovered tool registry the LLM agent gets at startup; the LLM is free to call any of them based on the user prompt. The tool registration is unconditional in default config — no operator opt-in flag gates them. Combined with GHSA-1 / F1 (unauthenticated POST /sessions/{id}/messages), every primitive in this advisory is reachable from any anonymous TCP client to port 8899. The container has no The five primitives also share a second exposure: prompt-injection in any document the LLM agent processes. If the agent is asked to summarise an uploaded document containing the embedded instruction
Finding 6 — High: BashTool passes LLM-emitted command verbatim to subprocess.run(shell=True) with zero filtering
Affected file:
Intent vs actual: Steps to observe:
Impact: Finding 7 — High: BackgroundRunTool executes arbitrary shell commands asynchronously via subprocess.run(shell=True)
Affected file:
Intent vs actual: A runtime probe invoked the tool with Steps to observe:
Impact: Same as F6, with two additions: the asynchronous design makes the exfiltration harder to spot in access logs (the originating HTTP returns before the command completes), and Finding 8 — High: Backtest runner exec_modules attacker-stageable signal_engine.py before validation, executing top-level statements unconditionally
Affected file:
Intent vs actual: A runtime probe wrote Steps to observe:
Impact: This is an independent RCE path that does not match signatures for "shell command invocation" — endpoint or process monitoring tuned to flag Finding B4 — Medium: read_url tool forwards LLM-supplied URL to Jina Reader without schema or host validation, enabling SSRF via the agent session
Affected file:
Intent vs actual: Steps to observe:
Impact: An unauthenticated attacker can use the agent as an outbound proxy via Jina's infrastructure, fingerprinting reachable internal services through HTTP status / title / partial content leaked back through the session stream. The absence of schema validation also forwards Finding B5 — Low: Jinja2 codegen with autoescape disabled for .py.j2 templates allows code injection into generated signal_engine.py
Affected file:
Intent vs actual: The Jinja2 autoescape system is intended to prevent arbitrary string content from being rendered verbatim into generated source. The actual configuration restricts autoescape to Reachability: In normal session flows, Why I am including this finding rather than dropping it: if the team patches F8 by adding a stronger AST validator at line 115 (e.g. rejecting top-level non-import / non-class statements), the F-B5 sink remains a way to inject code that passes validation by closing the Python string literal and emitting valid statements that still leave the Steps to observe (runs entirely inside the running container; no LLM key required):
Suggested fix: change Suggested remediation (per finding)
Affected versions
0.1.0
0.1.1
0.1.2
0.1.3
0.1.4
0.1.5
0.1.6
Fixed in
0.1.7
References Updated Oct 21, 2026 · Source: OSV.dev | ||
0.1.3
patch
3 CVEs
CVE-2026-114108
GHSA-v2f8-6655-7grj
Oct 02, 2026
Vibe-Trading FastAPI endpoints permit unauthenticated access, file upload, and an RCE chain
10.0
/ 10
Critical
Network
Low
None
None
Changed
High
High
High
Summary:5 findings — unauthenticated full-API exposure (F1, lead Critical), read-side authorization gap that persists even with Shared baseline (applies to all 5 findings)The shipped The only operator action required beyond a clean install is supplying a working LLM API key so the agent loop can complete its tool-call round trip — this is the normal first step to make the agent functional, not an additional security opt-in. F-A4 and F-A5 do not require an LLM key (see per-finding notes); F1 and F3 do not require an LLM key for the unauth surface itself, only for the chained RCE demonstration in F1. Reproducer environment (common)
Finding 1 — Critical: Unauthenticated network client reaches shell execution via POST /sessions/{id}/messages
Affected files:
Intent vs actual: The session API is intended to serve authenticated users only. When Steps to observe:
Impact: An unauthenticated caller with TCP access to port 8899 can execute arbitrary shell commands as root inside the container. This is the top-severity entry point of the RCE chain. Combined with the absent Finding 2 — High: Read endpoints return full session history with no authentication, even when API_AUTH_KEY is set
Affected file:
Intent vs actual: When Steps to observe:
Impact: An unauthenticated caller can enumerate the full history of every agent session — including any broker tokens, LLM API keys, or trading account details the operator has pasted into prompts. The gap persists when the operator believes their write operations are protected, making it deceptive for operators who have followed the SECURITY.md spirit and turned auth on. Finding 3 — High: Unauthenticated POST /upload writes arbitrary .py/.sh/.yaml files to server filesystem with full path returned
Affected file:
Intent vs actual: Steps to observe (no LLM key required):
Impact: Any unauthenticated caller can write arbitrary Python scripts, shell scripts, or YAML configuration to a known, server-returned path. F3 is independent of any LLM API key — it is the cleanest unauth-write primitive in the codebase. The uploaded file is reachable from the LLM agent's tool envelope and chains into Group B / F8 (backtest exec_module premature exec) for a non-bash RCE path. Finding A4 — Medium: Default-permissive CORS allowlist + loopback-only check on /settings let any localhost-served browser page drive credentialed cross-origin requests
Affected file:
Intent vs actual: The CORS allowlist is intended to permit the bundled Vite/React frontend to make credentialed API calls during development. The intent is a development-convenience configuration. The actual configuration permits any local web page served from one of the six listed origins — which includes any other application, IDE preview pane, local web tool, or static HTML file served by another process listening on those ports — to issue credentialed cross-origin POSTs/GETs and read the responses in JavaScript. Because the loopback check at Steps to observe (no LLM key required):
Impact: Any malicious or compromised local web page on a whitelisted localhost port can silently drive the Vibe-Trading API in the operator's browser context — creating sessions, posting messages (which chain into F1's BashTool RCE), reading session histories (F2), and reading settings including the partial-key hint exposed by F-A5. Required user interaction is limited to the operator visiting a page that issues background Finding A5 — Medium: Settings endpoints expose first-4 + last-4 characters of every configured API key via _mask_secret()
Affected files:
Intent vs actual: The frontend needs to confirm to the operator that an API key is configured, so the appropriate hint is a boolean presence indicator or a fixed placeholder. The actual implementation reveals the first 4 and last 4 characters. For structured provider keys with predictable prefixes ( Steps to observe (no LLM key required other than the configured value being non-placeholder; the call itself does not consume the LLM):
Impact: Every functional deployment leaks structured bytes of the configured API keys. Combined with offline guessing against bounded-entropy provider keys (notably Tushare tokens), the partial reveal can narrow the attack space to a tractable bruteforce window. The leak is reachable from the F-A4 cross-origin browser path, so it does not require even loopback TCP access — only an operator who visits a malicious local web page in a browser running on the same host as the agent. Suggested remediation (per finding)
Affected versions
0.1.0
0.1.1
0.1.2
0.1.3
0.1.4
0.1.5
0.1.6
Fixed in
0.1.7
References Updated Oct 21, 2026 · Source: OSV.dev
CVE-2026-114106
GHSA-5rmq-chc7-m22f
Oct 02, 2026
Vibe-Trading file-read tools expose arbitrary server-readable files
7.5
/ 10
High
Network
Low
None
None
Unchanged
High
None
None
Summary:2 findings — Shared baseline (applies to both findings)The container has no The two file-read tools described here are members of the auto-discovered LLM tool registry.
Combined with GHSA-1 / F1, they are reachable from any anonymous TCP client to port 8899, but the same defects also apply to authenticated sessions and to prompt-injection in any document the agent processes.
See GHSA-1's shared reproducer block for the install steps; the same
Finding 9 — High: safe_user_path() accepts the entire user home directory and process CWD, allowing LLM tool calls to read /root credentials
Affected file:
Intent vs actual:
A runtime probe inside the container confirmed that Steps to observe:
Impact:
Any unauthenticated caller can instruct the LLM to attempt to parse any file under Finding 10 — High: read_document() opens any server-readable file with no sandbox enforcement, returning full content of /etc/shadow and /proc/self/environ
Affected file:
Intent vs actual:
This is strictly wider than F9: F9 is bounded to Steps to observe:
Impact:
An unauthenticated caller can retrieve any file the server process can read. Running as root, that includes Why F9 and F10 are listed separatelyA maintainer might be tempted to fix only one, on the theory that F10 dominates F9. Two reasons to fix both:
Suggested remediation
Affected versions
0.1.0
0.1.1
0.1.2
0.1.3
0.1.4
0.1.5
0.1.6
Fixed in
0.1.7
References Updated Oct 21, 2026 · Source: OSV.dev
CVE-2026-114107
GHSA-jqmf-mx4f-hfr6
Oct 02, 2026
Vibe-Trading LLM-callable tools permit command execution, code injection, and SSRF
10.0
/ 10
Critical
Network
Low
None
None
Changed
High
High
High
Summary:5 findings — Shared baseline (applies to all 5 findings)All five tools are members of the auto-discovered tool registry the LLM agent gets at startup; the LLM is free to call any of them based on the user prompt. The tool registration is unconditional in default config — no operator opt-in flag gates them. Combined with GHSA-1 / F1 (unauthenticated POST /sessions/{id}/messages), every primitive in this advisory is reachable from any anonymous TCP client to port 8899. The container has no The five primitives also share a second exposure: prompt-injection in any document the LLM agent processes. If the agent is asked to summarise an uploaded document containing the embedded instruction
Finding 6 — High: BashTool passes LLM-emitted command verbatim to subprocess.run(shell=True) with zero filtering
Affected file:
Intent vs actual: Steps to observe:
Impact: Finding 7 — High: BackgroundRunTool executes arbitrary shell commands asynchronously via subprocess.run(shell=True)
Affected file:
Intent vs actual: A runtime probe invoked the tool with Steps to observe:
Impact: Same as F6, with two additions: the asynchronous design makes the exfiltration harder to spot in access logs (the originating HTTP returns before the command completes), and Finding 8 — High: Backtest runner exec_modules attacker-stageable signal_engine.py before validation, executing top-level statements unconditionally
Affected file:
Intent vs actual: A runtime probe wrote Steps to observe:
Impact: This is an independent RCE path that does not match signatures for "shell command invocation" — endpoint or process monitoring tuned to flag Finding B4 — Medium: read_url tool forwards LLM-supplied URL to Jina Reader without schema or host validation, enabling SSRF via the agent session
Affected file:
Intent vs actual: Steps to observe:
Impact: An unauthenticated attacker can use the agent as an outbound proxy via Jina's infrastructure, fingerprinting reachable internal services through HTTP status / title / partial content leaked back through the session stream. The absence of schema validation also forwards Finding B5 — Low: Jinja2 codegen with autoescape disabled for .py.j2 templates allows code injection into generated signal_engine.py
Affected file:
Intent vs actual: The Jinja2 autoescape system is intended to prevent arbitrary string content from being rendered verbatim into generated source. The actual configuration restricts autoescape to Reachability: In normal session flows, Why I am including this finding rather than dropping it: if the team patches F8 by adding a stronger AST validator at line 115 (e.g. rejecting top-level non-import / non-class statements), the F-B5 sink remains a way to inject code that passes validation by closing the Python string literal and emitting valid statements that still leave the Steps to observe (runs entirely inside the running container; no LLM key required):
Suggested fix: change Suggested remediation (per finding)
Affected versions
0.1.0
0.1.1
0.1.2
0.1.3
0.1.4
0.1.5
0.1.6
Fixed in
0.1.7
References Updated Oct 21, 2026 · Source: OSV.dev | ||
0.1.2
patch
3 CVEs
CVE-2026-114108
GHSA-v2f8-6655-7grj
Oct 02, 2026
Vibe-Trading FastAPI endpoints permit unauthenticated access, file upload, and an RCE chain
10.0
/ 10
Critical
Network
Low
None
None
Changed
High
High
High
Summary:5 findings — unauthenticated full-API exposure (F1, lead Critical), read-side authorization gap that persists even with Shared baseline (applies to all 5 findings)The shipped The only operator action required beyond a clean install is supplying a working LLM API key so the agent loop can complete its tool-call round trip — this is the normal first step to make the agent functional, not an additional security opt-in. F-A4 and F-A5 do not require an LLM key (see per-finding notes); F1 and F3 do not require an LLM key for the unauth surface itself, only for the chained RCE demonstration in F1. Reproducer environment (common)
Finding 1 — Critical: Unauthenticated network client reaches shell execution via POST /sessions/{id}/messages
Affected files:
Intent vs actual: The session API is intended to serve authenticated users only. When Steps to observe:
Impact: An unauthenticated caller with TCP access to port 8899 can execute arbitrary shell commands as root inside the container. This is the top-severity entry point of the RCE chain. Combined with the absent Finding 2 — High: Read endpoints return full session history with no authentication, even when API_AUTH_KEY is set
Affected file:
Intent vs actual: When Steps to observe:
Impact: An unauthenticated caller can enumerate the full history of every agent session — including any broker tokens, LLM API keys, or trading account details the operator has pasted into prompts. The gap persists when the operator believes their write operations are protected, making it deceptive for operators who have followed the SECURITY.md spirit and turned auth on. Finding 3 — High: Unauthenticated POST /upload writes arbitrary .py/.sh/.yaml files to server filesystem with full path returned
Affected file:
Intent vs actual: Steps to observe (no LLM key required):
Impact: Any unauthenticated caller can write arbitrary Python scripts, shell scripts, or YAML configuration to a known, server-returned path. F3 is independent of any LLM API key — it is the cleanest unauth-write primitive in the codebase. The uploaded file is reachable from the LLM agent's tool envelope and chains into Group B / F8 (backtest exec_module premature exec) for a non-bash RCE path. Finding A4 — Medium: Default-permissive CORS allowlist + loopback-only check on /settings let any localhost-served browser page drive credentialed cross-origin requests
Affected file:
Intent vs actual: The CORS allowlist is intended to permit the bundled Vite/React frontend to make credentialed API calls during development. The intent is a development-convenience configuration. The actual configuration permits any local web page served from one of the six listed origins — which includes any other application, IDE preview pane, local web tool, or static HTML file served by another process listening on those ports — to issue credentialed cross-origin POSTs/GETs and read the responses in JavaScript. Because the loopback check at Steps to observe (no LLM key required):
Impact: Any malicious or compromised local web page on a whitelisted localhost port can silently drive the Vibe-Trading API in the operator's browser context — creating sessions, posting messages (which chain into F1's BashTool RCE), reading session histories (F2), and reading settings including the partial-key hint exposed by F-A5. Required user interaction is limited to the operator visiting a page that issues background Finding A5 — Medium: Settings endpoints expose first-4 + last-4 characters of every configured API key via _mask_secret()
Affected files:
Intent vs actual: The frontend needs to confirm to the operator that an API key is configured, so the appropriate hint is a boolean presence indicator or a fixed placeholder. The actual implementation reveals the first 4 and last 4 characters. For structured provider keys with predictable prefixes ( Steps to observe (no LLM key required other than the configured value being non-placeholder; the call itself does not consume the LLM):
Impact: Every functional deployment leaks structured bytes of the configured API keys. Combined with offline guessing against bounded-entropy provider keys (notably Tushare tokens), the partial reveal can narrow the attack space to a tractable bruteforce window. The leak is reachable from the F-A4 cross-origin browser path, so it does not require even loopback TCP access — only an operator who visits a malicious local web page in a browser running on the same host as the agent. Suggested remediation (per finding)
Affected versions
0.1.0
0.1.1
0.1.2
0.1.3
0.1.4
0.1.5
0.1.6
Fixed in
0.1.7
References Updated Oct 21, 2026 · Source: OSV.dev
CVE-2026-114106
GHSA-5rmq-chc7-m22f
Oct 02, 2026
Vibe-Trading file-read tools expose arbitrary server-readable files
7.5
/ 10
High
Network
Low
None
None
Unchanged
High
None
None
Summary:2 findings — Shared baseline (applies to both findings)The container has no The two file-read tools described here are members of the auto-discovered LLM tool registry.
Combined with GHSA-1 / F1, they are reachable from any anonymous TCP client to port 8899, but the same defects also apply to authenticated sessions and to prompt-injection in any document the agent processes.
See GHSA-1's shared reproducer block for the install steps; the same
Finding 9 — High: safe_user_path() accepts the entire user home directory and process CWD, allowing LLM tool calls to read /root credentials
Affected file:
Intent vs actual:
A runtime probe inside the container confirmed that Steps to observe:
Impact:
Any unauthenticated caller can instruct the LLM to attempt to parse any file under Finding 10 — High: read_document() opens any server-readable file with no sandbox enforcement, returning full content of /etc/shadow and /proc/self/environ
Affected file:
Intent vs actual:
This is strictly wider than F9: F9 is bounded to Steps to observe:
Impact:
An unauthenticated caller can retrieve any file the server process can read. Running as root, that includes Why F9 and F10 are listed separatelyA maintainer might be tempted to fix only one, on the theory that F10 dominates F9. Two reasons to fix both:
Suggested remediation
Affected versions
0.1.0
0.1.1
0.1.2
0.1.3
0.1.4
0.1.5
0.1.6
Fixed in
0.1.7
References Updated Oct 21, 2026 · Source: OSV.dev
CVE-2026-114107
GHSA-jqmf-mx4f-hfr6
Oct 02, 2026
Vibe-Trading LLM-callable tools permit command execution, code injection, and SSRF
10.0
/ 10
Critical
Network
Low
None
None
Changed
High
High
High
Summary:5 findings — Shared baseline (applies to all 5 findings)All five tools are members of the auto-discovered tool registry the LLM agent gets at startup; the LLM is free to call any of them based on the user prompt. The tool registration is unconditional in default config — no operator opt-in flag gates them. Combined with GHSA-1 / F1 (unauthenticated POST /sessions/{id}/messages), every primitive in this advisory is reachable from any anonymous TCP client to port 8899. The container has no The five primitives also share a second exposure: prompt-injection in any document the LLM agent processes. If the agent is asked to summarise an uploaded document containing the embedded instruction
Finding 6 — High: BashTool passes LLM-emitted command verbatim to subprocess.run(shell=True) with zero filtering
Affected file:
Intent vs actual: Steps to observe:
Impact: Finding 7 — High: BackgroundRunTool executes arbitrary shell commands asynchronously via subprocess.run(shell=True)
Affected file:
Intent vs actual: A runtime probe invoked the tool with Steps to observe:
Impact: Same as F6, with two additions: the asynchronous design makes the exfiltration harder to spot in access logs (the originating HTTP returns before the command completes), and Finding 8 — High: Backtest runner exec_modules attacker-stageable signal_engine.py before validation, executing top-level statements unconditionally
Affected file:
Intent vs actual: A runtime probe wrote Steps to observe:
Impact: This is an independent RCE path that does not match signatures for "shell command invocation" — endpoint or process monitoring tuned to flag Finding B4 — Medium: read_url tool forwards LLM-supplied URL to Jina Reader without schema or host validation, enabling SSRF via the agent session
Affected file:
Intent vs actual: Steps to observe:
Impact: An unauthenticated attacker can use the agent as an outbound proxy via Jina's infrastructure, fingerprinting reachable internal services through HTTP status / title / partial content leaked back through the session stream. The absence of schema validation also forwards Finding B5 — Low: Jinja2 codegen with autoescape disabled for .py.j2 templates allows code injection into generated signal_engine.py
Affected file:
Intent vs actual: The Jinja2 autoescape system is intended to prevent arbitrary string content from being rendered verbatim into generated source. The actual configuration restricts autoescape to Reachability: In normal session flows, Why I am including this finding rather than dropping it: if the team patches F8 by adding a stronger AST validator at line 115 (e.g. rejecting top-level non-import / non-class statements), the F-B5 sink remains a way to inject code that passes validation by closing the Python string literal and emitting valid statements that still leave the Steps to observe (runs entirely inside the running container; no LLM key required):
Suggested fix: change Suggested remediation (per finding)
Affected versions
0.1.0
0.1.1
0.1.2
0.1.3
0.1.4
0.1.5
0.1.6
Fixed in
0.1.7
References Updated Oct 21, 2026 · Source: OSV.dev | ||
0.1.1
patch
3 CVEs
CVE-2026-114108
GHSA-v2f8-6655-7grj
Oct 02, 2026
Vibe-Trading FastAPI endpoints permit unauthenticated access, file upload, and an RCE chain
10.0
/ 10
Critical
Network
Low
None
None
Changed
High
High
High
Summary:5 findings — unauthenticated full-API exposure (F1, lead Critical), read-side authorization gap that persists even with Shared baseline (applies to all 5 findings)The shipped The only operator action required beyond a clean install is supplying a working LLM API key so the agent loop can complete its tool-call round trip — this is the normal first step to make the agent functional, not an additional security opt-in. F-A4 and F-A5 do not require an LLM key (see per-finding notes); F1 and F3 do not require an LLM key for the unauth surface itself, only for the chained RCE demonstration in F1. Reproducer environment (common)
Finding 1 — Critical: Unauthenticated network client reaches shell execution via POST /sessions/{id}/messages
Affected files:
Intent vs actual: The session API is intended to serve authenticated users only. When Steps to observe:
Impact: An unauthenticated caller with TCP access to port 8899 can execute arbitrary shell commands as root inside the container. This is the top-severity entry point of the RCE chain. Combined with the absent Finding 2 — High: Read endpoints return full session history with no authentication, even when API_AUTH_KEY is set
Affected file:
Intent vs actual: When Steps to observe:
Impact: An unauthenticated caller can enumerate the full history of every agent session — including any broker tokens, LLM API keys, or trading account details the operator has pasted into prompts. The gap persists when the operator believes their write operations are protected, making it deceptive for operators who have followed the SECURITY.md spirit and turned auth on. Finding 3 — High: Unauthenticated POST /upload writes arbitrary .py/.sh/.yaml files to server filesystem with full path returned
Affected file:
Intent vs actual: Steps to observe (no LLM key required):
Impact: Any unauthenticated caller can write arbitrary Python scripts, shell scripts, or YAML configuration to a known, server-returned path. F3 is independent of any LLM API key — it is the cleanest unauth-write primitive in the codebase. The uploaded file is reachable from the LLM agent's tool envelope and chains into Group B / F8 (backtest exec_module premature exec) for a non-bash RCE path. Finding A4 — Medium: Default-permissive CORS allowlist + loopback-only check on /settings let any localhost-served browser page drive credentialed cross-origin requests
Affected file:
Intent vs actual: The CORS allowlist is intended to permit the bundled Vite/React frontend to make credentialed API calls during development. The intent is a development-convenience configuration. The actual configuration permits any local web page served from one of the six listed origins — which includes any other application, IDE preview pane, local web tool, or static HTML file served by another process listening on those ports — to issue credentialed cross-origin POSTs/GETs and read the responses in JavaScript. Because the loopback check at Steps to observe (no LLM key required):
Impact: Any malicious or compromised local web page on a whitelisted localhost port can silently drive the Vibe-Trading API in the operator's browser context — creating sessions, posting messages (which chain into F1's BashTool RCE), reading session histories (F2), and reading settings including the partial-key hint exposed by F-A5. Required user interaction is limited to the operator visiting a page that issues background Finding A5 — Medium: Settings endpoints expose first-4 + last-4 characters of every configured API key via _mask_secret()
Affected files:
Intent vs actual: The frontend needs to confirm to the operator that an API key is configured, so the appropriate hint is a boolean presence indicator or a fixed placeholder. The actual implementation reveals the first 4 and last 4 characters. For structured provider keys with predictable prefixes ( Steps to observe (no LLM key required other than the configured value being non-placeholder; the call itself does not consume the LLM):
Impact: Every functional deployment leaks structured bytes of the configured API keys. Combined with offline guessing against bounded-entropy provider keys (notably Tushare tokens), the partial reveal can narrow the attack space to a tractable bruteforce window. The leak is reachable from the F-A4 cross-origin browser path, so it does not require even loopback TCP access — only an operator who visits a malicious local web page in a browser running on the same host as the agent. Suggested remediation (per finding)
Affected versions
0.1.0
0.1.1
0.1.2
0.1.3
0.1.4
0.1.5
0.1.6
Fixed in
0.1.7
References Updated Oct 21, 2026 · Source: OSV.dev
CVE-2026-114106
GHSA-5rmq-chc7-m22f
Oct 02, 2026
Vibe-Trading file-read tools expose arbitrary server-readable files
7.5
/ 10
High
Network
Low
None
None
Unchanged
High
None
None
Summary:2 findings — Shared baseline (applies to both findings)The container has no The two file-read tools described here are members of the auto-discovered LLM tool registry.
Combined with GHSA-1 / F1, they are reachable from any anonymous TCP client to port 8899, but the same defects also apply to authenticated sessions and to prompt-injection in any document the agent processes.
See GHSA-1's shared reproducer block for the install steps; the same
Finding 9 — High: safe_user_path() accepts the entire user home directory and process CWD, allowing LLM tool calls to read /root credentials
Affected file:
Intent vs actual:
A runtime probe inside the container confirmed that Steps to observe:
Impact:
Any unauthenticated caller can instruct the LLM to attempt to parse any file under Finding 10 — High: read_document() opens any server-readable file with no sandbox enforcement, returning full content of /etc/shadow and /proc/self/environ
Affected file:
Intent vs actual:
This is strictly wider than F9: F9 is bounded to Steps to observe:
Impact:
An unauthenticated caller can retrieve any file the server process can read. Running as root, that includes Why F9 and F10 are listed separatelyA maintainer might be tempted to fix only one, on the theory that F10 dominates F9. Two reasons to fix both:
Suggested remediation
Affected versions
0.1.0
0.1.1
0.1.2
0.1.3
0.1.4
0.1.5
0.1.6
Fixed in
0.1.7
References Updated Oct 21, 2026 · Source: OSV.dev
CVE-2026-114107
GHSA-jqmf-mx4f-hfr6
Oct 02, 2026
Vibe-Trading LLM-callable tools permit command execution, code injection, and SSRF
10.0
/ 10
Critical
Network
Low
None
None
Changed
High
High
High
Summary:5 findings — Shared baseline (applies to all 5 findings)All five tools are members of the auto-discovered tool registry the LLM agent gets at startup; the LLM is free to call any of them based on the user prompt. The tool registration is unconditional in default config — no operator opt-in flag gates them. Combined with GHSA-1 / F1 (unauthenticated POST /sessions/{id}/messages), every primitive in this advisory is reachable from any anonymous TCP client to port 8899. The container has no The five primitives also share a second exposure: prompt-injection in any document the LLM agent processes. If the agent is asked to summarise an uploaded document containing the embedded instruction
Finding 6 — High: BashTool passes LLM-emitted command verbatim to subprocess.run(shell=True) with zero filtering
Affected file:
Intent vs actual: Steps to observe:
Impact: Finding 7 — High: BackgroundRunTool executes arbitrary shell commands asynchronously via subprocess.run(shell=True)
Affected file:
Intent vs actual: A runtime probe invoked the tool with Steps to observe:
Impact: Same as F6, with two additions: the asynchronous design makes the exfiltration harder to spot in access logs (the originating HTTP returns before the command completes), and Finding 8 — High: Backtest runner exec_modules attacker-stageable signal_engine.py before validation, executing top-level statements unconditionally
Affected file:
Intent vs actual: A runtime probe wrote Steps to observe:
Impact: This is an independent RCE path that does not match signatures for "shell command invocation" — endpoint or process monitoring tuned to flag Finding B4 — Medium: read_url tool forwards LLM-supplied URL to Jina Reader without schema or host validation, enabling SSRF via the agent session
Affected file:
Intent vs actual: Steps to observe:
Impact: An unauthenticated attacker can use the agent as an outbound proxy via Jina's infrastructure, fingerprinting reachable internal services through HTTP status / title / partial content leaked back through the session stream. The absence of schema validation also forwards Finding B5 — Low: Jinja2 codegen with autoescape disabled for .py.j2 templates allows code injection into generated signal_engine.py
Affected file:
Intent vs actual: The Jinja2 autoescape system is intended to prevent arbitrary string content from being rendered verbatim into generated source. The actual configuration restricts autoescape to Reachability: In normal session flows, Why I am including this finding rather than dropping it: if the team patches F8 by adding a stronger AST validator at line 115 (e.g. rejecting top-level non-import / non-class statements), the F-B5 sink remains a way to inject code that passes validation by closing the Python string literal and emitting valid statements that still leave the Steps to observe (runs entirely inside the running container; no LLM key required):
Suggested fix: change Suggested remediation (per finding)
Affected versions
0.1.0
0.1.1
0.1.2
0.1.3
0.1.4
0.1.5
0.1.6
Fixed in
0.1.7
References Updated Oct 21, 2026 · Source: OSV.dev | ||
0.1.0
initial
3 CVEs
CVE-2026-114108
GHSA-v2f8-6655-7grj
Oct 02, 2026
Vibe-Trading FastAPI endpoints permit unauthenticated access, file upload, and an RCE chain
10.0
/ 10
Critical
Network
Low
None
None
Changed
High
High
High
Summary:5 findings — unauthenticated full-API exposure (F1, lead Critical), read-side authorization gap that persists even with Shared baseline (applies to all 5 findings)The shipped The only operator action required beyond a clean install is supplying a working LLM API key so the agent loop can complete its tool-call round trip — this is the normal first step to make the agent functional, not an additional security opt-in. F-A4 and F-A5 do not require an LLM key (see per-finding notes); F1 and F3 do not require an LLM key for the unauth surface itself, only for the chained RCE demonstration in F1. Reproducer environment (common)
Finding 1 — Critical: Unauthenticated network client reaches shell execution via POST /sessions/{id}/messages
Affected files:
Intent vs actual: The session API is intended to serve authenticated users only. When Steps to observe:
Impact: An unauthenticated caller with TCP access to port 8899 can execute arbitrary shell commands as root inside the container. This is the top-severity entry point of the RCE chain. Combined with the absent Finding 2 — High: Read endpoints return full session history with no authentication, even when API_AUTH_KEY is set
Affected file:
Intent vs actual: When Steps to observe:
Impact: An unauthenticated caller can enumerate the full history of every agent session — including any broker tokens, LLM API keys, or trading account details the operator has pasted into prompts. The gap persists when the operator believes their write operations are protected, making it deceptive for operators who have followed the SECURITY.md spirit and turned auth on. Finding 3 — High: Unauthenticated POST /upload writes arbitrary .py/.sh/.yaml files to server filesystem with full path returned
Affected file:
Intent vs actual: Steps to observe (no LLM key required):
Impact: Any unauthenticated caller can write arbitrary Python scripts, shell scripts, or YAML configuration to a known, server-returned path. F3 is independent of any LLM API key — it is the cleanest unauth-write primitive in the codebase. The uploaded file is reachable from the LLM agent's tool envelope and chains into Group B / F8 (backtest exec_module premature exec) for a non-bash RCE path. Finding A4 — Medium: Default-permissive CORS allowlist + loopback-only check on /settings let any localhost-served browser page drive credentialed cross-origin requests
Affected file:
Intent vs actual: The CORS allowlist is intended to permit the bundled Vite/React frontend to make credentialed API calls during development. The intent is a development-convenience configuration. The actual configuration permits any local web page served from one of the six listed origins — which includes any other application, IDE preview pane, local web tool, or static HTML file served by another process listening on those ports — to issue credentialed cross-origin POSTs/GETs and read the responses in JavaScript. Because the loopback check at Steps to observe (no LLM key required):
Impact: Any malicious or compromised local web page on a whitelisted localhost port can silently drive the Vibe-Trading API in the operator's browser context — creating sessions, posting messages (which chain into F1's BashTool RCE), reading session histories (F2), and reading settings including the partial-key hint exposed by F-A5. Required user interaction is limited to the operator visiting a page that issues background Finding A5 — Medium: Settings endpoints expose first-4 + last-4 characters of every configured API key via _mask_secret()
Affected files:
Intent vs actual: The frontend needs to confirm to the operator that an API key is configured, so the appropriate hint is a boolean presence indicator or a fixed placeholder. The actual implementation reveals the first 4 and last 4 characters. For structured provider keys with predictable prefixes ( Steps to observe (no LLM key required other than the configured value being non-placeholder; the call itself does not consume the LLM):
Impact: Every functional deployment leaks structured bytes of the configured API keys. Combined with offline guessing against bounded-entropy provider keys (notably Tushare tokens), the partial reveal can narrow the attack space to a tractable bruteforce window. The leak is reachable from the F-A4 cross-origin browser path, so it does not require even loopback TCP access — only an operator who visits a malicious local web page in a browser running on the same host as the agent. Suggested remediation (per finding)
Affected versions
0.1.0
0.1.1
0.1.2
0.1.3
0.1.4
0.1.5
0.1.6
Fixed in
0.1.7
References Updated Oct 21, 2026 · Source: OSV.dev
CVE-2026-114106
GHSA-5rmq-chc7-m22f
Oct 02, 2026
Vibe-Trading file-read tools expose arbitrary server-readable files
7.5
/ 10
High
Network
Low
None
None
Unchanged
High
None
None
Summary:2 findings — Shared baseline (applies to both findings)The container has no The two file-read tools described here are members of the auto-discovered LLM tool registry.
Combined with GHSA-1 / F1, they are reachable from any anonymous TCP client to port 8899, but the same defects also apply to authenticated sessions and to prompt-injection in any document the agent processes.
See GHSA-1's shared reproducer block for the install steps; the same
Finding 9 — High: safe_user_path() accepts the entire user home directory and process CWD, allowing LLM tool calls to read /root credentials
Affected file:
Intent vs actual:
A runtime probe inside the container confirmed that Steps to observe:
Impact:
Any unauthenticated caller can instruct the LLM to attempt to parse any file under Finding 10 — High: read_document() opens any server-readable file with no sandbox enforcement, returning full content of /etc/shadow and /proc/self/environ
Affected file:
Intent vs actual:
This is strictly wider than F9: F9 is bounded to Steps to observe:
Impact:
An unauthenticated caller can retrieve any file the server process can read. Running as root, that includes Why F9 and F10 are listed separatelyA maintainer might be tempted to fix only one, on the theory that F10 dominates F9. Two reasons to fix both:
Suggested remediation
Affected versions
0.1.0
0.1.1
0.1.2
0.1.3
0.1.4
0.1.5
0.1.6
Fixed in
0.1.7
References Updated Oct 21, 2026 · Source: OSV.dev
CVE-2026-114107
GHSA-jqmf-mx4f-hfr6
Oct 02, 2026
Vibe-Trading LLM-callable tools permit command execution, code injection, and SSRF
10.0
/ 10
Critical
Network
Low
None
None
Changed
High
High
High
Summary:5 findings — Shared baseline (applies to all 5 findings)All five tools are members of the auto-discovered tool registry the LLM agent gets at startup; the LLM is free to call any of them based on the user prompt. The tool registration is unconditional in default config — no operator opt-in flag gates them. Combined with GHSA-1 / F1 (unauthenticated POST /sessions/{id}/messages), every primitive in this advisory is reachable from any anonymous TCP client to port 8899. The container has no The five primitives also share a second exposure: prompt-injection in any document the LLM agent processes. If the agent is asked to summarise an uploaded document containing the embedded instruction
Finding 6 — High: BashTool passes LLM-emitted command verbatim to subprocess.run(shell=True) with zero filtering
Affected file:
Intent vs actual: Steps to observe:
Impact: Finding 7 — High: BackgroundRunTool executes arbitrary shell commands asynchronously via subprocess.run(shell=True)
Affected file:
Intent vs actual: A runtime probe invoked the tool with Steps to observe:
Impact: Same as F6, with two additions: the asynchronous design makes the exfiltration harder to spot in access logs (the originating HTTP returns before the command completes), and Finding 8 — High: Backtest runner exec_modules attacker-stageable signal_engine.py before validation, executing top-level statements unconditionally
Affected file:
Intent vs actual: A runtime probe wrote Steps to observe:
Impact: This is an independent RCE path that does not match signatures for "shell command invocation" — endpoint or process monitoring tuned to flag Finding B4 — Medium: read_url tool forwards LLM-supplied URL to Jina Reader without schema or host validation, enabling SSRF via the agent session
Affected file:
Intent vs actual: Steps to observe:
Impact: An unauthenticated attacker can use the agent as an outbound proxy via Jina's infrastructure, fingerprinting reachable internal services through HTTP status / title / partial content leaked back through the session stream. The absence of schema validation also forwards Finding B5 — Low: Jinja2 codegen with autoescape disabled for .py.j2 templates allows code injection into generated signal_engine.py
Affected file:
Intent vs actual: The Jinja2 autoescape system is intended to prevent arbitrary string content from being rendered verbatim into generated source. The actual configuration restricts autoescape to Reachability: In normal session flows, Why I am including this finding rather than dropping it: if the team patches F8 by adding a stronger AST validator at line 115 (e.g. rejecting top-level non-import / non-class statements), the F-B5 sink remains a way to inject code that passes validation by closing the Python string literal and emitting valid statements that still leave the Steps to observe (runs entirely inside the running container; no LLM key required):
Suggested fix: change Suggested remediation (per finding)
Affected versions
0.1.0
0.1.1
0.1.2
0.1.3
0.1.4
0.1.5
0.1.6
Fixed in
0.1.7
References Updated Oct 21, 2026 · Source: OSV.dev |