An authenticated user types a comically long dashboard title and their own browser tab freezes
CVE-2025-1088 is an improper input validation issue in Grafana affecting versions prior to 11.6.2. When an authenticated user with dashboard-editing privileges saves a dashboard with an *excessively long title or panel name*, Chromium-based browsers rendering that dashboard become unresponsive. There is no server-side crash, no code execution, no data exposure — the impact is confined to the client-side rendering engine of whoever subsequently loads the dashboard.
Vendor severity is MEDIUM in Tenable's plugin catalog but the upstream CVSS is 2.7 (LOW). Reality tracks the upstream number, not the plugin bucket. The chain requires an authenticated Editor role, targets only browser responsiveness (kill-tab recovers), and has no lateral or persistence value. Calling this MEDIUM overstates it; it is textbook backlog hygiene.
3 steps from start to impact.
Attacker obtains Editor-role credentials in Grafana
Save Dashboard / Save Panel, which is gated behind the Editor or Admin role in Grafana's org RBAC model. Anonymous or Viewer accounts cannot reach the code path. In practice this means the attacker is already a trusted internal user or has phished/stolen a workforce credential and passed any SSO / MFA in front of Grafana.- Valid Grafana account with Editor+ role in at least one org/folder
- Network reachability to the Grafana UI
- Editor role is not handed out to random users in mature deployments
- SSO + MFA in front of Grafana blocks credential stuffing
- Audit log records the dashboard save with actor identity
Save dashboard with a pathologically long title/panel name
POST /api/dashboards/db) or UI to write a title string in the multi-megabyte range. No public weaponized tool exists — a two-line curl with a Python-generated payload is sufficient. The server accepts and persists it because input length validation is the missing control.- Editor session or API token
- Ability to invent a title beyond the browser's practical DOM/layout budget
- WAF rules on request body size may truncate the payload
- Grafana quotas on dashboard count / folder ACLs limit scope
/api/dashboards/db is trivially alertable in an access log.Victim loads the poisoned dashboard, browser tab hangs
- Victim navigates to the crafted dashboard
- Victim uses a Chromium-based browser
- Tab-scoped impact only — no session, cookie, or credential compromise
- Users learn quickly to avoid or delete the offending dashboard
- Admin can
DELETE /api/dashboards/uid/:uidin seconds
The supporting signals.
| CVE | CVE-2025-1088 — Grafana improper input validation (long dashboard title/panel name) |
|---|---|
| CWE | CWE-20 Improper Input Validation (client-side DoS) |
| CVSS v3.1 (upstream) | 2.7 LOW — AV:N/AC:L/PR:H/UI:R/S:U/C:N/I:N/A:L |
| Tenable plugin bucket | MEDIUM (240850) — inconsistent with the upstream 2.7 score |
| KEV status | Not listed in CISA KEV |
| EPSS | Negligible (<0.05% / <5th percentile) — no exploitation activity |
| Exploit PoC | No public weaponized exploit; trivial to reproduce with curl + long string. No Metasploit/Nuclei template. |
| Affected versions | All Grafana OSS/Enterprise < 11.6.2 |
| Fixed versions | Grafana 11.6.2+; distro backports: RHSA-2025:0662 (RHEL 9), ALSA-2025:8666 (AlmaLinux 10), RLSA-2025:8666 (Rocky 10) |
| Exposure | Shodan shows ~110k public Grafana instances, but exploitation requires an authenticated Editor — public exposure is not the risk axis |
| Disclosure / reporter | Disclosed via Grafana Labs security advisory, GHSA-crvv-6w6h-cv34 |
noisgate verdict.
The single decisive factor is impact scope: authenticated Editor + client-side tab freeze with no server, data, or session impact. There is no confidentiality or integrity loss, availability loss is limited to one browser tab of one user who chooses to open the dashboard, and the vulnerable action is already audit-logged and reversible with a single API call.
Why this verdict
- Privilege gate: requires an authenticated Editor+ role — an attacker who already has this can trash dashboards, exfil query results, and abuse datasource proxying in ways far more damaging than a tab hang.
- Impact ceiling: confidentiality = none, integrity = none, availability = one victim tab per navigation event. Server keeps serving.
- Role multiplier: Grafana is typically a *monitoring dashboard tier* — high-visibility but not identity, PKI, hypervisor, or backup infrastructure. Even in the worst deployment role (NOC wallboard) the outcome is a frozen wallboard, not fleet compromise. No role-based floor is triggered.
- No KEV, negligible EPSS, no weaponization — this is not on any adversary's target list.
- Tenable's MEDIUM label conflicts with the upstream CVSS 2.7 LOW — trust the vector, not the bucket.
Why not higher?
MEDIUM would imply meaningful production impact or a plausible pivot. Neither exists: no code execution, no data disclosure, no session takeover, and the trigger requires the exact privilege (Editor) that already allows the attacker to do worse things with legitimate features.
Why not lower?
IGNORE would be wrong because the fix is free (upgrade to 11.6.2, already shipped in distro backports) and leaving unpatched Grafana on the estate creates version drift that complicates future response. It's real work-item hygiene, just not urgent.
What to do — in priority order.
- Audit and prune Editor/Admin role assignments — Grafana orgs frequently accumulate stale Editors from onboarding scripts. Removing Editor from users who only need Viewer eliminates the population that can trigger this bug — do this as part of quarterly access review, no mitigation SLA required for LOW.
- Enforce SSO + MFA on Grafana — Prevents credential-stuffed access to Editor accounts; align with your existing IdP standards, no mitigation SLA for LOW — treat as baseline hardening.
- Add a WAF/reverse-proxy request-body size cap in front of Grafana — A 1 MB body cap on
/api/dashboards/dbblocks the pathological payload without affecting real dashboards. Configure on the fronting nginx/HAProxy/ALB during your next routine change window. - Upgrade Grafana to 11.6.2+ (or apply RHSA-2025:0662 / ALSA-2025:8666 / RLSA-2025:8666) — The real fix. Roll through the standard patch train — noisgate remediation SLA for LOW is backlog, target the next scheduled Grafana upgrade cycle.
- Network-layer IDS/IPS signatures — the payload is JSON with a legitimate
titlefield, indistinguishable from normal traffic without size heuristics - Blocking anonymous access — the bug requires *authenticated* Editors, so anonymous hardening does nothing here
- Browser hardening on end-user endpoints — the Chromium hang is expected behavior on any oversized DOM string; nothing to configure client-side
Crowdsourced verification payload.
Run on an *auditor workstation* with network reach and a Grafana API token (Viewer role is enough — this only reads /api/health). Invoke: GRAFANA_URL=https://grafana.example.com GRAFANA_TOKEN=glsa_xxx ./check_cve_2025_1088.sh. No elevated privileges needed on the Grafana host.
#!/usr/bin/env bash
# check_cve_2025_1088.sh — determine if a Grafana instance is exposed to CVE-2025-1088
# Exit codes: 0 PATCHED, 1 VULNERABLE, 2 UNKNOWN
set -u
: "${GRAFANA_URL:?Set GRAFANA_URL, e.g. https://grafana.example.com}"
: "${GRAFANA_TOKEN:?Set GRAFANA_TOKEN (Viewer-role service account token is sufficient)}"
FIXED_MAJOR=11
FIXED_MINOR=6
FIXED_PATCH=2
resp=$(curl -sS -k -H "Authorization: Bearer ${GRAFANA_TOKEN}" "${GRAFANA_URL%/}/api/health" || true)
if [ -z "$resp" ]; then
echo "UNKNOWN: no response from ${GRAFANA_URL}/api/health"
exit 2
fi
version=$(printf '%s' "$resp" | sed -n 's/.*"version"[[:space:]]*:[[:space:]]*"\([^"]*\)".*/\1/p')
if [ -z "$version" ]; then
echo "UNKNOWN: could not parse version from health endpoint"
exit 2
fi
# Strip pre-release / build metadata
core=${version%%-*}
core=${core%%+*}
IFS='.' read -r maj min pat <<< "$core"
maj=${maj:-0}; min=${min:-0}; pat=${pat:-0}
vuln=0
if [ "$maj" -lt "$FIXED_MAJOR" ]; then vuln=1
elif [ "$maj" -eq "$FIXED_MAJOR" ] && [ "$min" -lt "$FIXED_MINOR" ]; then vuln=1
elif [ "$maj" -eq "$FIXED_MAJOR" ] && [ "$min" -eq "$FIXED_MINOR" ] && [ "$pat" -lt "$FIXED_PATCH" ]; then vuln=1
fi
if [ "$vuln" -eq 1 ]; then
echo "VULNERABLE: Grafana ${version} < 11.6.2 (CVE-2025-1088)"
exit 1
fi
echo "PATCHED: Grafana ${version} >= 11.6.2"
exit 0
If you remember one thing.
/api/dashboards/db as a free hardening win. Spend the calendar time you'd have burned on this ticket auditing Editor-role assignments instead — that pays back on many bugs, not just this one.Sources
What defenders are saying.
Crowdsourced verification outputs.
Results submitted by users who ran the verification payload against their environment.