Back to Intelligence

Metabase Zero-Day (CVSS 10.0) Exploited in the Wild: Unauthenticated SQL Injection Grants Admin Access — Detection and Response Guide

SA
Security Arsenal Team
August 9, 2026
11 min read

Metabase — the open-source business intelligence and data visualization platform deployed in tens of thousands of environments — has disclosed a maximum-severity vulnerability (CVSS 10.0) that is being actively exploited in the wild as a zero-day. The flaw carries no CVE identifier at the time of writing, which matters operationally: you cannot rely on CVE-based scanner feeds or KEV triggers to flag it. Your detection and remediation efforts have to be driven by vendor advisories and behavioral hunting.

The mechanics are as bad as the score suggests. An unauthenticated remote attacker can inject arbitrary SQL statements into the Metabase application database — the internal database (H2 by default, or PostgreSQL/MySQL in production deployments) where Metabase stores user accounts, session tokens, saved queries, and critically, connection credentials for every connected data source. Successful exploitation enables the attacker to grant themselves administrative access without any credentials, and from there pivot into every database the Metabase instance can reach.

If you run Metabase — self-hosted, in Docker, on a VM, or embedded in customer-facing analytics — treat this as an active incident until you have verified otherwise. Internet-exposed Metabase instances are the primary target, but internal instances are equally at risk from any foothold an attacker already holds.

Technical Analysis

Affected Products and Attack Surface

  • Product: Metabase (open-source and commercial/Enterprise editions), self-hosted deployments
  • Deployment models at risk: JAR-based installs, official Docker images, cloud marketplace images, embedded analytics deployments
  • Component affected: Metabase's API request handling, where attacker-controlled input reaches the application database layer without proper sanitization
  • Prerequisites for exploitation: Network access to the Metabase web interface (default port 3000). No authentication, no user interaction, no special conditions.

How the Attack Works — Defender's View

