Someone with a library card can make the fire-alarm panel screen go dark for a few minutes
CVE-2026-27879 is an uncontrolled resource consumption flaw in Grafana's resample query transformation engine. An authenticated user (Viewer role or higher) can craft a resample query with parameters that trigger unbounded memory allocation, causing the Grafana server process to crash with an out-of-memory (OOM) condition. The impact is availability-only — no data leaks, no code execution, no lateral movement. Affected versions span an enormous range: every Grafana release from 8.0.0 through 12.4.1, with fixes landing in 11.6.14, 12.1.10, 12.2.8, 12.3.6, and 12.4.2.
The vendor's MEDIUM / 6.5 rating is broadly fair but slightly generous for most enterprise deployments. The CVSS vector (AV:N/AC:L/PR:L/UI:N/S:U/C:N/I:N/A:H) correctly prices in the authentication requirement and availability-only impact, but it can't model the fact that Grafana processes almost universally auto-restart under systemd or Kubernetes, making the outage transient (seconds to low minutes). There is no public proof-of-concept, no known exploitation in the wild, EPSS sits at 0.376% (31st percentile), and this CVE is absent from the CISA KEV catalog. The real-world risk is a brief dashboard blackout, not a persistent outage.
4 steps from start to impact.
Obtain Grafana viewer credentials
- Valid Grafana account (Viewer or higher)
- Network reachability to Grafana HTTP(S) endpoint
- Most enterprise Grafana instances sit behind SSO/LDAP with MFA, not directly exposed with local accounts
- Anonymous access is disabled by default in modern Grafana (≥10.x)
- Viewer accounts are read-only; obtaining one still requires credential theft or insider access
Craft malicious resample query
/api/ds/query REST endpoint.- Knowledge of the resample transformation parameter space
- Access to a configured data source the account can query
- No public PoC or exploit script exists as of September 2026
- The attacker must understand Grafana's internal transformation pipeline to craft effective parameters
- WAF rules or API rate-limiting on
/api/ds/querycan throttle attempts
Trigger unbounded memory allocation
(time_range / resample_interval), which can be made arbitrarily large. Memory grows until the Go runtime or the OS OOM-killer terminates the process.- Grafana server has no memory cgroup limit or the limit is high enough to allow significant allocation before kill
- Kubernetes deployments with resource limits will OOM-kill the pod quickly, triggering an automatic restart (typically <10 seconds)
- Systemd-managed Grafana services restart automatically via
Restart=on-failure - Container orchestrators detect the crash and reschedule immediately
dmesg / kubelet logsGrafana becomes temporarily unavailable
- No load-balanced Grafana replicas that absorb the traffic during restart
- Production Grafana deployments commonly run 2+ replicas behind a load balancer; a single-instance crash doesn't take down the service
- Even single-instance deployments recover automatically in seconds to minutes
- Alerting rules processed by Grafana Alerting may miss one evaluation cycle but resume on restart
/api/health probe) detect the outage within the probe interval; PagerDuty / OpsGenie alerts fire on Grafana-downThe supporting signals.
| In-the-wild exploitation | Not observed. No campaigns, threat-actor reports, or incident disclosures reference CVE-2026-27879. Not listed in CISA KEV. |
|---|---|
| Proof-of-concept | None public. No PoC repositories on GitHub, Exploit-DB, or Nuclei templates as of September 2026. The attack is conceptually simple (craft a wide-range, fine-interval resample query) but no weaponized tooling exists. |
| EPSS | 0.376% (31st percentile) — well below the action threshold. Indicates very low predicted exploitation probability in the next 30 days. |
| CISA KEV | Not listed. No federal remediation deadline. |
| CVSS vector | CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:N/I:N/A:H — Network-reachable, low complexity, but requires authentication. Availability-only impact (no C/I). Scope unchanged. |
| Affected versions | Grafana 8.0.0 through 11.6.13, 12.0.0–12.1.9, 12.2.0–12.2.7, 12.3.0–12.3.5, 12.4.0–12.4.1. Massive version span — nearly every Grafana release since 2021. |
| Fixed versions | 11.6.14, 12.1.10, 12.2.8, 12.3.6, 12.4.2. Distro backports: RHEL/CentOS via RHSA-2026:62407; Ubuntu tracker at ubuntu.com/security/CVE-2026-27879. |
| Internet exposure | Shodan indexes ~128,000 internet-facing Grafana instances globally. Many are dev/staging dashboards, but a meaningful subset serves production observability. Not all are vulnerable (some already patched). |
| Disclosure date | 2026-03-27 (Grafana advisory); NVD published 2026-03-30. |
| Reporter / credit | Not publicly credited in the Grafana advisory or GHSA. |
Why this verdict
- Authentication gate already priced in, but real-world SSO/MFA adds further friction. The CVSS PR:L accounts for needing *a* login, but most enterprise Grafana sits behind SSO with MFA — obtaining a Viewer token requires prior credential compromise or insider access, compounding the attacker's cost beyond what CVSS models.
- Availability-only, transient impact. The crash produces a brief dashboard outage (seconds in Kubernetes, low minutes on bare metal with systemd auto-restart). No data is exfiltrated, no code is executed, no persistence is gained. This is a nuisance, not a breach.
- No PoC, no exploitation, rock-bottom EPSS. At 0.376% (31st percentile) with zero public weaponization and no KEV listing, the probability of this being used against your fleet in the next 180 days is negligible.
- Role multiplier: Grafana occupies the *observability/alerting visualization* tier. In the high-value-role catalog, the closest match is SIEM / detection plane. However, crashing Grafana does NOT disable the underlying telemetry pipeline (Prometheus, Loki, Mimir continue collecting). Alerting rules miss at most one evaluation cycle before auto-restart. The blast radius is host-level, temporary — not domain/fleet/supply-chain. In a multi-replica HA deployment (common in production), the blast radius is effectively zero because peers absorb traffic. This does NOT meet the floor threshold for HIGH (no domain takeover, no fleet compromise, no mass data egress, no supply-chain pivot). The MEDIUM floor holds.
- Replica and orchestration friction. Production Grafana commonly runs ≥2 replicas behind a load balancer. A single-instance OOM crash in that topology produces zero user-visible downtime — the attack is self-defeating.
Why not higher?
Elevating to HIGH would require either a path to code execution, data exfiltration, or a persistent / unrecoverable outage. This CVE delivers none of those. The blast radius even in the worst single-instance scenario is a temporary dashboard blackout — the attacker gains no foothold, no data, and the service self-heals. Grafana is not a canonical identity, PKI, or hypervisor component where availability loss cascades to fleet-wide impact.
Why not lower?
Dropping to LOW would undercount the risk in single-instance, internet-facing Grafana deployments without rate-limiting — an authenticated attacker can repeatedly crash the service and degrade monitoring visibility during a concurrent attack. The Availability:High CVSS component is real: the process *does* crash, and in non-HA environments the outage is user-visible. The enormous affected version range (8.0.0+) means most unpatched Grafana instances are vulnerable.
What to do — in priority order.
- Set memory cgroup limits on the Grafana process — Configure
MemoryMax=in systemd or container resource limits in Kubernetes (e.g.,resources.limits.memory: 2Gi). This causes the OOM-kill to fire faster and the auto-restart to recover in seconds rather than letting the host swap-thrash. No noisgate mitigation SLA applies for MEDIUM — go straight to the 365-day remediation window, but this control is cheap and should be standard anyway. - Deploy Grafana in HA mode with ≥2 replicas — Running multiple Grafana pods behind a load balancer ensures a single-instance OOM crash produces zero user-visible downtime. This is the single most effective compensating control and eliminates the attack's impact entirely.
- Rate-limit the
/api/ds/queryendpoint — Use a reverse proxy (nginx, Envoy, or cloud WAF) to throttle query submissions per user session. A limit of 10–20 req/s per user is generous for legitimate use and prevents rapid-fire OOM attempts. - Restrict Viewer account provisioning and disable anonymous access — Audit Grafana's
[auth.anonymous]and[auth]configuration blocks. Ensureenabled = falsefor anonymous access (default since Grafana 10). Remove stale Viewer accounts. Tighter access control reduces the pool of potential attackers. - Upgrade to a fixed Grafana version — Deploy 11.6.14, 12.1.10, 12.2.8, 12.3.6, or 12.4.2+ within the noisgate 365-day remediation SLA for MEDIUM-severity findings. Prioritize internet-facing instances.
- Network segmentation alone — if the attacker already has Viewer credentials (e.g., an insider or compromised SSO account), being on the internal network doesn't prevent the attack. The query API is the same internal or external.
- Grafana's built-in query caching — caching doesn't prevent the initial OOM-triggering query from being processed; it only caches *successful* responses. The crash happens before a response is generated.
- Disabling the Explore UI — the malicious resample query can be submitted directly to the
/api/ds/queryREST endpoint; hiding the Explore tab from Viewers doesn't block the API call.
Crowdsourced verification payload.
Run this script on the Grafana server (or any host that can reach the Grafana HTTP endpoint) as an unprivileged user. Invoke: bash check_cve_2026_27879.sh https://grafana.example.com. It queries the Grafana /api/health endpoint to extract the running version and compares it against the known-fixed versions. No authentication required for the health endpoint.
#!/usr/bin/env bash
# check_cve_2026_27879.sh — Detect CVE-2026-27879 (Grafana resample OOM DoS)
# Usage: bash check_cve_2026_27879.sh <GRAFANA_URL>
# Exit codes: 0 = PATCHED, 1 = VULNERABLE, 2 = UNKNOWN
set -euo pipefail
GRAFANA_URL="${1:-}"
if [[ -z "$GRAFANA_URL" ]]; then
echo "Usage: $0 <GRAFANA_URL>"
exit 2
fi
# Strip trailing slash
GRAFANA_URL="${GRAFANA_URL%/}"
# Fetch version from /api/health
RESPONSE=$(curl -s --max-time 10 "${GRAFANA_URL}/api/health" 2>/dev/null) || {
echo "UNKNOWN — could not reach ${GRAFANA_URL}/api/health"
exit 2
}
VERSION=$(echo "$RESPONSE" | grep -oP '"version"\s*:\s*"\K[0-9]+\.[0-9]+\.[0-9]+' 2>/dev/null) || {
echo "UNKNOWN — could not parse version from health endpoint"
exit 2
}
echo "Detected Grafana version: $VERSION"
# Version comparison helper
ver_cmp() {
printf '%s\n%s' "$1" "$2" | sort -t. -k1,1n -k2,2n -k3,3n | head -n1
}
MAJOR=$(echo "$VERSION" | cut -d. -f1)
MINOR=$(echo "$VERSION" | cut -d. -f2)
PATCH=$(echo "$VERSION" | cut -d. -f3)
VULNERABLE=0
# Affected: 8.0.0 <= v < 11.6.14 (i.e., major 8-10 all vulnerable; 11.x < 11.6.14)
if [[ $MAJOR -ge 8 && $MAJOR -le 10 ]]; then
VULNERABLE=1
elif [[ $MAJOR -eq 11 ]]; then
if [[ $(ver_cmp "$VERSION" "11.6.14") == "$VERSION" && "$VERSION" != "11.6.14" ]]; then
VULNERABLE=1
fi
# Affected: 12.0.0 <= v < 12.1.10
elif [[ $MAJOR -eq 12 && $MINOR -eq 0 ]]; then
VULNERABLE=1
elif [[ $MAJOR -eq 12 && $MINOR -eq 1 ]]; then
if [[ $(ver_cmp "$VERSION" "12.1.10") == "$VERSION" && "$VERSION" != "12.1.10" ]]; then
VULNERABLE=1
fi
# Affected: 12.2.0 <= v < 12.2.8
elif [[ $MAJOR -eq 12 && $MINOR -eq 2 ]]; then
if [[ $(ver_cmp "$VERSION" "12.2.8") == "$VERSION" && "$VERSION" != "12.2.8" ]]; then
VULNERABLE=1
fi
# Affected: 12.3.0 <= v < 12.3.6
elif [[ $MAJOR -eq 12 && $MINOR -eq 3 ]]; then
if [[ $(ver_cmp "$VERSION" "12.3.6") == "$VERSION" && "$VERSION" != "12.3.6" ]]; then
VULNERABLE=1
fi
# Affected: 12.4.0 <= v < 12.4.2
elif [[ $MAJOR -eq 12 && $MINOR -eq 4 ]]; then
if [[ $(ver_cmp "$VERSION" "12.4.2") == "$VERSION" && "$VERSION" != "12.4.2" ]]; then
VULNERABLE=1
fi
fi
if [[ $VULNERABLE -eq 1 ]]; then
echo "VULNERABLE — Grafana $VERSION is affected by CVE-2026-27879"
exit 1
else
echo "PATCHED — Grafana $VERSION is not affected by CVE-2026-27879"
exit 0
fiWhat defenders are saying.
Crowdsourced verification outputs.
Results submitted by users who ran the verification payload against their environment.