qdrant/qdrant:latest
CRITICAL · 88/100 · now✓ Trusted source · Vendor image · QdrantScanned Jul 16–17, 2026 · Trivy DB 2026-07-08 · base Debian 13.5 · runs as rootA Rust vector-database server shipped on a full Debian 13.5 base and running as root by default: 233 vulnerability findings (102 unique CVEs), 4 Critical and 26 High. The danger is not in qdrant's own code — it is the fat Debian base. Three of the four Criticals sit in perl-base, which a Rust binary never invokes; the fourth is a test framework (vitest) recorded in the dashboard's build SBOM. Do not deploy it as-is, as root, on this base.
Concretely: 212 of the findings live in the Debian OS layer — perl, util-linux, pam, ncurses, glibc — packages a single-binary server never runs, but they arm any attacker who reaches a shell and fail every compliance scan. 15 come from the web dashboard's build SBOM (Node/build tools, not browser-executable). 6 are Rust cargo crates compiled into the binary — the only genuinely embedded residue. 0 findings are in CISA KEV and EPSS is low across the set — high on paper, no current mass-exploitation.
- 0Eligibility gateqdrant is Debian + Rust → fails the strict Alpine+Go gate; we proceed in fixability mode, disclosed honestly
- 1ToolingTrivy, Syft (SBOM), cosign v2.4.1, Docker; EPSS/KEV enrichment — no Rust binary-reachability tool exists
- 2Initial scan & baseline233 findings / 102 CVEs; functional baseline probed (healthz, collections, vector search) before touching anything
Everything an AI agent needs to run the hardening around this button end-to-end — three rebuilds, each built and re-scanned, with a functional parity gate.
Note: the Wolfi rebuild removes the OS layer by construction — the 3 perl Criticals are gone, not hidden. The 6 cargo residual stay until an upstream qdrant rebuild.
- 3Hardening — 3 rebuildstrixie-slim → Wolfi → Wolfi API-only, each built and re-scanned; 233 → 6, all 4 Criticals eliminated
- 4-5Residue & VEX / SBOMtrace where each residual finding physically lives; honest VEX scoped by evidence level; SBOM kept, cosign verified
- 6-8Evidence & parity gateartifacts recorded; vector create / upsert / search all 200 on the hardened non-root read-only runtime
Hardening
| Build | Base | Findings | Crit | High | What changed |
|---|---|---|---|---|---|
| Original | Debian 13.5 | 233 | 4 | 26 | — |
| Hardened v1 | trixie-slim + apt upgrade | 187 | 4 | 23 | OS patch; base bloat stays (perl is Essential on Debian) |
| Hardened v2 | Wolfi (Chainguard) | 21 | 1 | 5 | OS layer → 0 CVEs; all 3 perl Criticals gone |
| Hardened v3 | Wolfi, API-only | 6 | 0 | 1 | + web dashboard removed (drops all 15 npm incl. the vitest Critical) |
Reachability / residue analysis
Rust cargo crates compiled into the binary
npm findings that are not browser-executable
js-yaml (Medium) — under investigation
Debian OS layer — gone under Wolfi
Runtime hardening & functional parity
▶What still ships in the binary
The 6 residual findings are Rust crates compiled into the 82 MB qdrant binary. None are Critical, none in KEV — but they are genuinely present, and only an upstream rebuild removes them.6 residual · 0 Critical
What still ships in the binary
| Severity | Crate | Advisory | Fix |
|---|---|---|---|
| HIGH | pyo3 | GHSA-36hh-v3qg-5jq4 | → 0.29.0 |
| MEDIUM | pyo3 | GHSA-chgr-c6px-7xpp | → 0.29.0 |
| MEDIUM | serde_with | GHSA-7gcf-g7xr-8hxj | → 3.21.0 |
| LOW ×3 | rand | GHSA-cq8v-f236-94qc | → 0.8.6 / 0.9.3 |
▶npm dashboard analysis
The 15 npm findings come from the dashboard's build SBOM. Per-package triage: which are actually shipped to the browser?1Critical (dev)13Not in browser1Investigate
npm dashboard analysis
| Package | Severity | Nature | Shipped to browser? |
|---|---|---|---|
| vitest | CRIT | test framework (marked DEV in SBOM) | no — builds the bundle, not in it |
| vite | HIGH | bundler | no — produces the bundle |
| @babel/core | LOW | transpiler | no — build-only |
| undici, form-data, ws, tar, @tootallnate/once | H M L | Node-only libraries | no — cannot execute in a browser |
| react-router | MED | browser router | not found in the compiled bundle |
| js-yaml | MED | YAML parser | possibly yes (1 hit in bundle) |
▶Image reputation & trust
Who publishes this image — context for how much to trust the source (as distinct from its contents).VendorFirst-partyPopularVector DBCurrentDebian 13.5
Image reputation & trust
▶Key findings log
The documented findings — 4 Criticals, the 15 npm dashboard packages, and the 6 residual cargo crates. The remaining ~208 OS findings (mostly Low/Unknown Debian base packages) are removed wholesale by the Wolfi rebase and enumerated in the Trivy JSON artifact.4Critical4High5Medium6Low
Key findings log
| ID | Severity | Package | Layer | Status | Fixed in | Summary |
|---|---|---|---|---|---|---|
| CVE-2026-13221 | CRITICAL | perl-base | OS · Debian | Removed (Wolfi) | base swap | Perl regex miscompilation — a Rust vector DB never invokes perl |
| CVE-2026-42496 | CRITICAL | perl-base | OS · Debian | Removed (Wolfi) | base swap | Archive-Tar path traversal |
| CVE-2026-8376 | CRITICAL | perl-base | OS · Debian | Removed (Wolfi) | base swap | Perl heap overflow |
| CVE-2026-47429 | CRITICAL | vitest | npm · dashboard | Removed (API-only) | component gone | Vitest RCE — a test framework in the build SBOM, not shipped as executable code |
| GHSA (npm) | HIGH | vite | npm · dashboard | Removed (API-only) | component gone | Bundler — produces the bundle, not in it |
| GHSA (npm) | HIGH | undici | npm · dashboard | Removed (API-only) | component gone | Node-only HTTP client — cannot execute in a browser |
| GHSA (npm) | HIGH | ws | npm · dashboard | Removed (API-only) | component gone | Node-only WebSocket library |
| GHSA (npm) | MEDIUM | form-data | npm · dashboard | Removed (API-only) | component gone | Node-only multipart library |
| GHSA (npm) | MEDIUM | react-router | npm · dashboard | Removed (API-only) | component gone | Browser router — not found in the compiled bundle |
| GHSA (npm) | MEDIUM | js-yaml | npm · dashboard | Under investigation | component gone | YAML parser — possibly bundled (1 hit); removed anyway in API-only build |
| GHSA (npm) | LOW | tar | npm · dashboard | Removed (API-only) | component gone | Node-only archive library |
| GHSA (npm) | LOW | @tootallnate/once | npm · dashboard | Removed (API-only) | component gone | Node-only utility |
| GHSA (npm) | LOW | @babel/core | npm · dashboard | Removed (API-only) | component gone | Transpiler — build-only |
| GHSA-36hh-v3qg-5jq4 | HIGH | pyo3 | cargo · binary | Affected | 0.29.0 | Compiled into the binary — fix by upstream cargo update |
| GHSA-chgr-c6px-7xpp | MEDIUM | pyo3 | cargo · binary | Affected | 0.29.0 | Compiled into the binary — fix by upstream cargo update |
| GHSA-7gcf-g7xr-8hxj | MEDIUM | serde_with | cargo · binary | Affected | 3.21.0 | Compiled into the binary — fix by upstream cargo update |
| GHSA-cq8v-f236-94qc | LOW | rand | cargo · binary | Affected | 0.8.6 / 0.9.3 | Compiled into the binary (finding 1 of 3) — fix by upstream cargo update |
| GHSA-cq8v-f236-94qc | LOW | rand | cargo · binary | Affected | 0.8.6 / 0.9.3 | Compiled into the binary (finding 2 of 3) — fix by upstream cargo update |
| GHSA-cq8v-f236-94qc | LOW | rand | cargo · binary | Affected | 0.8.6 / 0.9.3 | Compiled into the binary (finding 3 of 3) — fix by upstream cargo update |