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.
| Produkt | Grafana, Grafana |
| Datum | 2025-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
Patch umgehend anwenden: Aktualisieren Sie alle Grafana-Instanzen zwischen den Versionen v8.0.0-beta1 und v8.3.0 auf die neueste Version.
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.
Überwachung und Analyse: Führen Sie ein Audit der Zugriffe durch und überprüfen Sie die Anfragen an den Endpunkt
/public/plugins/auf Anomalien.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