← Back to Feed CACHED · 2026-09-22 01:44:32 · CACHE_KEY tenable:241355
tenable:241355 · CWE-284 · Disclosed 2025-05-22

Grafana Labs 10.4.x < 10.4.19

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

Like giving a department manager the ability to fire the CEO — except HR can reinstate them from the employee database

CVE-2025-3580 is an improper access control flaw in Grafana's DELETE /api/org/users/ endpoint that allows an Organization Administrator to permanently delete the Server Administrator account from the system. The bug has existed since Grafana v5.4.0 and affects every release branch up through 12.0.0. The deletion is irreversible through the UI — if the only Server Admin is removed, the entire Grafana instance loses its super-user and becomes unmanageable until someone intervenes directly in the backing database. Fixed versions are 10.4.19, 11.2.10, 11.3.7, 11.4.5, 11.5.5, 11.6.2, and 12.0.1.

Grafana's vendor MEDIUM (CVSS 5.5) is *slightly generous* but directionally correct. The PR:H requirement means the attacker must already hold Organization Admin privileges — a trusted insider role in most deployments. There is no code execution, no data exfiltration, and no lateral movement. The impact is purely availability of admin functions; dashboards, alerting rules, and data sources continue to operate normally. The instance is recoverable via direct database manipulation (UPDATE user SET is_admin=1 WHERE ...). No public PoC exists, EPSS sits at the 39th percentile, and there is zero evidence of in-the-wild exploitation. The noisgate reassessed score is 4.5 — a slight downgrade reflecting the insider-only attack surface and full recoverability.

"Rogue Grafana Org Admin can nuke the Server Admin account; painful but recoverable via DB."
02 · The Attack Path

4 steps from start to impact.

STEP 01

Attain Organization Admin role

The attacker must first hold Organization Administrator privileges within a Grafana organization. This can be granted by invitation, self-provisioning (if org creation is enabled), or by compromising an existing Org Admin account. In most enterprise Grafana deployments, Org Admin is a deliberately restricted role handed to team leads or platform engineers.
Conditions required:
  • Attacker has Grafana Org Admin credentials
  • Target Grafana instance uses multi-org or the attacker is in the same org as the Server Admin
Where this breaks in practice:
  • Org Admin is a high-privilege role; most deployments restrict it to a handful of trusted users
  • SSO/SAML-backed Grafana deployments further limit who can reach Org Admin status
Detection/coverage: Grafana audit logs record role assignments; SIEM correlation on org.user.role.updated events can flag unexpected Org Admin grants.
STEP 02

Identify the Server Admin user ID

The attacker enumerates users within their organization using GET /api/org/users to identify which user holds the Server Admin (isGrafanaAdmin: true) flag. This is visible to Org Admins by default in the API response. The attacker needs the target user's org-membership ID.
Conditions required:
  • Org Admin API access
  • Server Admin is a member of the attacker's organization, OR has no org membership at all
