← Back to Feed CACHED · 2026-08-12 15:09:51 · CACHE_KEY CVE-2026-72898
CVE-2026-72898 · CWE-89 · Disclosed 2026-08-10

Metabase

ASSESSED — NOISGATE V0.5
Vendor
Reassessed
Verdict:
Do you agree?
01 · The Real Story

Someone left the vault combination taped to the front door, and five banks have already been robbed

CVE-2026-72898 is an unauthenticated SQL injection in Metabase's POST /api/session/reset_password endpoint. The root cause is a failure to strip undeclared fields from the password-reset JSON body: an attacker sends a crafted user-id key containing a HoneySQL :raw directive, which Metabase's Clojure query-building stack interprets as literal SQL rather than a parameterized value. This grants blind SQL injection against the application database (H2, PostgreSQL, or MySQL depending on deployment), enabling the attacker to overwrite user records and promote themselves to Metabase administrator. From admin, the attacker reads every stored database connection string — including credentials for Snowflake, BigQuery, Redshift, Oracle, MongoDB, and PostgreSQL warehouses. Affected versions span 0.58 / 1.58 through 0.63.4 / 1.63.4. Fixed releases: 0.58.24, 0.59.21, 0.60.17, 0.61.11, 0.62.9, 0.63.5 (and corresponding 1.x Enterprise builds).

The vendor score of CVSS 10.0 CRITICAL is fully warranted and, if anything, undersells the blast radius. This is not a theoretical risk: five companies — Framework, Tally, n8n, Kilo Code (Anaconda), and ChecklyHQ — suffered confirmed breaches *before* the CVE was even published. CISA added it to the KEV catalog on August 11, 2026. Public proof-of-concept code has been available since August 10. The attack requires zero authentication, zero user interaction, and trivial complexity. Every self-hosted Metabase instance reachable from the internet is a live target right now.

"Unauthenticated SQLi in Metabase password reset is being exploited now. Patch or pull offline today."
02 · The Attack Path

5 steps from start to impact.

STEP 01

Discover Internet-Facing Metabase

The attacker scans for Metabase instances using Shodan, Censys, or FOFA. Approximately 2,500 instances appear in Shodan's public inventory. Wiz reports ~13% of cloud environments run self-hosted Metabase, and ~25% of those are internet-accessible. Fingerprinting is trivial: the /api/session/properties endpoint returns the exact version number without authentication.
Conditions required:
  • Target runs self-hosted Metabase 0.58–0.63.4 or 1.58–1.63.4
  • Instance is reachable over HTTP/HTTPS
Where this breaks in practice:
  • Metabase Cloud (hosted SaaS) instances are not affected — only self-hosted
  • Some orgs place Metabase behind VPN or SSO gateway, removing internet exposure
Detection/coverage: Shodan/Censys/runZero asset inventory will identify exposed instances. WAF rules matching user-id in POST body to /api/session/reset_password can flag attempts.
STEP 02

Send Crafted Password-Reset Request

The attacker sends a POST /api/session/reset_password with an extra user-id field containing a HoneySQL :raw directive: {"token":"x","password":"y","user-id":{"raw":"(SELECT ...)"}}. Clojure's merge function combines the attacker-supplied map with the authentication result without stripping unknown keys. Since the token is invalid, the auth layer returns an error — but the injected user-id key survives untouched in the merged map.
Conditions required:
  • Network access to /api/session/reset_password
Where this breaks in practice:
  • None — endpoint is unauthenticated by design
Detection/coverage: WAF/IDS rules inspecting JSON body for nested objects in password-reset requests. Log analysis for POST requests to /api/session/reset_password with unexpected JSON keys.
STEP 03

Blind SQL Injection Achieves Admin Takeover

The surviving :raw value passes into t2/select-one :id user-id, where HoneySQL emits it as literal SQL instead of a parameterized integer. The attacker uses blind boolean or time-based injection to enumerate the application database, then overwrites an admin user's password hash or creates a new admin account. Payload varies by backend: H2, PostgreSQL, or MySQL syntax required.
Conditions required:
  • Knowledge of which application database backend is in use (detectable via error-based fingerprinting)
Where this breaks in practice:
  • H2 (the default embedded DB) has limited SQL surface compared to PostgreSQL, but UPDATE is sufficient
  • Some WAFs may block obvious SQL keywords in JSON values
