CVE-2022-21702: Cross site scripting in Grafana proxy

Published Feb 4, 2022
·
Updated

A Cross-site scripting (XSS) vulnerability was found in the way Grafana handles data sources. This flaw allows an attacker to serve HTML content through the Grafana data source or plugin proxy and trick a user to visit this HTML page using a specially crafted link and execute a Cross-site scripting (XSS) attack. Should an existing data source connected to Grafana be compromised, it could be used to inappropriately gain access to other data sources connected to the same Grafana org.

Other sources

An XSS vulnerability was found in the way Grafana handles data sources. Should an existing data source connected to Grafana be compromised, it could be used to inappropriately gain access to other data sources connected to the same Grafana org.

GitHub security advisory: https://github.com/grafana/grafana/security/advisories/GHSA-xc3p-28hw-q24g

Grafana blog post: https://grafana.com/blog/2022/02/08/grafana-7.5.15-and-8.3.5-released-with-moderate-severity-security-fixes/

Red Hat

Grafana is an open-source platform for monitoring and observability. In affected versions an attacker could serve HTML content thru the Grafana datasource or plugin proxy and trick a user to visit this HTML page using a specially crafted link and execute a Cross-site Scripting (XSS) attack. The attacker could either compromise an existing datasource for a specific Grafana instance or either set up its own public service and instruct anyone to set it up in their Grafana instance. To be impacted, all of the following must be applicable. For the data source proxy: A Grafana HTTP-based datasource configured with Server as Access Mode and a URL set, the attacker has to be in control of the HTTP server serving the URL of above datasource, and a specially crafted link pointing at the attacker controlled data source must be clicked on by an authenticated user. For the plugin proxy: A Grafana HTTP-based app plugin configured and enabled with a URL set, the attacker has to be in control of the HTTP server serving the URL of above app, and a specially crafted link pointing at the attacker controlled plugin must be clocked on by an authenticated user. For the backend plugin resource: An attacker must be able to navigate an authenticated user to a compromised plugin through a crafted link. Users are advised to update to a patched version. There are no known workarounds for this vulnerability.

Today we are releasing Grafana 8.3.5 and 7.5.15. This patch release includes MEDIUM severity security fix for XSS for Grafana.

Release v.8.3.5, only containing security fixes:

- Download Grafana 8.3.5 - Release notes

Release v.7.5.15, only containing security fixes:

- Download Grafana 7.5.15 - Release notes

XSS (CVE-2022-21702)

Summary

On Jan. 16, an external security researcher, Jasu Viding contacted Grafana to disclose an XSS vulnerability in the way that Grafana handles data sources.

An attacker could serve HTML content through the Grafana datasource or plugin proxy and trick a user to visit this HTML page using a specially crafted link and execute a Cross-site Scripting (XSS) attack. The attacker could either compromise an existing datasource for a specific Grafana instance or either set up its own public service and instruct anyone to set it up in their Grafana instance.

We believe that this vulnerability is rated at CVSS 6.8 (CVSS:3.1/AV:N/AC:L/PR:L/UI:R/S:C/C:H/I:N/A:N).

Impact

Should an existing data source connected to Grafana be compromised, it could be used to inappropriately gain access to other data sources connected to the same Grafana org.

Affected versions with MEDIUM severity

To be impacted, all of the following must be applicable:

For data source proxy: - A Grafana instance running version v2.0.0-beta1 up to v8.3.4. - A Grafana HTTP-based datasource configured with Server as Access Mode and a URL set. - Attacker to be in control of the HTTP server serving the URL of above data source. - A specially crafted link pointing at http://host/api/datasources/proxy/"data source id" and attacker somehow tricks a user of the above Grafana instance to click/visit the link. - A user that’s already authenticated to above Grafana instance clicks on/visits the specially crafted link sent/provided by the attacker.

For plugin proxy: - A Grafana instance running version v2.0.0-beta1 up to v8.3.4. - A Grafana HTTP-based app plugin configured and enabled with a URL set. - Attacker to be in control of the HTTP server serving the URL of above app. - A specially crafted link pointing at http://host/api/plugin-proxy/"plugin id" and attacker somehow tricks a user of the above Grafana instance to click/visit the link. - A user that’s already authenticated to above Grafana instance clicks on/visits the specially crafted link sent/provided by the attacker.

