Feed/GHSA-v2f8-6655-7grj
GHSA-v2f8-6655-7grjCRITICALCVSS 10.0

Vibe-Trading FastAPI endpoints permit unauthenticated access, file upload, and an RCE chain

Published Oct 2, 2026·Updated Oct 2, 2026

NVD Description

### Summary: 5 findings — unauthenticated full-API exposure (F1, lead Critical), read-side authorization gap that persists even with `API_AUTH_KEY` set (F2), unauthenticated file write of `.py`/`.sh`/`.yaml` to a server-returned path (F3), default-permissive CORS that combines with a loopback-only check to grant any browser page on whitelisted localhost ports credentialed cross-origin access (F-A4), and partial API-key disclosure via `_mask_secret()` (F-A5). --- ### Shared baseline (applies to all 5 findings) The shipped `agent/.env.example` line 112 ships `# API_AUTH_KEY=` commented out. `require_auth()` at `agent/api_server.py` line 303 executes `if not api_key: return` and returns `None` immediately when `API_AUTH_KEY` is unset, so every endpoint decorated with `dependencies=[Depends(require_auth)]` operates as unauthenticated. The shipped `Dockerfile` does **not** contain a `USER` directive, so the FastAPI process runs as `uid=0(root)` inside the container (verified: `docker exec id` returns `uid=0(root) gid=0(root)`). The `docker-compose.yml` binds `0.0.0.0:8899` with no network restriction. 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) ```sh git clone https://github.com/HKUDS/Vibe-Trading.git cd Vibe-Trading git checkout 7452610113a75529b5d55fd2217bb17f7bec66f7 # v0.1.6 + 1 frontend fix; same vuln state as v0.1.6 cp agent/.env.example agent/.env # (For F1 chained demo only:) edit agent/.env to set OPENROUTER_API_KEY=<real key> docker compose up -d # port 8899 is now reachable; HOST below is the docker host's IP from the attacker's perspective ``` > **Note on the `HOST` placeholder used throughout the per-finding "Steps to observe" blocks below**: replace `HOST` with the address you reach the docker host on — typically `localhost` (or `127.0.0.1`) if you are running the reproducer on the same machine as the container. All `curl` commands below assume this substitution. --- ### Finding 1 — Critical: Unauthenticated network client reaches shell execution via POST /sessions/{id}/messages - **Severity**: Critical - **CVSS v3.1**: 9.8 — `AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:H` - **CVSS v4.0**: 10.0 — `AV:N/AC:L/AT:N/PR:N/UI:N/VC:H/VI:H/VA:H/SC:H/SI:H/SA:H` - **CWE**: CWE-306 (Missing Authentication for Critical Function); chains into CWE-78 (Group B, F6) **Affected files**: - `agent/api_server.py:303` — `if not api_key: return` early return in `require_auth()` - `agent/api_server.py:736` — `@app.post("/sessions/{session_id}/messages", dependencies=[Depends(require_auth)])` (the dependency is a no-op when `API_AUTH_KEY` is unset) - `agent/src/tools/bash_tool.py:44-46` — `subprocess.run(command, shell=True, cwd=cwd)` with command read from `kwargs['command']` (full bug detail tracked in GHSA-2 / Group B / F6) **Intent vs actual**: The session API is intended to serve authenticated users only. When `API_AUTH_KEY` is unset, `require_auth()` returns `None` immediately and `dependencies=[Depends(require_auth)]` becomes a no-op. Any anonymous TCP client to port 8899 can therefore create a session, post a message, and receive the LLM agent's response. The LLM ReAct agent — given a natural-language request to run a command — selects `BashTool` from the auto-discovered registry, which calls `subprocess.run(command, shell=True)` with the LLM-emitted string. The container has no `USER` directive, so the resulting process runs as `uid=0(root)`. **Steps to observe**: 1. Start the server per the shared reproducer above (with a working `OPENROUTER_API_KEY` set in `agent/.env`). Confirm `curl -fs http://HOST:8899/health` returns 200. 2. `SID=$(curl -s -X POST http://HOST:8899/sessions -H 'Content-Type: application/json' -d '{}' | python3 -c "import json,sys;print(json.load(sys.stdin)['session_id'])")` 3. `curl -s -X POST "http://HOST:8899/sessions/$SID/messages" -H 'Content-Type: application/json' -d '{"content":"Execute the shell command '\''id && uname -a'\'' and report the output verbatim."}'` 4. Wait ~5–15 seconds, then `curl -s "http://HOST:8899/sessions/$SID/messages"` and observe the BashTool result message containing `uid=0(root)`, the kernel version, and the container hostname — all returned with no `Authorization` header on any of the three requests. **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 `USER` directive in the Dockerfile, the blast radius is full container takeover. --- ### Finding 2 — High: Read endpoints return full session history with no authentication, even when API_AUTH_KEY is set - **Severity**: High - **CVSS v3.1**: 7.5 — `AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:N` - **CVSS v4.0**: 8.7 — `AV:N/AC:L/AT:N/PR:N/UI:N/VC:H/VI:N/VA:N/SC:N/SI:N/SA:N` - **CWE**: CWE-862 (Missing Authorization) **Affected file**: `agent/api_server.py` — `require_auth()` docstring at line 289 states "Only write endpoints (POST/PUT/DELETE/PATCH) use this dependency." Read endpoints with no `Depends(require_auth)`: - line 804 — `@app.get("/runs", response_model=List[RunInfo])` - line 788 — `@app.get("/runs/{run_id}", response_model=RunResponse)` - line 748 — `@app.get("/runs/{run_id}/code")` - line 769 — `@app.get("/runs/{run_id}/pine")` - line 1153 — `@app.get("/sessions", response_model=List[SessionResponse])` - line 1173 — `@app.get("/sessions/{session_id}", response_model=SessionResponse)` - line 1251 — `@app.get("/sessions/{session_id}/messages", response_model=List[MessageResponse])` - line 1272 — `@app.get("/sessions/{session_id}/events")` - line 1444 — `@app.get("/swarm/runs")` **Intent vs actual**: When `API_AUTH_KEY` is configured, the implicit operator expectation is that all session data is protected. The actual design is documented in the docstring at line 289 — read endpoints have no `Depends(require_auth)`, so they remain unauthenticated even with `API_AUTH_KEY` set. A runtime probe with `API_AUTH_KEY=any-secret-value` configured: a session was created with a valid Bearer token, a message containing `BROKER_TOKEN=ts-secret-deadbeef-real-private-data` was posted, then `GET /sessions/{id}/messages` was issued with **no** `Authorization` header and returned HTTP 200 with the broker token string verbatim in the response — confirming the gap persists when authentication is enabled. **Steps to observe**: 1. Set `API_AUTH_KEY=any-secret-value` in `agent/.env`. Under docker compose, add a bind-mount on the `vibe-trading` service so the container reads the change: `volumes: - ./agent/.env:/app/agent/.env:ro`. Then `docker compose up -d --force-recreate` (a plain `restart` reuses the existing process env and will not pick up the change). 2. `SID=$(curl -s -X POST http://HOST:8899/sessions -H 'Authorization: Bearer any-secret-value' -H 'Content-Type: application/json' -d '{}' | python3 -c "import json,sys;print(json.load(sys.stdin)['session_id'])")` 3. `curl -s -X POST "http://HOST:8899/sessions/$SID/messages" -H 'Authorization: Bearer any-secret-value' -H 'Content-Type: application/json' -d '{"content":"BROKER_TOKEN=ts-secret-test-value"}'` (this requires the Bearer token because POST is auth-protected) 4. **No-auth read** — `curl -s "http://HOST:8899/sessions/$SID/messages"` (no `Authorization` header). Observe HTTP 200 with the broker token visible. 5. Also: `curl -s "http://HOST:8899/runs"` returns all run records (including their prompt fields) with no auth. **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 - **Severity**: High - **CVSS v3.1**: 8.1 — `AV:N/AC:L/PR:N/UI:N/S:C/C:N/I:H/A:N` - **CVSS v4.0**: 8.7 — `AV:N/AC:L/AT:N/PR:N/UI:N/VC:N/VI:H/VA:N/SC:H/SI:H/SA:N` - **CWE**: CWE-434 (Unrestricted Upload of File with Dangerous Type) **Affected file**: - `agent/api_server.py:1310-1321` — `_BLOCKED_UPLOAD_EXT` set rejects `.exe`, `.msi`, `.bat`, `.cmd`, `.com`, `.scr`, `.app`, `.dmg`, `.so`, `.dll`, `.dylib`, `.zip`, `.rar`, `.7z`, `.tar`, `.gz`, `.tgz`, `.bz2`, `.xz` — but **not** `.py`, `.sh`, `.yaml`, `.j2`, `.json`, `.html`, or `Dockerfile` - `agent/api_server.py:1347` — `@app.post("/upload", dependencies=[Depends(require_auth)])` (no-op when `API_AUTH_KEY` unset) **Intent vs actual**: `POST /upload` is intended as an authenticated file-staging mechanism. In default config the auth dependency is a no-op (per F1). The extension blocklist is a denylist not an allowlist, so dangerous executable-adjacent types pass through. The uploaded file is saved as `<uuid>.<ext>` and the **full resolved server path is returned in the response body** under `"file_path"`, so the attacker does not need to guess paths. **Steps to observe** (no LLM key required): 1. Start the server in default config (no `API_AUTH_KEY`). 2. `curl -s -X POST http://HOST:8899/upload -F 'file=@/dev/stdin;filename=payload.py' <<< 'print("ATTACKER_CONTROLLED")'` 3. Observe HTTP 200 with JSON containing `"status":"ok"` and `"file_path":"/app/agent/uploads/<uuid>.py"`. 4. Repeat with `filename=config.yaml` and `filename=run.sh` to confirm multiple executable-adjacent types pass. **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 - **Severity**: Medium - **CVSS v3.1**: 7.7 — `AV:N/AC:H/PR:N/UI:R/S:C/C:H/I:H/A:N` - **CVSS v4.0**: 6.3 — `AV:N/AC:L/AT:P/PR:N/UI:P/VC:H/VI:L/VA:N/SC:N/SI:N/SA:N` - **CWE**: CWE-942 (Permissive Cross-domain Policy with Untrusted Domains); CWE-346 (Origin Validation Error) **Affected file**: - `agent/api_server.py:252-264` — `_CORS_ORIGINS = os.getenv(...)` defaults to a list of six localhost origins (`http://localhost:3000`, `:5173`, `:8000`; same for `127.0.0.1`); `CORSMiddleware` is added with `allow_credentials=True`, `allow_methods=["*"]`, `allow_headers=["*"]` - `agent/api_server.py:309-336` — `_is_local_client()` and `require_local_or_auth()`: the loopback check examines `request.client.host` (TCP peer IP), which is `127.0.0.1` for **any** browser request from the same machine, regardless of the page's origin - `agent/api_server.py:908` — `dependencies=[Depends(require_local_or_auth)]` on `/settings/llm` and related endpoints (granted to any browser request from the host) **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 `_is_local_client()` examines the TCP peer IP (always `127.0.0.1` for browser requests from the host), browser-driven cross-origin requests from a whitelisted origin also bypass the loopback restriction on `/settings/*`, which would otherwise have been the only barrier. **Steps to observe** (no LLM key required): 1. Start the server in default config. 2. Preflight: `curl -s -X OPTIONS "http://HOST:8899/sessions" -H "Origin: http://localhost:3000" -H "Access-Control-Request-Method: POST" -i` — observe the response includes `access-control-allow-credentials: true`, `access-control-allow-origin: http://localhost:3000`, and `access-control-allow-methods: DELETE, GET, HEAD, OPTIONS, PATCH, POST, PUT`. 3. Confirm a real `POST /sessions` with `Origin: http://localhost:3000` returns the same allow-credentials header in the response so a browser can read the body. 4. Preflight against a settings endpoint: `curl -s -X OPTIONS "http://HOST:8899/settings/llm" -H "Origin: http://localhost:3000" -i`. Then `curl -s "http://HOST:8899/settings/llm" -H "Origin: http://localhost:3000"` and observe the response is allowed because `request.client.host = 127.0.0.1` satisfies `_is_local_client()`. 5. Negative control: `curl -s -X OPTIONS "http://HOST:8899/sessions" -H "Origin: http://evil.example.com" -i` — observe no CORS headers, demonstrating the allowlist is functional for non-localhost origins. **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 `fetch()` calls. This expands the F1-F3 surface from direct TCP attackers to browser-mediated attackers that share a host with a developer running the agent. --- ### Finding A5 — Medium: Settings endpoints expose first-4 + last-4 characters of every configured API key via _mask_secret() - **Severity**: Medium - **CVSS v3.1**: 5.3 — `AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:N/A:N` - **CVSS v4.0**: 6.9 — `AV:N/AC:L/AT:N/PR:N/UI:N/VC:L/VI:N/VA:N/SC:N/SI:N/SA:N` - **CWE**: CWE-200 (Exposure of Sensitive Information) **Affected files**: - `agent/api_server.py:467-474` — `_mask_secret()` returns `f"{value[:4]}...{value[-4:]}"` for any string longer than 8 characters - `agent/api_server.py:372` — `LLM_API_KEY_PLACEHOLDERS` filters out shipped placeholders so the leak fires only when a real key is configured - `agent/api_server.py:505-522` — `GET /settings/llm` returns `api_key_hint = _mask_secret(api_key) if api_key_configured else None` - `agent/api_server.py:561` — `GET /settings/data-sources` returns `tushare_token_hint=_mask_secret(token) if token_configured else None` - `agent/test_settings_api.py:106` — assertion `api_key_hint == "or-s...alue"` for input `or-secret-value` confirms the 4+4 reveal is the intended API contract **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 (`sk-or-v1-`, `gsk_`, `xoxb-`, `ts-`), the leading 4 bytes are largely fixed and the entropy leak is concentrated in the trailing 4 — which can be material for tokens with bounded total entropy (e.g. Tushare tokens). A runtime probe configured `OPENROUTER_API_KEY=sk-or-v1-AbCdEfGhXyZ12345fakekey` and `TUSHARE_TOKEN=ts-real-shaped-token-1234567890ab` and observed `api_key_hint='sk-o...ekey'` and `tushare_token_hint='ts-r...90ab'` from the corresponding GET endpoints. **Steps to observe** (no LLM key required other than the configured value being non-placeholder; the call itself does not consume the LLM): 1. Edit `agent/.env` to replace the placeholder with a real-shaped key, e.g. `OPENROUTER_API_KEY=sk-or-v1-TestKeyAbcde12345`. Restart the server. 2. From any loopback client *or* via the F-A4 cross-origin path, `curl -s "http://127.0.0.1:8899/settings/llm"` (no `Authorization` header). 3. Observe HTTP 200 with `api_key_configured=true` and `api_key_hint` containing the first 4 and last 4 characters of the real key. 4. `curl -s "http://127.0.0.1:8899/settings/data-sources"` to observe `tushare_token_hint` follow the same pattern. **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) 1. **F1 / F3** — `require_auth()` must fail closed when `API_AUTH_KEY` is not set. Either raise on startup if the env var is empty, or generate a random per-install key and emit a one-time bootstrap message. Replace the `if not api_key: return` shortcut at line 303 with explicit handling of dev-vs-production. 2. **F2** — Apply `Depends(require_auth)` to all read-side `@app.get()` decorators (`/runs*`, `/sessions*`, `/swarm/runs*`). The current docstring at line 289 ("Only write endpoints use this dependency") describes the bug rather than design intent. 3. **F3** — Convert `_BLOCKED_UPLOAD_EXT` to an allowlist (`.csv`, `.tsv`, `.json`, `.pdf`, `.txt`, `.xlsx`, `.docx` etc.) rather than a denylist; add `.py`, `.sh`, `.yaml`, `.j2`, `Dockerfile` to the rejection set in any case. Place uploads in a directory outside the agent's tool-discovery envelope. 4. **F-A4** — Tighten `_CORS_ORIGINS` default to only `http://localhost:5173` (the bundled Vite dev port). Decouple `_is_local_client` from `request.client.host` — require either a Bearer token *or* a positive `Origin` header check, not the TCP peer IP. Document loud that adding any port to `_CORS_ORIGINS` grants full credentialed cross-origin API access. 5. **F-A5** — Replace `_mask_secret()` with a fixed placeholder ("•••configured•••") or a boolean presence flag. If the UI requires a hint, hash the key (truncated SHA-256) so the hint cannot be inverted to bytes of the original. ---