Detection/coverage: Database audit logs showing anomalous queries against the core_user table. Metabase audit log showing unexpected admin account creation or password changes.
STEP 04

Harvest All Connected Database Credentials

With Metabase admin access, the attacker navigates to Admin > Databases and exports every stored connection string. Metabase stores credentials for every connected data warehouse — Snowflake, BigQuery, Redshift, PostgreSQL, MongoDB, Oracle, Databricks. These credentials are stored in the application database and visible to admins via the API (GET /api/database). The attacker now has direct access to production data warehouses.
Conditions required:
  • Metabase admin session obtained in Step 3
Where this breaks in practice:
  • If database credentials use IAM/OAuth rather than static passwords, stolen creds may be short-lived or role-scoped
  • Network segmentation may prevent direct attacker access to internal databases from the Metabase host
Detection/coverage: Metabase audit logs for GET /api/database calls retrieving connection details. Anomalous admin session from unexpected IP.
STEP 05

Exfiltrate Data from Connected Warehouses

Using harvested credentials, the attacker connects directly to downstream databases and exfiltrates regulated data — PII, financial records, healthcare data, or proprietary analytics. This is the confirmed impact in the Framework, Tally, n8n, Kilo Code, and ChecklyHQ breaches. The blast radius scales with the number and sensitivity of connected data sources.
Conditions required:
  • Valid credentials for downstream databases
  • Network path from attacker to downstream databases (direct or via Metabase host as pivot)
Where this breaks in practice:
  • Network segmentation and firewall rules may block direct attacker-to-database connections
  • Database-level audit and DLP may detect bulk exfiltration
Detection/coverage: Database audit logs showing connections from unexpected IPs or bulk SELECT/COPY operations. DLP and CASB alerts on large data transfers.
03 · Intelligence Metadata

The supporting signals.

In-the-Wild ExploitationConfirmed active. Five companies breached as zero-day before patch: Framework, Tally (Aug 7), n8n (Aug 8), Kilo Code/Anaconda (Aug 9), ChecklyHQ (Aug 10). CISA KEV added Aug 11, 2026.
Proof-of-ConceptPublic since Aug 10. Wiz published a test curl command. Multiple PoC scripts circulating. Exploitation is trivial — single HTTP request with crafted JSON body.
EPSS Score0.01074 — low percentile but lagging indicator; KEV listing and confirmed breaches override EPSS signal here.
KEV StatusListed — added 2026-08-11 by CISA. Federal agencies must remediate per BOD 22-01 deadlines.
CVSS VectorCVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:H — perfect 10.0. Network-accessible, no auth, no interaction, scope change reflects downstream database compromise.
Affected VersionsMetabase OSS 0.58.0–0.63.4, Enterprise 1.58.0–1.63.4. Introduced during auth_identity module refactoring in the 0.58 release cycle.
Fixed VersionsOSS: 0.58.24, 0.59.21, 0.60.17, 0.61.11, 0.62.9, 0.63.5. Enterprise: corresponding 1.x builds. Metabase Cloud was patched server-side.
Exposure Data~2,500 instances visible on Shodan. Wiz: ~13% of cloud environments run self-hosted Metabase; ~25% of those are internet-accessible. runZero provides asset discovery queries.
Disclosure TimelineExploited in wild from at least Aug 6. Vendor advisory Aug 6. CVE published Aug 10. KEV listed Aug 11. Two-day window of exploitation before public advisory.
Researcher / DiscovererDiscovered via incident response to Framework breach. Bishop Fox and Wiz published independent technical analyses. Resecurity published threat intelligence on exploitation campaigns.
04 · The Call

noisgate verdict.

Final Verdict
= UNCHANGED to CRITICAL (10.0/10)

The single most decisive factor is active zero-day exploitation with confirmed breaches — five companies lost customer data before the patch existed, public PoC is trivial (one curl command), and CISA KEV-listed it within 48 hours. The blast radius is not limited to the Metabase instance: every connected data warehouse's credentials are exposed, making this a supply-chain-scale data breach vector.

HIGH Vulnerability existence and active exploitation confirmed by multiple independent sources
HIGH Attack path is fully documented with public PoC
MEDIUM Exact number of internet-exposed instances (Shodan undercounts; real exposure likely higher)

