CVE-2021-43798 – Pfad-Traversal – Grafana

Grafana ist eine weit verbreitete Open-Source-Plattform für Analyse und Monitoring. Die Schwachstelle CVE-2021-43798 ermöglicht es nicht authentifizierten Angreifern, beliebige Dateien vom Dateisystem des Servers zu lesen, indem sie eine Schwachstelle bei der Verarbeitung von Plugin-Pfaden ausnutzen. Diese Schwachstelle wurde aktiv ausgenutzt und ist nun im CISA-Katalog der bekannten ausgenutzten Schwachstellen (Known Exploited Vulnerabilities Catalog) gelistet. Es ist entscheidend, die verfügbaren Patches umgehend anzuwenden.

ProduktGrafana, Grafana
Datum2025-10-10 13:14:42

Technische Zusammenfassung

Die Schwachstelle befand sich in der Funktion getPluginAssets innerhalb der Datei pkg/api/plugins.go. Der ursprüngliche Code führte keine Validierung des angeforderten Dateipfads durch, sondern verwendete einfach den URL-Parameter, um einen Dateipfad zu konstruieren:

func (hs *HTTPServer) getPluginAssets(c *models.ReqContext) {

  pluginID := web.Params(c.Req)[":pluginId"]

        ...........................

  requestedFile := filepath.Clean(web.Params(c.Req)["*"])

  pluginFilePath := filepath.Join(plugin.PluginDir, requestedFile)

        ...........................

  f, err := os.Open(pluginFilePath)

        ...........................

}

Der Code nahm den vom Benutzer bereitgestellten Wildcard-Pfad (web.Params(c.Req)["*"]) entgegen, führte ein filepath.Clean direkt darauf aus und anschließend ein filepath.Join(plugin.PluginDir, requestedFile). Dies ermöglichte es, durch Segmente wie ..%2f..%2f..%2f..%2fetc/passwd nach der Zusammenführung der Pfade aus dem Plugin-Verzeichnis “auszubrechen”.

Die Korrektur sieht nun wie folgt aus:

func (hs *HTTPServer) getPluginAssets(c *models.ReqContext) {

  pluginID := web.Params(c.Req)[":pluginId"]

  plugin, exists := hs.pluginStore.Plugin(c.Req.Context(), pluginID)

  if (!exists) {

    c.JsonApiErr(404, "Plugin not found", nil)

    return

  }

  // prepend slash for cleaning relative paths

  requestedFile := filepath.Clean(filepath.Join("/", web.Params(c.Req)["*"]))

  rel, err := filepath.Rel("/", requestedFile)

  if (err != nil) {

    // slash is prepended above therefore this is not expected to fail

    c.JsonApiErr(500, "Failed to get the relative path", err)

    return

  }

  if !plugin.IncludedInSignature(rel) {

    hs.log.Warn("Access to requested plugin file will be forbidden in upcoming Grafana versions as the file "+

      "is not included in the plugin signature", "file", requestedFile)

  }

  absPluginDir, err := filepath.Abs(plugin.PluginDir)

  if (err != nil) {

    c.JsonApiErr(500, "Failed to get plugin absolute path", nil)

    return

  }

  pluginFilePath := filepath.Join(absPluginDir, rel)

  f, err := os.Open(pluginFilePath)

        ...........................

}

Empfehlungen

  1. Patch umgehend anwenden: Aktualisieren Sie alle Grafana-Instanzen zwischen den Versionen v8.0.0-beta1 und v8.3.0 auf die neueste Version.

  2. Reverse Proxy: Falls ein Update nicht möglich ist, verwenden Sie einen Reverse Proxy vor Grafana, der den Pfad der Anfrage normalisiert, um die Schwachstelle zu entschärfen.

  3. Überwachung und Analyse: Führen Sie ein Audit der Zugriffe durch und überprüfen Sie die Anfragen an den Endpunkt /public/plugins/ auf Anomalien.

  4. Defense in Depth: Nutzen Sie Web Application Firewalls (WAF), die so konfiguriert sind, dass sie Versuche von Path-Traversal als zusätzliche Schutzschicht blockieren.

[Callforaction-THREAT-Footer]

Leave a Reply

Your email address will not be published. Required fields are marked *