The vulnerability allows SQL injection directly into the Metabase application database (not just a connected analytics source). This distinction is critical:

  1. Reconnaissance: Attackers scan for exposed Metabase instances (default TCP/3000, recognizable /api/health and login page fingerprints).
  2. Injection: A crafted unauthenticated HTTP request to a vulnerable API endpoint injects SQL into queries executed against the application database.
  3. Privilege escalation via data manipulation: Because the application database holds the core_user table, session tokens, and permissions, injected SQL can insert a new admin user, reset an existing admin's password hash, or mint a valid session — yielding full administrative control of the application.
  4. Post-exploitation: With admin access, attackers can read stored database credentials, execute native SQL queries against every connected data source (the product's core feature), create malicious dashboard cards, and in many configurations achieve server-side code execution through database features (e.g., PostgreSQL COPY ... TO PROGRAM, H2 aliases, or JDBC connection string abuse against attacker-controlled servers).
  5. Persistence and exfiltration: Typical follow-on behavior includes new local admin accounts, API keys, outbound connections from the Metabase host to attacker infrastructure, and bulk extraction of warehouse data.

Exploitation Status

  • Status: Confirmed active exploitation in the wild as an unpatched zero-day at disclosure time.
  • CVE: None assigned (as of the vendor warning). Do not wait for a CVE to appear in your scanner feed before acting.
  • CVSS: 10.0 (maximum severity) — unauthenticated, remote, low complexity, total impact.
  • CISA KEV: Not yet listed at time of writing; monitor the KEV catalog and expect addition given confirmed exploitation.

Historical context for prioritization: Metabase has been a favored target before (the CVE-2023-38646 pre-auth RCE campaign saw mass exploitation within days of disclosure). Treat internet-exposed instances as presumptively compromised if they were reachable and unpatched during the exposure window.

Detection & Response

Hunting priorities: (1) anomalous unauthenticated requests to Metabase API endpoints, (2) new admin users or API keys created outside change windows, (3) the Metabase process spawning shells or making unexpected outbound connections, and (4) evidence of native SQL queries executed against connected data sources by unexpected accounts.

Sigma Rules

YAML
---
title: Metabase Process Spawning Shell or Command Interpreter
id: 3f8a1c44-2b7d-4e91-a6c3-9d0e5f7b2a18
status: experimental
description: Detects the Metabase Java process spawning shells or scripting interpreters, a strong post-exploitation indicator following SQL injection to code execution via database features.
references:
  - https://thehackernews.com/2026/08/metabase-zero-day-exploited-in-wild.html
  - https://attack.mitre.org/techniques/T1059/
author: Security Arsenal
date: 2026/08/10
tags:
  - attack.execution
  - attack.t1059
  - attack.initial_access
  - attack.t1190
logsource:
  category: process_creation
  product: linux
detection:
  selection_parent:
    ParentCommandLine|contains: 'metabase.jar'
  selection_child:
    Image|endswith:
      - '/sh'
      - '/bash'
      - '/dash'
      - '/python'
      - '/python3'
      - '/perl'
      - '/curl'
      - '/wget'
      - '/nc'
      - '/ncat'
      - '/socat'
  condition: selection_parent and selection_child
falsepositives:
  - Legitimate backup or maintenance scripts invoked by wrappers around the Metabase service are uncommon but possible in heavily customized deployments
level: critical
---
title: Suspicious Unauthenticated Requests to Metabase API
id: 8c2d5e71-4a9f-4b36-b8d1-7e3a0c9f5d42
status: experimental
description: Detects HTTP requests to Metabase API endpoints containing SQL injection metacharacters in query strings or payloads, as observed in web server and reverse proxy logs.
references:
  - https://thehackernews.com/2026/08/metabase-zero-day-exploited-in-wild.html
  - https://attack.mitre.org/techniques/T1190/
author: Security Arsenal
date: 2026/08/10
tags:
  - attack.initial_access
  - attack.t1190
logsource:
  category: webserver
detection:
  selection_uri:
    cs-uri|contains:
      - '/api/'
      - '/api/session'
      - '/api/user'
      - '/api/database'
      - '/api/card'
      - '/api/dataset'
  selection_sqli:
    cs-uri-query|contains:
      - '%27'
      - '%22'
      - 'UNION'
      - 'union%20select'
      - '%20OR%20'
      - 'SELECT%20'
      - 'INSERT%20'
      - 'UPDATE%20'
      - 'DELETE%20'
      - '--'
      - '%3B'
  condition: selection_uri and selection_sqli
falsepositives:
  - Vulnerability scanners and authorized penetration tests
  - Aggressive WAF testing tooling
level: high
---
title: Outbound Network Connection From Metabase Server Process
id: 5e7b9d02-6c1a-4f83-92e4-1b5d8a3c7f60
status: experimental
description: Detects the Metabase Java process initiating outbound connections to rare external destinations, indicating possible reverse shell or data exfiltration following compromise. Baselining of known warehouse destinations is required.
references:
  - https://thehackernews.com/2026/08/metabase-zero-day-exploited-in-wild.html
  - https://attack.mitre.org/techniques/T1071/
author: Security Arsenal
date: 2026/08/10
tags:
  - attack.command_and_control
  - attack.t1071
  - attack.exfiltration
  - attack.t1041
logsource:
  category: network_connection
  product: linux
detection:
  selection:
    Image|contains: 'java'
    CommandLine|contains: 'metabase'
  filter_loopback:
    DestinationIp|startswith:
      - '10.'
      - '172.16.'
      - '192.168.'
      - '127.'
  filter_known_ports:
    DestinationPort:
      - 443
      - 5432
      - 3306
      - 1433
      - 5439
      - 27017
  condition: selection and not (filter_loopback and filter_known_ports)
falsepositives:
  - Metabase connecting to newly added data sources or external identity providers
  - Telemetry endpoints if not disabled
level: medium

KQL — Microsoft Sentinel / Defender

This query hunts unauthenticated requests to Metabase API endpoints carrying SQL injection patterns, using CommonSecurityLog (reverse proxy / WAF / load balancer logs ingested via CEF) and Syslog sources. The second query targets post-exploitation process execution on the host.

KQL — Microsoft Sentinel / Defender
// Hunt 1: Suspicious requests to Metabase API with SQLi indicators in proxy/WAF logs
let sqli_patterns = dynamic(["%27", "UNION", "union%20select", "SELECT%20", "INSERT%20INTO", "UPDATE%20core_user", "DELETE%20FROM", "%3B--", " OR 1=1", "or%201%3D1"]);
CommonSecurityLog
| where TimeGenerated > ago(14d)
| where RequestURL has_any ("/api/session", "/api/user", "/api/database", "/api/dataset", "/api/card", "/api/health")
| extend UrlLower = tolower(RequestURL)
| where UrlLower has_any (sqli_patterns) or (AdditionalExtensions has_any (sqli_patterns))
| summarize RequestCount = count(), UniqueURLs = dcount(RequestURL) by SourceIP, RequestURL, RequestMethod, ApplicationProtocol, DeviceAction, bin(TimeGenerated, 1h)
| order by RequestCount desc;

// Hunt 2: Metabase host spawning shells or making rare outbound connections (requires Defender for Endpoint or Sysmon-for-Linux ingestion)
DeviceProcessEvents
| where TimeGenerated > ago(14d)
| where InitiatingProcessCommandLine has "metabase"
| where FileName in~ ("sh", "bash", "dash", "python", "python3", "perl", "curl", "wget", "nc", "ncat", "socat")
| project TimeGenerated, DeviceName, FileName, ProcessCommandLine, InitiatingProcessCommandLine, AccountName, RemoteIP
| order by TimeGenerated desc;

// Hunt 3: Syslog-based hunt for Metabase service anomalies (auth/session events)
Syslog
| where TimeGenerated > ago(14d)
| where SyslogMessage has_any ("metabase", "core_user", "api/session")
| where SyslogMessage has_any ("new user", "password reset", "api key", "admin")
| summarize by TimeGenerated, Computer, SyslogMessage
| order by TimeGenerated desc;

Velociraptor VQL

Use this artifact across your Linux fleet to identify Metabase hosts exhibiting post-exploitation behavior — shells under the Java process tree and unexpected outbound sockets.

VQL — Velociraptor
-- Metabase Zero-Day Post-Exploitation Hunt
-- Identifies shells/tools parented by the Metabase Java process and unexpected outbound connections

LET procs = SELECT Pid, Ppid, Name, CommandLine, Exe, Username, CreateTime
FROM pslist()
WHERE CommandLine =~ 'metabase'

LET metabase_pids = SELECT Pid FROM procs

SELECT Pid, Ppid, Name, CommandLine, Exe, Username, CreateTime,
       'Child of Metabase process' AS Finding
FROM pslist()
WHERE Ppid IN (SELECT Pid FROM metabase_pids)
  AND (Name =~ '(sh|bash|dash|python|perl|curl|wget|nc|ncat|socat)$'
       OR CommandLine =~ '(base64|/dev/tcp|chmod \+x|/tmp/|/dev/shm/)')

UNION ALL

SELECT NULL AS Pid, NULL AS Ppid, Name, NULL AS CommandLine,
       Rexe.Addr AS Exe, Laddr.Addr AS Username, NULL AS CreateTime,
       'Outbound connection held by Metabase-linked binary' AS Finding
FROM netstat()
WHERE State = 'ESTABLISHED'
  AND Rexe.Addr !~ '^(10\\.|172\\.(1[6-9]|2[0-9]|3[01])\\.|192\\.168\\.|127\\.)'
  AND Name =~ 'java'

Remediation & Verification Script

Run on every self-hosted Metabase host to identify the running version, check for suspicious recently created local admins and shells in the process tree, and capture evidence before patching. This is a triage script — it does not replace the vendor patch.

Bash / Shell
#!/bin/bash
# metabase-zero-day-triage.sh — Security Arsenal IR triage for Metabase unauthenticated SQLi (Aug 2026)
# Run as root or with sudo. Produces evidence bundle; does NOT modify the system.
set -u
OUT="/tmp/metabase_triage_$(date +%Y%m%d_%H%M%S)"
mkdir -p "$OUT"

echo "[*] Identifying Metabase process and version..."
ps aux | grep -i '[m]etabase' | tee "$OUT/metabase_process.txt"
MB_JAR=$(ps aux | grep -oP '(?<= )\S*metabase\.jar' | head -1)
if [ -n "$MB_JAR" ] && [ -f "$MB_JAR" ]; then
  unzip -p "$MB_JAR" META-INF/MANIFEST.MF 2>/dev/null | grep -i version | tee "$OUT/metabase_version.txt"
fi

echo "[*] Checking for shells/tools spawned by Metabase (post-exploitation indicator)..."
MB_PID=$(pgrep -f 'metabase.jar' | head -1)
if [ -n "$MB_PID" ]; then
  ps --ppid "$MB_PID" -o pid,ppid,user,cmd | tee "$OUT/metabase_children.txt"
  ls -l /proc/"$MB_PID"/cwd 2>/dev/null | tee -a "$OUT/metabase_children.txt"
fi

echo "[*] Listing established outbound connections from the Metabase process..."
ss -tnp 2>/dev/null | grep -i java | tee "$OUT/metabase_connections.txt"

echo "[*] Checking Metabase application DB for recently created users/admins (H2 default path)..."
find / -name 'metabase.db.mv.db' -o -name 'metabase.db.h2.db' 2>/dev/null | tee "$OUT/appdb_paths.txt"

echo "[*] Pulling recent Metabase and reverse-proxy logs for unauthenticated API hits..."
journalctl -u metabase --since '14 days ago' 2>/dev/null | grep -Ei 'api/(session|user|database|dataset|card)' | tee "$OUT/api_requests_journal.txt"
for log in /var/log/nginx/access.log /var/log/apache2/access.log /var/log/haproxy.log; do
  [ -f "$log" ] && grep -Ei 'api/(session|user|database|dataset|card)' "$log" | grep -Ei '(\%27|union|select|insert|update|delete|1=1)' | tee -a "$OUT/sqli_hits_proxy.txt"
done

echo "[*] Checking for web shells / dropped files in common writable paths..."
find /tmp /dev/shm /var/tmp -type f -mmin -20160 \( -name '*.sh' -o -name '*.py' -o -name '*.elf' -o -perm -111 \) 2>/dev/null | tee "$OUT/suspicious_files.txt"

echo "[+] Triage bundle complete: $OUT"
echo "[!] NEXT STEPS:"
echo "    1. If any child shells, unknown outbound connections, or unexpected admin users are found:"
echo "       isolate the host (block egress, preserve volatile memory) and escalate to IR."
echo "    2. Upgrade Metabase to the vendor-fixed release per https://www.metabase.com/blog/security"
echo "    3. Rotate ALL credentials: data-source passwords stored in Metabase, admin passwords, API keys."
echo "    4. If the application DB is H2 (default), plan migration to PostgreSQL/MySQL per vendor guidance."

Remediation

Immediate (within 24 hours):

  1. Apply the vendor fix. Metabase has released patched builds alongside its disclosure. Pull the latest fixed version of your release line from the official Metabase security advisories page (https://www.metabase.com/blog/security and the GitHub repository's Security Advisories tab). Verify the exact fixed version against the advisory before upgrading — do not assume "latest" from a public mirror is the fixed build. Because no CVE exists yet, your scanner will not confirm remediation; track completion manually against your asset inventory.
  2. Take internet-exposed instances offline or behind authentication immediately if you cannot patch within hours. Place Metabase behind a VPN, SSO reverse proxy (e.g., oauth2-proxy, Cloudflare Access), or IP allowlist. An unauthenticated CVSS 10.0 under active exploitation is not a "patch in the next maintenance window" item.
  3. Assume compromise for exposed instances. Run the triage script above, review the core_user table for accounts you did not create, audit API keys and session tokens, and review connected data source query logs for unauthorized native SQL.

Short term (this week):

  1. Rotate everything Metabase touches: data source credentials stored in the application database, Metabase admin passwords, API keys, and any service accounts used for database connections. If the application database was readable by the attacker, every secret in it is burned.
  2. Migrate off the default H2 application database to PostgreSQL or MySQL per vendor guidance if you have not already — H2-backed deployments historically carry additional code-execution primitives that worsen SQLi impact.
  3. Restrict JDBC capabilities: block outbound JDBC connections to arbitrary hosts, disable H2 as a connectable data source type where policy allows, and enforce least-privilege database roles for Metabase's service accounts (read-only analytics roles, no DDL/DML beyond what the product requires).

Structural:

  1. Egress filtering on the Metabase host: the server needs to reach your data warehouses and identity provider — nothing else. Deny-all egress with an explicit allowlist neutralizes reverse shells and most exfiltration paths.
  2. Centralize logs: ship Metabase application logs and fronting proxy/WAF logs to your SIEM. The API request patterns above are only detectable if you collect them.
  3. Add Metabase to your external attack surface monitoring and scan continuously for port 3000 and Metabase fingerprints across your ranges and cloud estates — shadow BI deployments spun up by data teams are a recurring discovery in our assessments.

Monitor the CISA KEV catalog and Metabase's channels for a CVE assignment and updated indicators; update your vulnerability management tooling signatures once published.

Related Resources

Security Arsenal Penetration Testing Services AlertMonitor Platform Book a SOC Assessment vulnerability-management Intel Hub

Is your security operations ready?

Get a free SOC assessment or see how AlertMonitor cuts through alert noise with automated triage.