Why this verdict

  • Unauthenticated remote access with zero friction: The vulnerable endpoint requires no credentials, no user interaction, and trivial complexity. Every prerequisite check returns 'no barrier.' This alone sustains the CVSS 10.0 baseline.
  • Active exploitation with confirmed breaches: Five named companies breached as zero-day. CISA KEV listed Aug 11. Public PoC available since Aug 10. This is not theoretical — it is happening now at scale.
  • Role multiplier: Metabase is canonically a data-tier gateway — its entire purpose is to hold credentials for production databases and warehouses. In >90% of deployments, compromising Metabase admin yields credentials to Snowflake, BigQuery, Redshift, PostgreSQL, or MongoDB containing regulated/production data. The blast radius is fleet-scale data egress across every connected warehouse. This is analogous to compromising a PAM vault or secret manager. The verdict floor is CRITICAL because the affected component is inherently a high-value credential store.
  • Scope change confirmed: The CVSS vector correctly marks S:C (Changed scope). The attacker pivots from the Metabase application database to every downstream data warehouse, crossing trust boundaries.
  • Minimal friction across the chain: Internet exposure is meaningful (~2,500 Shodan, ~25% of cloud deployments). No step in the attack path requires insider access, social engineering, or chained vulnerabilities. A single HTTP request achieves admin takeover.

Why not higher?

This is already rated at the maximum severity (CVSS 10.0 CRITICAL). There is no higher bucket available. The rating is fully justified by unauthenticated remote exploitation, active zero-day breaches, and credential-store blast radius.

Why not lower?

Downgrading would require evidence that the attack path has meaningful friction or limited blast radius — neither is true. The endpoint is unauthenticated, the PoC is a single curl command, exploitation is confirmed in the wild with named victims, and the blast radius extends to every connected production database. The only friction point (VPN/SSO gating) applies to a minority of deployments and does not overcome the KEV listing and confirmed breaches. Treating this as anything below CRITICAL would be negligent given active exploitation.

05 · Compensating Control

What to do — in priority order.

  1. Block access to /api/session/reset_password immediately — Deploy a WAF rule or reverse-proxy configuration (nginx, HAProxy, Cloudflare) that returns 403 for any POST to /api/session/reset_password. This disables password resets but eliminates the attack surface. Deploy within the noisgate mitigation SLA of 3 days — but given active exploitation, do this within hours.
  2. Place Metabase behind VPN or zero-trust gateway — If not already segmented, move the Metabase instance behind a VPN, Cloudflare Access, Tailscale, or equivalent zero-trust proxy so that only authenticated internal users can reach it. This eliminates the unauthenticated attack vector from the internet.
  3. Rotate all stored database credentials — After patching, assume credential compromise and rotate every database connection string stored in Metabase. Prioritize production warehouses (Snowflake, BigQuery, Redshift, PostgreSQL). Check database audit logs for unauthorized access from the Metabase host IP.
  4. Audit Metabase admin accounts and sessions — Review core_user table and Metabase audit logs for unauthorized admin accounts, password changes, or sessions from unexpected IPs. Any anomaly should trigger full incident response.
  5. Patch to fixed version — Upgrade to the fixed release for your branch (0.63.5, 0.62.9, 0.61.11, 0.60.17, 0.59.21, or 0.58.24). This is the definitive remediation. Given KEV listing, target completion within the noisgate remediation SLA of 90 days — but realistically, patch within days.
What doesn't work
  • Network-layer rate limiting does not help — the exploit requires only a single HTTP request to achieve admin takeover, so rate limiting will not prevent exploitation.
  • Metabase's built-in authentication (LDAP/SAML/SSO) does not help — the vulnerable endpoint is pre-authentication by design; SSO configuration does not gate /api/session/reset_password.
  • Database firewalls on downstream warehouses limit post-exploitation lateral movement but do not prevent the initial Metabase admin takeover or credential theft via the API.
06 · Verification

Crowdsourced verification payload.

Run this script on any host with curl and network access to the target Metabase instance. No authentication required. Usage: bash check_cve_2026_72898.sh https://metabase.example.com

noisgate-verify.sh
BASHREAD-ONLYSAFE
#!/usr/bin/env bash
# CVE-2026-72898 Metabase Version Checker
# Usage: bash check_cve_2026_72898.sh <METABASE_URL>
# Requires: curl, grep
# Privileges: none (unauthenticated endpoint)

