Kan SSRF via Attachment Download Endpoint — CVE-2026-32255
by kOaDT (koadt@proton.me) · 2026-07-05
- Severity
- High
- CVE
- CVE-2026-32255 (GHSA-qrx8-9hc6-jvqg)
- Category
- web
- Affected product
- Kan (kanbn/kan) open-source project management tool
- Affected versions
- Kan <= 0.5.4 (fixed in 0.5.5)
- Disclosed
- 2026-07-05
- Patch status
- patched
References
Archive entry
intelseclab/poc-archiveMetadata
| Field | Value |
|---|---|
| Date Added | 2026-07-05 |
| Last Updated | 2026-03 |
| Author / Researcher | kOaDT (koadt@proton.me) |
| CVE / Advisory | CVE-2026-32255 (GHSA-qrx8-9hc6-jvqg) |
| Category | web |
| Severity | High |
| CVSS Score | 8.6 (AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:N/A:N) |
| Status | PoC |
| Tags | ssrf, kan, project-management, cwe-918, cloud-metadata, unauthenticated, full-read-ssrf |
| Related | N/A |
Affected Target
| Field | Value |
|---|---|
| Software / System | Kan (kanbn/kan) open-source project management tool |
| Versions Affected | Kan <= 0.5.4 (fixed in 0.5.5) |
| Language / Platform | TypeScript/Next.js target; Bash + Python 3 PoC tooling |
| Authentication Required | No |
| Network Access Required | Yes |
Summary
Kan’s attachment download proxy endpoint, GET /api/download/attatchment, is intended to stream S3-hosted attachments to clients but instead takes a fully attacker-controlled url query parameter and passes it directly to fetch() on the server with no validation, authentication, or hostname allowlisting. Because the full response body is relayed back to the caller (not blind), an unauthenticated attacker can use this endpoint to make the server issue arbitrary HTTP requests and read back the complete response — reaching internal-only services, cloud metadata endpoints, and other network-restricted resources. The included PoC spins up a mock “internal” credential-serving API and demonstrates the server fetching and leaking its contents through the vulnerable endpoint.
Vulnerability Details
Root Cause
apps/web/src/pages/api/download/attatchment.ts executes const upstream = await fetch(url) using a client-supplied url query parameter with no validation against the configured S3 endpoint or any other allowlist (CWE-918).
Attack Vector
- Attacker identifies the unauthenticated
GET /api/download/attatchment?url=...endpoint on a Kan instance. - Attacker supplies a
urlvalue pointing to an internal-only address (e.g. an internal API, database admin panel, or169.254.169.254cloud metadata IP) instead of a legitimate S3 attachment URL. - The Kan server performs the
fetch()server-side and streams the full response body back to the attacker in the HTTP response. - Attacker reads sensitive internal data (credentials, config, IAM metadata) directly from the response, or repeats the request against a range of internal hosts/ports to map the internal network.
Impact
Full-read, unauthenticated SSRF enabling access to internal services and cloud metadata endpoints, network reconnaissance/port scanning, and potential exfiltration of credentials or other sensitive internal data.
Environment / Lab Setup
Target: Kan v0.5.4 (docker-compose stack: Kan, Postgres, Redis, S3-compatible storage) on http://localhost:3000
Attacker: Docker & Docker Compose, Bash, curl, Python 3 (for the mock internal service)
Proof of Concept
PoC Script
See
exploit.shandinternal-service.pyin this folder.
| |
internal-service.py starts a mock internal API on port 8888 that returns fake credentials, simulating a network-isolated service. exploit.sh checks that the target’s attachment-download endpoint is reachable, then requests it with url pointing at the mock internal service (auto-detecting the Docker bridge gateway), printing the leaked internal response body if the SSRF succeeds.
Detection & Indicators of Compromise
GET /api/download/attatchment?url=http://169.254.169.254/latest/meta-data/... HTTP/1.1
Signs of compromise:
- Requests to
/api/download/attatchmentwith aurlparameter resolving to internal/private IP ranges or the cloud metadata address. - Outbound connections from the Kan web server process to hosts other than the configured S3/storage endpoint.
- Full response bodies from internal-only services appearing in HTTP responses served to external clients.
Remediation
| Action | Detail |
|---|---|
| Primary fix | Upgrade to Kan v0.5.5 or later, which validates the url parameter against the configured S3 endpoint hostname before proxying |
| Interim mitigation | Block external access to the download endpoint at the reverse proxy, or restrict egress from the application server to only the legitimate storage endpoint. |
References
Notes
Mirrored from https://github.com/kOaDT/poc-cve-2026-32255 on 2026-07-05.
| |