Affected Packages (1)

vibe-trading-aiPYPI
From 0.1.0
Fixed in 0.1.7

Public Exploits & PoCs100 found

PoC: CVE-2026-85097-Toolkit

CVE-2026-85097 – Bricksforge WordPress Plugin Unauth File Upload to RCE Toolkit (CVSS 10.0) | Red/Blue Team suite for Bricksforge Pro Forms < 3.1.8.9. 2 tools: Full Exploit (polyglot upload, web shell, mass scan, OPSEC, SQLite/JSON output) + SafeChecker (version detect, non-intrusive audit). Ethical & educational use only.

1

PoC: CVE-2026-102489

CVE-2026-102489 exploit in golang

1

PoC: sqli-cve-2026-102428

PoC: OrdaSoft Joomla OS CCK (com_os_cck) 8.3.15 unauth SQLi —mass+exploit+dork

1

PoC: debian-on-s23-ultra

A Samsung Galaxy S23 Ultra running Debian 13 as a server. The bootloader is locked, so an app re-establishes root after every reboot: Shizuku, CVE-2026-43499, KernelSU Next late-load, then a Debian chroot with sshd. One APK, quickstart, chroot bootstrap, and notes on everything that did not work.

1

PoC: CVE-2026-88776

Write-up for CVE-2026-88776