set -euo pipefail

if [ -z "${1:-}" ]; then
  echo "Usage: $0 <METABASE_BASE_URL>"
  echo "Example: $0 https://metabase.example.com"
  exit 3
fi

BASE_URL="${1%/}"
ENDPOINT="$BASE_URL/api/session/properties"

echo "[*] Checking Metabase version at $ENDPOINT"

RESPONSE=$(curl -sk --max-time 10 "$ENDPOINT" 2>/dev/null) || {
  echo "UNKNOWN - Could not connect to $ENDPOINT"
  exit 2
}

VERSION=$(echo "$RESPONSE" | grep -oP '"version"\s*:\s*\{[^}]*"tag"\s*:\s*"v([0-9]+\.[0-9]+\.?[0-9]*)"' | grep -oP '[0-9]+\.[0-9]+\.?[0-9]*' | head -1)

if [ -z "$VERSION" ]; then
  echo "UNKNOWN - Could not parse version from response"
  exit 2
fi

echo "[*] Detected Metabase version: $VERSION"

# Extract major.minor.patch
MAJOR=$(echo "$VERSION" | cut -d. -f1)
MINOR=$(echo "$VERSION" | cut -d. -f2)
PATCH=$(echo "$VERSION" | cut -d. -f3)
PATCH=${PATCH:-0}

# Normalize: 0.xx and 1.xx map to same branch (1.xx = Enterprise)
# Strip leading 0 or 1 for branch comparison
if [ "$MAJOR" -le 1 ]; then
  BRANCH=$MINOR
else
  BRANCH=$MAJOR
fi

# Fixed versions by branch (minor version)
declare -A FIXED_PATCH
FIXED_PATCH[58]=24
FIXED_PATCH[59]=21
FIXED_PATCH[60]=17
FIXED_PATCH[61]=11
FIXED_PATCH[62]=9
FIXED_PATCH[63]=5

if [ "$BRANCH" -lt 58 ]; then
  echo "PATCHED - Version $VERSION is below the affected range (0.58+)"
  exit 0
fi

if [ "$BRANCH" -gt 63 ]; then
  echo "PATCHED - Version $VERSION is above the affected range"
  exit 0
fi

REQUIRED=${FIXED_PATCH[$BRANCH]:-}
if [ -z "$REQUIRED" ]; then
  echo "UNKNOWN - Unrecognized branch $BRANCH"
  exit 2
fi

if [ "$PATCH" -ge "$REQUIRED" ]; then
  echo "PATCHED - Version $VERSION is at or above the fix ($MAJOR.$BRANCH.$REQUIRED)"
  exit 0
else
  echo "VULNERABLE - Version $VERSION is below the fix ($MAJOR.$BRANCH.$REQUIRED) — CVE-2026-72898 applies"
  exit 1
fi
07 · Bottom Line

If you remember one thing.

TL;DR
This is a drop-everything-and-patch situation. CVE-2026-72898 is an unauthenticated, single-request SQL injection in Metabase that has already been exploited as a zero-day to breach five companies and exfiltrate customer data from their connected warehouses. CISA KEV-listed it on August 11. Under the noisgate mitigation SLA for CRITICAL findings, you have 3 days to deploy compensating controls — but with active exploitation confirmed, block the /api/session/reset_password endpoint or pull Metabase behind a VPN *today*. Under the noisgate remediation SLA, apply the vendor patch within 90 days — but realistically, patch within the week. After patching, rotate every database credential stored in Metabase (Snowflake, BigQuery, Redshift, PostgreSQL, etc.) and audit your Metabase admin accounts and database audit logs for signs of compromise. If you find evidence of unauthorized admin sessions or credential access, escalate to full incident response immediately.

Sources

  1. Bishop Fox Technical Analysis
  2. Wiz Blog — Inside the Metabase SQLi
  3. CISA KEV Catalog Entry
  4. IONIX Threat Center Advisory
  5. BleepingComputer — Framework/Tally Breach Disclosure
  6. runZero — Find Impacted Assets
  7. Security Arsenal — Detection and Remediation Guide
  8. The Hacker News — Metabase Zero-Day
Peer Review

What defenders are saying.

Submit a review attribution: handle + country only
0 flags selected · stored anonymously
Validation Results

Crowdsourced verification outputs.

Results submitted by users who ran the verification payload against their environment.