Backend plugin resource: - A Grafana instance running version v7.0.0-beta1 up to v8.3.4. - Attacker potentially needs to craft a custom plugin to be able to pull this off, but if an attacker can compromise/control the backend service that a backend plugin connects to, it might be possible to serve HTML content via the /api/plugins/"plugin Id"/resources or /api/datasources/"id"/resources routes. - A specially crafted link pointing at /api/plugins/"plugin Id">/resources or /api/datasources/"id"/resources and attacker somehow tricks a user of the above Grafana instance to click/visit the link. - A user that’s already authenticated to above Grafana instance clicks on/visits the specially crafted link sent/provided by the attacker.

Root Causes Trigger Reproduced and confirmed via this Golang app:

package main

import ( "fmt" "log" "net/http" )

func main() { http.HandleFunc("/", func(w http.ResponseWriter, r http.Request) { fmt.Fprintf(w, "<html><body><script>alert('XSS');</script></body></html>") })

log.Fatal(http.ListenAndServe(":3011", nil)) }

A Prometheus datasource is configured in Grafana with URL http://localhost:3011.

When visitining http://localhost:3000/api/datasources/proxy/170 the scripts declared in the HTML page executes. Confirmed in both Chrome and Firefox.

Solutions and mitigations

All installations between Grafana v2.0.0-beta1 up to v8.3.4 should be upgraded as soon as possible.

Workarounds

Using a proxy, set a response header Content Security Policy: sandbox for the following routes:

/api/datasources/proxy /api/plugin-proxy /api/plugins/<pluginId>/resources /api/datasources/<id>/resources

Another possible mitigation is setting the response header Content-Disposition: attachment; “proxy.txt”. Confirmed in both Chrome and Firefox.

Timeline and postmortem

Here is a detailed timeline starting from when we originally learned of the issue. All times in UTC.

- 2022-01-16 16:19 Issue submitted by Jasu Viding - 2022-01-17 14:40 CVSS score confirmed 6.8 at maximum and MEDIUM impact - 2022-01-17 15:15 Vulnerability confirmed reproducible - 2022-01-17 16:01 Begin mitigation for Grafana Cloud - 2022-01-18 15:12 Similar report received - 2022-01-19 09:57 CVE requested - 2022-01-19 13:21 PR with fix opened - 2022-01-19 19:53 GitHub issues CVE-2022-21702 - 2022-01-20 12:43 Second similar report received - 2022-01-21 14:30 Private release planned for 2022-01-25, and public release planned for 2022-02-01 - 2022-01-25 12:00 Private release with patches - 2022-02-01 12:00 During the public release process, we realized that private 7.x release was incomplete. Abort public release, send second private release to customers using 7.x - 2022-02-08 13:00 Public release

Acknowledgement We would like to thank Jasu Viding for responsibly disclosing the vulnerability.

Reporting security issues

If you think you have found a security vulnerability, please send a report to security@grafana.com. This address can be used for all of Grafana Labs' open source and commercial products (including, but not limited to Grafana, Grafana Cloud, Grafana Enterprise, and grafana.com). We can accept only vulnerability reports at this address. We would prefer that you encrypt your message to us by using our PGP key. The key fingerprint is

F988 7BEA 027A 049F AE8E 5CAA D125 8932 BE24 C5CA

The key is available from keyserver.ubuntu.com.

Security announcements

We maintain a security category on our blog, where we will always post a summary, remediation, and mitigation details for any patch containing security fixes.

You can also subscribe to our RSS feed.

GitHub

Affected Software

14 affected componentsFixes available
redhat/grafana<0:7.5.15-3.el8
0:7.5.15-3.el8
redhat/grafana<0:7.5.15-3.el9
0:7.5.15-3.el9
redhat/grafana<7.5.15
7.5.15
redhat/grafana<8.3.5
8.3.5
go/github.com/grafana/grafana>=8.0.0<=8.3.4
8.3.5
go/github.com/grafana/grafana>=2.0.0-beta1<7.5.15
7.5.15
Grafana Grafana>=2.0.1<7.5.15
Grafana Grafana>=8.0.0<8.3.5
Grafana Grafana=2.0.0-beta1
Grafana Grafana=2.0.0-beta3
NetApp E-series Performance Analyzer<3.0
Fedoraproject Fedora=34
Fedoraproject Fedora=35
Fedoraproject Fedora=36