1

PoC: CVE-2026-80428

ILIAS ≤ 9.21 / 10.9 / 11.2 — Unauthenticated PHP Object Injection (RCE)

1

PoC: CVE-2026-68582-PoC

PoC for CVE-2026-68582 / GHSA-rj9j-8772-4h6c — Vikunja link-share BOLA

PoC: dymo-id-cve-poc

PoCs for CVE-2026-102262 & CVE-2026-101893 — code execution and XXE in DYMO ID (reported & fixed)

PoC: CVE-2026-72898-metabase

CVE-2026-72898 Metabase Security Tools

PoC: CVE-2026-107159

MiniUPnPd <= 2.3.11 Divide-by-Zero DoS via SSDP M-SEARCH MX Header

PoC: CVE-2026-97229-GitLab-CI-CD-Regex-Compiler-RCE

CVE-2026-97229 — GitLab CI/CD Regex Compiler RCE

PoC: CVE-2026-104711-Advanced-Variant

POC for CVE-2026-104711-Advanced-Variant

PoC: KDSExtract

Exploits CVE-2026-58222 to recover Samba KDS root keys and derive gMSA credentials from a low-privilege domain account.

PoC: CVE-2026-104711-exploit-payload-4

POC for the CVE-2026-104711 new variants

PoC: CVE-2026-104711-POC-Variant3