Where this breaks in practice:
  • If the Server Admin account is in a separate, dedicated organization (Grafana's own recommended mitigation), this step fails
  • Enterprise deployments often use service accounts for Server Admin, not personal accounts in user orgs
Detection/coverage: API audit logs for GET /api/org/users at unusual volume or from unexpected source IPs.
STEP 03

Delete Server Admin via API

The attacker issues DELETE /api/org/users/<userId> against the Server Admin's membership. Due to the access control flaw, Grafana not only removes the user from the organization but permanently deletes the user account from the system if it has no remaining org memberships. This is a single authenticated API call with no confirmation step.
Conditions required:
  • Org Admin session token or API key
  • Server Admin's only org membership is in the attacker's org (or they have none)
Where this breaks in practice:
  • If the Server Admin belongs to multiple organizations, deletion fails — the user is only removed from the current org
  • Many deployments have multiple Server Admin accounts, limiting the blast radius of deleting one
Detection/coverage: Grafana audit log event user.deleted; unexpected deletion of admin accounts should trigger high-priority SIEM alerts.
STEP 04

Grafana loses super-user management

With the sole Server Admin deleted, no remaining account can perform system-wide administrative tasks such as managing global orgs, enabling plugins, or configuring authentication backends. The Grafana instance continues to serve dashboards and fire alerts, but administrative control is lost until a DBA manually sets is_admin=1 on a user row in the Grafana database.
Conditions required:
  • Only one Server Admin account existed
  • No out-of-band database access procedures are documented
Where this breaks in practice:
  • Organizations following Grafana best practices maintain multiple Server Admin accounts
  • Database recovery is straightforward: a single SQL UPDATE restores admin access in minutes
Detection/coverage: Monitoring for zero Server Admin accounts via a periodic SQL query or Grafana health-check script.
03 · Intelligence Metadata

The supporting signals.

In-the-Wild ExploitationNone reported. No campaigns, no threat actor attribution, no incident reports as of September 2026.
Proof-of-ConceptNo public PoC. The attack is a single DELETE API call, so weaponization is trivial for anyone who reads the advisory — but no researcher has published exploit code.
EPSS Score0.0046 (0.46%) — 39th percentile. Very low predicted exploitation probability.
CISA KEV StatusNot listed. CVE-2025-3580 has not been added to the CISA Known Exploited Vulnerabilities catalog.
CVSS VectorCVSS:3.1/AV:N/AC:L/PR:H/UI:N/S:U/C:N/I:L/A:H — Network-accessible but requires high privileges. No confidentiality impact. High availability impact reflects permanent admin deletion.
Affected VersionsGrafana OSS and Enterprise ≥ 5.4.0 through 10.4.18, 11.2.0–11.2.9, 11.3.0–11.3.6, 11.4.0–11.4.4, 11.5.0–11.5.4, 11.6.0–11.6.1, 12.0.0.
Fixed Versions10.4.19, 11.2.10, 11.3.7, 11.4.5, 11.5.5, 11.6.2, 12.0.1. RHEL 8/9/10 backports available via grafana package updates.
Internet ExposureShodan indexes ~128,000 Grafana instances globally. However, this CVE requires authenticated Org Admin access, so internet exposure is a secondary factor — the real attack surface is insider privilege.
Disclosure Date2025-05-22 — coordinated disclosure by Grafana Labs.
ReporterNot publicly attributed. Discovered and disclosed by Grafana Labs internal security processes.
04 · The Call

Final Verdict
= UNCHANGED to MEDIUM (4.5/10)

Why this verdict

  • PR:H gating eliminates opportunistic exploitation. The attacker must already hold Organization Admin privileges — a role typically restricted to 2–5 trusted users per Grafana org. This is not reachable by unauthenticated or low-privilege attackers, and it is not reachable by external scanning or spray attacks.
  • Impact is availability-only and fully recoverable. The worst outcome is loss of the Server Admin account. Dashboards, alerts, and data sources continue functioning. A DBA can restore admin access with a single UPDATE user SET is_admin=1 SQL statement in minutes. There is no code execution, no data exfiltration, and no lateral movement.
  • Zero exploitation evidence and low EPSS. No public PoC, no KEV listing, no threat actor campaigns, and EPSS sits at the 39th percentile (0.46%). The attack requires insider access to a monitoring tool — this is not the kind of bug ransomware operators or APTs prioritize.
  • Role multiplier: Grafana as observability/detection-adjacent infrastructure. Grafana is sometimes deployed as part of the monitoring or detection stack (e.g., visualizing security logs from Loki/Elasticsearch). In this high-value role, losing admin control could delay security dashboard updates or plugin management. However, the chain does NOT compromise detection data, disable alerting, or provide code execution on the host. The blast radius is *host-level admin-function availability* — not domain, fleet, or supply-chain scale. The SIEM/detection-plane floor does NOT trigger because the detection capability itself is unimpaired.
  • Condition narrowing further limits real-world impact. The Server Admin must be in the *same* org as the rogue Org Admin, or have zero org memberships. Grafana's own mitigation guidance (put Server Admins in a separate org) trivially defeats the attack. Multi-admin deployments are also unaffected unless every Server Admin shares the attacker's org.

Why not higher?

There is no code execution, no privilege escalation to OS-level access, no data exposure, and no lateral movement capability. The impact is confined entirely to Grafana's internal admin role management. The affected component (Grafana dashboarding) is not canonically identity, hypervisor, CI/CD, backup, or network-edge infrastructure. Even in the worst case (sole Server Admin deleted), the instance remains functional for end users and is recoverable via database access within minutes.

Why not lower?

Despite the high privilege requirement, the attack is trivially simple (one API call) and requires no user interaction. An insider with Org Admin access can execute it instantly with no technical skill. The availability impact is genuinely disruptive — a team scrambling to restore Grafana admin access during an incident could lose critical response time. The long-lived nature of the bug (since v5.4.0) means many unpatched instances exist.

05 · Compensating Control

What to do — in priority order.

  1. Create a dedicated organization for all Server Admin accounts — Grafana's own recommended mitigation. If every Server Admin belongs to at least one org that no untrusted Org Admin controls, the deletion path is blocked entirely. This is a zero-cost configuration change that should be deployed immediately as the primary compensating control. No noisgate mitigation SLA applies to MEDIUM findings — go straight to the 365-day remediation window.
  2. Ensure multiple Server Admin accounts exist — Maintain at least two Server Admin accounts (ideally a break-glass service account stored in your PAM vault). Even if one is deleted, the other retains full control. This is defense-in-depth against any single-point-of-failure in Grafana admin access.
  3. Monitor Grafana audit logs for user deletion events — Alert on user.deleted events in Grafana's audit log, especially when the deleted user had isGrafanaAdmin: true. Forward these to your SIEM with a P2 alert rule. This provides detection-in-depth even if the configuration controls above are missed.
  4. Restrict Org Admin role grants via SSO/SAML role mapping — If Grafana is backed by SAML/OIDC, enforce Org Admin assignment exclusively through IdP group membership rather than Grafana's internal role management. This prevents ad-hoc Org Admin grants and reduces the insider attack surface.
  5. Upgrade to patched Grafana version within 365 days — Apply the vendor patch (10.4.19, 11.2.10, 11.3.7, 11.4.5, 11.5.5, 11.6.2, or 12.0.1+) per the noisgate remediation SLA for MEDIUM findings. The configuration mitigations above fully neutralize the attack path in the interim.
What doesn't work
  • WAF / reverse proxy rules — the DELETE /api/org/users/ endpoint is a legitimate admin operation. Blocking it wholesale breaks normal Grafana user management. You cannot distinguish malicious from legitimate deletions at the network layer.
  • Network segmentation / restricting Grafana to internal-only — this CVE requires authenticated Org Admin access, not unauthenticated external access. An internal attacker already has network access. Restricting Grafana from the internet does not mitigate this insider threat.
  • Read-only Grafana mode / viewer-only permissions — this doesn't help because the attacker specifically needs Org Admin, not Viewer. Reducing default permissions for new users is good hygiene but doesn't address existing Org Admins.
06 · Verification

Crowdsourced verification payload.

Run this script on the Grafana server host or any machine with curl access to the Grafana API. Requires a valid Grafana Server Admin API key or credentials. Example: bash check_cve_2025_3580.sh https://grafana.corp.local admin:secretpass

noisgate-verify.sh
BASHREAD-ONLYSAFE
#!/usr/bin/env bash
# check_cve_2025_3580.sh — Detect CVE-2025-3580 (Grafana Org Admin Server Admin Deletion)
# Usage: bash check_cve_2025_3580.sh <GRAFANA_URL> <USER:PASS | api_key>
# Exit codes: 0=PATCHED, 1=VULNERABLE, 2=UNKNOWN

set -euo pipefail

GRAFANA_URL="${1:?Usage: $0 <GRAFANA_URL> <USER:PASS or api_key>}"
AUTH="${2:?Provide user:pass or API key}"

# Determine auth header
if [[ "$AUTH" == *:* ]]; then
  AUTH_HEADER="-u $AUTH"
else
  AUTH_HEADER="-H 'Authorization: Bearer $AUTH'"
fi

# Fetch Grafana version from health endpoint
VERSION=$(eval curl -sk $AUTH_HEADER "${GRAFANA_URL}/api/health" 2>/dev/null | grep -oP '"version"\s*:\s*"\K[0-9]+\.[0-9]+\.[0-9]+' || true)

if [[ -z "$VERSION" ]]; then
  echo "UNKNOWN — could not determine Grafana version from ${GRAFANA_URL}/api/health"
  exit 2
fi

echo "Detected Grafana version: $VERSION"

# Parse major.minor.patch
IFS='.' read -r MAJOR MINOR PATCH <<< "$VERSION"

# Check against fixed versions
# Fixed: 10.4.19, 11.2.10, 11.3.7, 11.4.5, 11.5.5, 11.6.2, 12.0.1
VULN=0

if (( MAJOR < 10 )); then
  # Versions before 10 — affected if >= 5.4.0
  if (( MAJOR > 5 )) || { (( MAJOR == 5 )) && (( MINOR >= 4 )); }; then
    VULN=1
  fi
elif (( MAJOR == 10 )); then
  if (( MINOR == 4 )) && (( PATCH < 19 )); then
    VULN=1
  elif (( MINOR < 4 )); then
    VULN=1
  fi
elif (( MAJOR == 11 )); then
  if (( MINOR == 2 )) && (( PATCH < 10 )); then
    VULN=1
  elif (( MINOR == 3 )) && (( PATCH < 7 )); then
    VULN=1
  elif (( MINOR == 4 )) && (( PATCH < 5 )); then
    VULN=1
  elif (( MINOR == 5 )) && (( PATCH < 5 )); then
    VULN=1
  elif (( MINOR == 6 )) && (( PATCH < 2 )); then
    VULN=1
  elif (( MINOR < 2 )); then
    VULN=1
  fi
elif (( MAJOR == 12 )); then
  if (( MINOR == 0 )) && (( PATCH < 1 )); then
    VULN=1
  fi
elif (( MAJOR > 12 )); then
  VULN=0
fi

if (( VULN == 1 )); then
  echo "VULNERABLE — Grafana $VERSION is affected by CVE-2025-3580"
  echo "Upgrade to the nearest fixed version for your branch."
  exit 1
else
  echo "PATCHED — Grafana $VERSION is not affected by CVE-2025-3580"
  exit 0
fi
07 · Sources

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.