Remediation

Recommended actions to resolve this vulnerability, in priority order.

  1. Upgrade

    Upgrade redhat/grafana to a version that resolves this vulnerability.

    Fixed in 0:7.5.15-3.el8
  2. Upgrade

    Upgrade redhat/grafana to a version that resolves this vulnerability.

    Fixed in 0:7.5.15-3.el9
  3. Upgrade

    Upgrade go/github.com/grafana/grafana to a version that resolves this vulnerability.

    Fixed in 8.3.5
  4. Upgrade

    Upgrade go/github.com/grafana/grafana to a version that resolves this vulnerability.

    Fixed in 7.5.15
  5. Upgrade

    Upgrade redhat/grafana to a version that resolves this vulnerability.

    Fixed in 7.5.15
  6. Upgrade

    Upgrade redhat/grafana to a version that resolves this vulnerability.

    Fixed in 8.3.5
  7. Upgrade

    Upgrade grafana/grafana to a version that resolves this vulnerability.

    Fixed in 7.5.15
  8. Upgrade

    Upgrade grafana/grafana to a version that resolves this vulnerability.

    Fixed in 8.3.5
  9. Configuration

    Set the response header Content-Disposition: attachment; "proxy.txt" for the Grafana proxy routes implicated in the XSS (e.g., /api/datasources/<id>/resources*, /api/datasources/proxy*, /api/plugin-proxy*, /api/plugins/<pluginId>/resources*).

    Grafana (XSS mitigation via proxy response header) Content-Disposition = attachment; "proxy.txt"
  10. Configuration

    Using a proxy, set the response header Content Security Policy: sandbox for the routes implicated in the XSS (e.g., /api/datasources/<id>/resources*, /api/datasources/proxy*, /api/plugin-proxy*, /api/plugins/<pluginId>/resources*).

    Grafana (XSS mitigation via Content-Security-Policy) Content-Security-Policy = sandbox

Event History

Feb 4, 2022
Data Sourced
via Red Hat·12:22 PM
DescriptionSeverityAffected Software
Feb 8, 2022
CVE Published
12:00 AM
CVE Published
via MITRE·07:40 PM
Data Sourced
via MITRE·07:40 PM
DescriptionSeverityWeakness
May 14, 2024
Advisory Published
via GitHub·10:15 PM

Parent advisories

This vulnerability appears in the following advisories.

Frequently Asked Questions

1

What is CVE-2022-21702?

CVE-2022-21702 is a Cross-site scripting (XSS) vulnerability found in the way Grafana handles data sources.

2

How does the CVE-2022-21702 vulnerability in Grafana work?

In affected versions, an attacker could serve HTML content through the Grafana datasource or plugin proxy and trick a user to visit this HTML page using a specially crafted link, leading to a Cross-site Scripting (XSS) attack.

3

What software versions are affected by CVE-2022-21702?

The affected software versions are Grafana 7.5.15-3.el8, Grafana 7.5.15-3.el9, Grafana 7.5.15, and Grafana 8.3.5.

4

What is the severity of CVE-2022-21702?

The severity of CVE-2022-21702 is medium with a CVSS score of 6.8.

5

How can I fix the CVE-2022-21702 vulnerability in Grafana?

To fix the CVE-2022-21702 vulnerability, upgrade Grafana to versions 7.5.15 or 8.3.5.

Contact

SecAlerts Pty Ltd.
132 Wickham Terrace
Fortitude Valley,
QLD 4006, Australia
info@secalerts.co
By using SecAlerts services, you agree to our services end-user license agreement. This website is safeguarded by reCAPTCHA and governed by the Google Privacy Policy and Terms of Service. All names, logos, and brands of products are owned by their respective owners, and any usage of these names, logos, and brands for identification purposes only does not imply endorsement. If you possess any content that requires removal, please get in touch with us.
© 2026 SecAlerts Pty Ltd.
ABN: 70 645 966 203, ACN: 645 966 203