POC for the CVE-2026-104711 which is a new variant

PoC: CVE-2026-104711

POC for the CVE-2026-104711

PoC: CVE-2026-85097

POC CVE-2026-85097

PoC: CVE-2026-41992-poc

POC for the CVE-2026-41992

PoC: fromagegate

FROMAGEGATE — PoC + detection toolkit for Danfoss AK-SM 8xxA CVE-2025-41450/-41451/-41452 (code-of-the-day auth bypass, alarm-to-mail RCE, nginx config injection). For detection-signature development.

PoC: rails-doubletap-py

Automated Ruby on Rails doubletap RCE (CVE-2019-5418 + CVE-2019-5420) in pure Python, using the ERB#def_module gadget for modern Ruby.

PoC: CVE-2026-3888-PoC

CVE-2026-3888 PoC; discovered by the Qualys Threat Research Unit (TRU).

PoC: CVE-2025-32432-craftcms-rce

Working PoC + debugging writeup for CVE-2025-32432 (Craft CMS pre-auth RCE)

PoC: CVE-2026-84411-reproduction

CVE-2026-84411 root cause notes and a non-destructive probe (RouterOS before 7.24)

PoC: sonicwall-sma-1000-cve-2026-102255

A complete guide and workflow for integrating Agile sprints with DevOps CI/CD pipelines.

