← Back to Feed CACHED · 2026-09-21 08:58:30 · CACHE_KEY tenable:304688
tenable:304688 · CWE-400 · Disclosed 2026-03-27

Grafana 8.0.0 < 11.6.14 / 12.0.0 < 12.1.10 / 12.2.0 < 12.2.8 /...

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

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.

"Authenticated DoS via memory exhaustion — noisy, transient, no escalation path"
02 · The Attack Path

4 steps from start to impact.

STEP 01

Obtain Grafana viewer credentials

The attacker needs a valid session on the target Grafana instance. This can be a Viewer-role account provisioned via LDAP/SSO, a shared read-only service account, or — in misconfigured deployments — anonymous access (disabled by default since Grafana 10). Without authentication, the attack cannot proceed.
Conditions required:
  • Valid Grafana account (Viewer or higher)
  • Network reachability to Grafana HTTP(S) endpoint
Where this breaks in practice:
  • 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
Detection/coverage: Failed login attempts visible in Grafana audit log and SIEM; SSO providers log auth events
STEP 02

Craft malicious resample query

The attacker constructs a data-source query that invokes Grafana's Resample transformation with parameters chosen to maximize memory allocation — for example, an extremely small resample interval over a very large time window. No special tooling is needed; the query can be submitted via the Grafana Explore UI or the /api/ds/query REST endpoint.
Conditions required:
  • Knowledge of the resample transformation parameter space
  • Access to a configured data source the account can query
Where this breaks in practice:
  • 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/query can throttle attempts
Detection/coverage: Anomalous query volume or unusually large time-range queries detectable via Grafana request logs and data-source audit trails
STEP 03

Trigger unbounded memory allocation

Grafana's resample transformation processes the query without adequate bounds checking on the resulting data-point count. The server allocates memory proportional to (time_range / resample_interval), which can be made arbitrarily large. Memory grows until the Go runtime or the OS OOM-killer terminates the process.
Conditions required:
  • Grafana server has no memory cgroup limit or the limit is high enough to allow significant allocation before kill
Where this breaks in practice:
  • 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
Detection/coverage: Spike in Grafana process RSS visible in node-exporter / cAdvisor metrics; OOM-kill events in dmesg / kubelet logs
STEP 04

Grafana becomes temporarily unavailable

The Grafana process crashes. Dashboards, alerts, and the Explore UI are unreachable until the process restarts. Underlying data sources (Prometheus, Loki, InfluxDB, etc.) continue operating normally — only the visualization and alerting *frontend* is affected. In auto-restart environments, downtime is measured in seconds.
Conditions required:
  • No load-balanced Grafana replicas that absorb the traffic during restart
Where this breaks in practice:
  • 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
Detection/coverage: Synthetic health checks (e.g., /api/health probe) detect the outage within the probe interval; PagerDuty / OpsGenie alerts fire on Grafana-down
03 · Intelligence Metadata

The supporting signals.

In-the-wild exploitationNot observed. No campaigns, threat-actor reports, or incident disclosures reference CVE-2026-27879. Not listed in CISA KEV.
Proof-of-conceptNone 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.
EPSS0.376% (31st percentile) — well below the action threshold. Indicates very low predicted exploitation probability in the next 30 days.
CISA KEVNot listed. No federal remediation deadline.
CVSS vectorCVSS: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 versionsGrafana 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 versions11.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 exposureShodan 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 date2026-03-27 (Grafana advisory); NVD published 2026-03-30.
Reporter / creditNot publicly credited in the Grafana advisory or GHSA.
04 · The Call

Final Verdict
= UNCHANGED to MEDIUM (5.5/10)

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.

05 · Compensating Control

What to do — in priority order.

  1. 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.
  2. 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.
  3. Rate-limit the /api/ds/query endpoint — 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.
  4. Restrict Viewer account provisioning and disable anonymous access — Audit Grafana's [auth.anonymous] and [auth] configuration blocks. Ensure enabled = false for anonymous access (default since Grafana 10). Remove stale Viewer accounts. Tighter access control reduces the pool of potential attackers.
  5. 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.
What doesn't work
  • 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/query REST endpoint; hiding the Explore tab from Viewers doesn't block the API call.
06 · Verification

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.

noisgate-verify.sh
BASHREAD-ONLYSAFE
#!/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
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.