PoC: smartermail

CVE-2026-104082, CVE-2026-104083, CVE-2026-104084

PoC: CVE-2026-91737

CVE-2026-91737 Chrome renderer RCE PoC (PDFium)

PoC: CVE-2026-102255

CVE-2026-102255 - Draft or TODO

PoC: CraftCMS-CVE-2026-79987

Authenticated RCE exploit for Craft CMS 5.9.0–5.10.12 (CVE-2026-79987). Time-based save-action oracle + raw-TCP exfil. Verified on vanilla lab.

PoC: kgsl-1905-msm8953

Research notes & harnesses: KGSL SVM use-after-free (CVE-2021-1905) on Qualcomm MSM8953 / Adreno 506 / kernel 3.18 armv7. Credits upstream patches and prior art.

PoC: postgres-basebackup-symlink

PostgreSQL 18.6 - High - Remote - File write - pg_basebackup follows absolute tar symlink leftover of CVE-2026-6475

PoC: CVE-2026-103889

Proof of concept and isolated Docker lab for CVE-2026-103889, an unauthenticated RCE vulnerability in Expivi 3D Product Configurator for WooCommerce ≤ 2.16.2.

PoC: CVE-2026-9586_POC_EXPLOIT

For new CVEs without existing/working/non-mangled POCs

PoC: CVE-2026-91136

CVE-2026-91136 Divi Plus <= 2.4.0 unauthenticated arbitrary file read (mass scanner + exploit)

PoC: langflow-cve-2026-9198

Independent reconstruction, lab validation, and PoC for CVE-2026-9198, the Langflow unauthenticated RCE (fixed in 1.10.1)

PoC: metabase-cve-2026-72898

Independent reconstruction, lab validation, and PoC for CVE-2026-72898 — Metabase unauthenticated SQLi (patched in 0.63.5)

PoC: CVE-2026-15748

Unauthenticated RCE in WordPress Forminator Forms <= 1.56.1 (CVSS 9.8)

PoC: CVE-2026-104286-PoC

PoC CVE-2026-104286 FortiMail

PoC: ReactorWriteUp-HackTheBox

Reactor es una máquina Linux fácil vulnerable a CVE-2025-55182 (React2Shell), RCE sin autenticación en React Server Components. Accedemos como node, crackeamos un hash MD5 de una base de datos SQLite y pivotamos a engineer por SSH. La escalada abusa del flag --inspect de Node.js para ejecutar código como root vía depuración V8.

PoC: CVE-2026-105306

CVE-2026-105306: Token Introspection Audience Bypass via Dynamic Client Registration in Keycloak - Writeup by DungSoCool

PoC: GhostLock-Next

The next implementation of GhostLock CVE-2026-43499

PoC: ElasticRift

A vulnerable-by-design, secure-by-deployment NGINX pipeline centered around the aftermath of CVE-2026-42945 (NGINX Rift).

PoC: CVE-2026-27626

CVE-2026-27626 - OliveTin <3000.10.0 OS command injection via password-typed arguments, escalating to root when OliveTin runs as root.

PoC: Exploit-CVE-2026-40224

CVE-2026-40224: systemd-machined local privilege escalation

PoC: CVE-2026-41940-PoC

cPanel & WHM Authentication Bypass via CVE-2026-41940 explotation

PoC: CVE-2025-57819

FreePBX unauthenticated SQLi (endpoint module)

PoC: CVE-2026-43805

Binary diff analysis and non-destructive PoC for CVE-2026-43805

PoC: diskcache-community

Community-maintained hard fork of grantjenks/python-diskcache: SQLite-backed persistent cache for Python, with a fix path for CVE-2025-69872

PoC: CVE-2026-108592-poc

CVE-2026-108592 — Environment Variable Exposure PoC in mini-swe-agent

PoC: odin-od105-devkit

CVE-2019-2215 temporary root toolkit for Smartisan Nut Pro (OD105)

PoC: CVE-2026-84568

Reproducible macOS automountd research and lab PoCs for CVE-2026-84568 and CVE-2026-84570: fstype path traversal, NFS payload delivery, Gatekeeper behavior, and root code execution.

PoC: cs50-cybersecurity-final-project

Technical analysis of Log4Shell (CVE-2021-44228) for CS50 Cybersecurity.

PoC: CVE-2026-84411

CVE-2026-84411 — MikroTik RouterOS WebFig Integer Underflow Exploit

PoC: CVE-2025-9548

CVE-2025-9548: Lenovo Power Management Driver null-pointer dereference research and gated PoC

PoC: CVE-2026-69414

**CVE-2026-69414** is an elevation of privilege vulnerability in the **Microsoft Malware Protection Engine** (part of Windows Defender / Microsoft Defender Antivirus), publicly referred to as **"RoguePlanet"**. It represents a **patch bypass** of the original vulnerability **CVE-2026-50656**.

PoC: CVE-2026-103690

SQL injection (CWE-89) in itsourcecode Leave Management System 1.0 - CVE-2026-103690 / VulDB VDB-412559

PoC: CVE-2026-102428

CVE-2026-102428 PoC: OrdaSoft Joomla OS CCK (com_os_cck) <=8.3.15 unauth SQLi — order_field/order_direction ORDER BY injection on public listings. Check + mass exploit, POCBIT-102428-OK marker, CVSS 9.3. https://pocbit.org/pocs/cve-2026-102428

PoC: CVE-2026-106445

CVE-2026-106445 — Handlebars 4.0.0–4.7.9 RCE via Function.prototype.constructor bypass (GHSA-p8wg-vrv2-v86f). PoCbit PoC + Docker lab (4.7.9), check/exploit HTTP client, GHSA template chain. Fixed 4.7.10. https://pocbit.org/pocs/cve-2026-106445

PoC: CVE-2026-107806

CVE-2026-107806 — nginx-ui 2.3.8–2.4.x auth RCE via forged backup restore (TestConfigCmd). PoCbit PoC: GET /api/backup, tamper app.ini, POST /api/restore, POST /api/nginx/test. check/exploit, batch url|JWT. Fixed 2.5.0. https://pocbit.org/pocs/cve-2026-107806

PoC: ModelSim-Decryptor

CVE-2021-42023

PoC: CVE-2026-94503

Zombify <= 1.7.7 Unauthenticated Arbitrary File Upload

PoC: CVE-2026-85097

Bricksforge <= 3.1.8.9 Unauthenticated Arbitrary File Upload

PoC: Docker-Lab-CVE-2024-4367

Docker lab to test proof of concepts for CVE-2024-4367. A high-severity type confusion and remote code execution flaw in Firefox PDF.js font handling due to missing type checks (affecting Firefox < 126, Firefox ESR < 115.11, and PDF.js < 4.2.67).

PoC: braces-security-backport

MIT-licensed braces 3.0.3 with reviewed CVE-2026-93687 depth backport; pinned consumption only

PoC: fortimail-cve-2026-104286-response

FortiMail CVE-2026-104286 (CVSS 9.8) 점검·대응 도구 (버전 확인, IoC 점검, 완화·패치 체크리스트)

PoC: telegram-cve-2026-107181

Telegram CVE-2026-107181

PoC: CVE-2026-84520

AppleFDEKeyStore poc

PoC: larkspur-billing

Synthetic-data billing portal pinned to next@14.2.24 (CVE-2025-29927) — test customer for oopsie

PoC: apache-tomcat-security-audit

Penetration test of Apache Tomcat — Ghostcat, CVE-2017-12615 and Struts2/OGNL exploitation with MITRE ATT&CK mapping

PoC: CVE-2026-21589

Atlassian Arbitrary File Read

PoC: honor90-ghostlock

GhostLock (CVE-2026-43499) + KernelSU late-load port for Honor 90 REA-NX9, MagicOS 9.0.0.211 / Android 15 (pure-GKI 5.10.236). Fork of GhostLock-H80GT.

PoC: CVE-2025-34071

RCE in Kerio Control 9.4.5 via unsigned firmware update.

PoC: honor-90gt-mag-an00-root-research

荣耀 90 GT (MAG-AN00) 提权尝试全记录:CVE-2026-64560 移植、堆喷射原语穷举与漏洞判定方法论

PoC: CVE-2026-28775

CVE-2026-28775 SNMP RCE

PoC: CVE-2021-26828

Corrected python code for CVE-2021-26828

PoC: citrix-netscaler-rce-cve-2026-107406

A complete guide and workflow for integrating Agile sprints with DevOps CI/CD pipelines.

PoC: CVE-2026-94597-poc

CVE-2026-94597

PoC: REDMI_Root

Redmi Pad Pro (dizi) 内核 Root 方案 — CVE-2026-43499 select_stack 适配,KernelSU 越狱模式

PoC: exploit-docs

the files/docs for various exploits, such as (LTBEEF, Sh1mmer, CryptoSmite, RMASmoke, aka: CVE-2025-1122, etc.)

PoC: Root-My-Galaxy-Payloads-SM-S928N

Device-specific CVE-2026-43499 payload profile for Galaxy S24 Ultra SM-S928N (S928NKSU6EZIF, Android 17, kernel 6.1.162)

PoC: CVE-2026-55450

CVE-2026-55450

PoC: vulhub-php-cve-2012-1823

Vulhub php/CVE-2012-1823: PHP-CGI Query String Argument Injection (CVE-2012-1823), run with Isoloom

PoC: vulhub-unomi-cve-2020-13942

Vulhub unomi/CVE-2020-13942: Apache Unomi MVEL/OGNL Injection RCE (CVE-2020-13942), run with Isoloom

PoC: vulhub-libssh-cve-2018-10933

Vulhub libssh/CVE-2018-10933: libssh Server Authentication Bypass (CVE-2018-10933), run with Isoloom

PoC: vulhub-spring-cve-2016-4977

Vulhub spring/CVE-2016-4977: Spring Security OAuth2 Whitelabel SpEL RCE (CVE-2016-4977), run with Isoloom

PoC: vulhub-rails-cve-2018-3760

Vulhub rails/CVE-2018-3760: Ruby on Rails Sprockets Path Traversal (CVE-2018-3760), run with Isoloom

PoC: vulhub-h2database-cve-2022-23221

Vulhub h2database/CVE-2022-23221: H2 Database Console JDBC URL RCE (CVE-2022-23221), run with Isoloom

PoC: vulhub-flink-cve-2020-17519

Vulhub flink/CVE-2020-17519: Apache Flink JobManager Directory Traversal (CVE-2020-17519), run with Isoloom

PoC: vulhub-elasticsearch-cve-2014-3120

Vulhub elasticsearch/CVE-2014-3120: Elasticsearch MVEL Dynamic Script RCE (CVE-2014-3120), run with Isoloom

PoC: vulhub-dubbo-cve-2019-17564

Vulhub dubbo/CVE-2019-17564: Apache Dubbo HTTP Protocol Deserialization (CVE-2019-17564), run with Isoloom

PoC: vulhub-cacti-cve-2022-46169

Vulhub cacti/CVE-2022-46169: Cacti remote_agent.php Command Injection (CVE-2022-46169), run with Isoloom

PoC: vulhub-apisix-cve-2020-13945

Vulhub apisix/CVE-2020-13945: Apache APISIX Default Admin Token RCE (CVE-2020-13945), run with Isoloom

PoC: vulhub-spring-cve-2022-22947

Vulhub spring/CVE-2022-22947: Spring Cloud Gateway Actuator Code Injection (CVE-2022-22947), run with Isoloom

PoC: vulhub-redis-cve-2022-0543

Vulhub redis/CVE-2022-0543: Redis Lua Sandbox Escape (CVE-2022-0543), run with Isoloom

PoC: vulhub-jmeter-cve-2018-1297

Vulhub jmeter/CVE-2018-1297: Apache JMeter RMI Deserialization RCE (CVE-2018-1297), run with Isoloom

PoC: vulhub-activemq-cve-2016-3088

Vulhub activemq/CVE-2016-3088: ActiveMQ Fileserver Arbitrary File Write (CVE-2016-3088), run with Isoloom

PoC: vulhub-glassfish-cve-2017-1000028

Vulhub glassfish/CVE-2017-1000028: GlassFish 4.1 Admin Console Arbitrary File Read (CVE-2017-1000028), run with Isoloom

PoC: vulhub-appweb-cve-2018-8715

Vulhub appweb/CVE-2018-8715: Appweb Digest Authentication Bypass (CVE-2018-8715), run with Isoloom

PoC: mhl-off-hook-writeup

a challenge for a CVE-2026-49881

PoC: vulhub-openssh-cve-2018-15473

Vulhub openssh/CVE-2018-15473: OpenSSH 7.7 Username Enumeration (CVE-2018-15473), run with Isoloom

PoC: vulhub-opensmtpd-cve-2020-7247

Vulhub opensmtpd/CVE-2020-7247: OpenSMTPD MAIL FROM Command Injection (CVE-2020-7247), run with Isoloom

CVSS Vector

CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:H

References

View on NVD Search GitHub Search Google

Get alerted for CVEs like this

Register your stack and get notified within minutes when a matching CVE drops.

Start monitoring free