Skip to content
KitploitKITPLOIT
OutilsBlog
Soumettre
OutilsBlog
Soumettre

Outils de Hacking, PenTest et Cybersécurité pour votre Arsenal de Sécurité !

Kitploit est un répertoire d'outils de hacking, de cybersécurité et de pentesting. Découvrez les dernières mises à jour des projets pour trouver des vulnérabilités, analyser des systèmes, automatiser les tests et renforcer votre sécurité.

··Flux·Contact·Confidentialité·© 2026 Kitploit

Répertoire d'outils

Catégories

Voir toutes les catégories
Loading categories
CVE-2026-78851 — Avis technique détaillant une vulnérabilité de traversée de chemin authentifiée dans la fonction Twig media_directory() de Grav CMS, permettant l'énumération arbitraire de répertoires et la divulgation de chemins du système de fichiers. | Kitploit
Outils/GitHubGitHub/slo-cyber-sec/cve-2026-78851
Analyse des VulnérabilitésExploitationCollecte d'InformationsSécurité WebTests d'Intrusion
GitHubslo-cyber-sec/cve-2026-78851

CVE-2026-78851

Avis technique détaillant une vulnérabilité de traversée de chemin authentifiée dans la fonction Twig media_directory() de Grav CMS, permettant l'énumération arbitraire de répertoires et la divulgation de chemins du système de fichiers.

Voir le dépôt
il y a 2 moisPas encore vérifié

Populaires

Voir tout →

Découvrez les outils les plus utilisés par notre communauté.

Explorer tous les outils

Parcourez notre collection d'outils

Voir tous les outils →
Partager

Grav - Traversée de chemin authentifiée / Divulgation de répertoires arbitraires via Twig media_directory()

Rapporteur

Nom : CYBER-SEC
Contact : [email protected]

Résumé

La fonction Twig media_directory() de Grav est exposée dans la liste blanche du bac à sable Twig du contenu des pages, mais elle ne fait pas correctement respecter le confinement des chemins pour les entrées qui ne sont pas des flux.

Un utilisateur authentifié disposant de privilèges d'édition de pages peut appeler media_directory('/chemin/absolu') ou utiliser une traversée relative telle que media_directory('../../../../chemin') dans le contenu de pages compatible Twig. Grav indexe ensuite les fichiers de type média depuis les répertoires lisibles par l'utilisateur du serveur web.

Les objets Medium renvoyés exposent des propriétés autorisées par le bac à sable telles que et , ce qui entraîne une énumération arbitraire de répertoires et la divulgation de chemins absolus du système de fichiers. Pour les fichiers image/SVG, la génération d'URL ou de cache peut exposer des fichiers via la gestion publique du cache de Grav.

filepath
filename

Il s'agit d'une vulnérabilité de divulgation d'informations authentifiée. Elle n'est pas connue pour permettre une exploitation non authentifiée ou une exécution directe de code à distance.

Produit concerné

Produit : CMS Grav à fichiers plats
Dépôt : https://github.com/getgrav/grav
Versions concernées vérifiées : 2.0.3, 2.0.4, 2.0.6
Composant : Twig media_directory() / bac à sable Twig du contenu des pages de Grav

CWE

  • CWE-22 : Limitation incorrecte d'un nom de chemin à un répertoire restreint (« Traversée de chemin »)
  • CWE-200 : Exposition d'informations sensibles à un acteur non autorisé

CVSS v3.1

Vecteur : CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:N/A:N
Score de base : 6,5 Moyen

Conditions d'attaque

  • L'attaquant doit être authentifié.
  • L'attaquant doit disposer de privilèges d'édition de pages.
  • Le traitement du contenu Twig doit être activé.
  • Le répertoire cible doit être lisible par l'utilisateur du serveur web.

Détails techniques

Le point sensible vulnérable se trouve dans :

root@kitploit:~
system/src/Grav/Common/Twig/Extension/GravExtension.php

Logique concernée :

root@kitploit:~
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;
}

Seules les entrées stream:// sont résolues via le localisateur de Grav. Les chemins absolus ou relatifs qui ne sont pas des flux sont transmis tels quels à new Media($media_dir) sans validation canonique realpath(), sans rejet de la traversée, ni confinement aux répertoires contrôlés par Grav et approuvés.

La fonction est exposée via la liste blanche du bac à sable Twig du contenu des pages :

root@kitploit:~
system/config/security.yaml
allowed_functions:
  - media_directory

Le bac à sable autorise également les méthodes/propriétés Medium telles que :

root@kitploit:~
filepath
filename
url
cache
resize

Cela permet à un éditeur de pages authentifié de divulguer des noms de fichiers et des chemins absolus depuis des répertoires arbitraires lisibles. Pour les fichiers image/SVG, la génération d'URL/cache publique peut exposer le contenu des fichiers.

Preuve de concept

Avec le traitement du contenu Twig activé, créez ou modifiez une page Grav et insérez :

root@kitploit:~
{% for name, m in media_directory('/var/www') %}
{{ name }} = {{ m.filepath }}
{% endfor %}

Forme avec traversée :

root@kitploit:~
{% for name, m in media_directory('../../../../app/www/public') %}
{{ name }} = {{ m.filepath }}
{% endfor %}

Exemple d'exposition d'image/SVG :

root@kitploit:~
{{ media_directory('/chemin/absolu/vers/prive')['secret.svg'].url }}

Lorsque la page est enregistrée et rendue, Grav indexe les fichiers depuis le chemin contrôlé par l'attaquant et expose les noms de fichiers ainsi que les chemins absolus du système de fichiers.

Comportement vérifié

Vérifié sur Grav 2.0.6 à l'aide de l'image Docker linuxserver/grav:latest.

Les résultats observés comprenaient :

root@kitploit:~
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

La traversée relative a également été confirmée :

root@kitploit:~
../../../../app/www/public

L'exposition de fichiers SVG via .url a également été confirmée dans un environnement de test local contrôlé.

Impact

Un éditeur de pages authentifié peut :

  • Énumérer les fichiers de type média dans des répertoires arbitraires lisibles par l'utilisateur du serveur web.
  • Divulguer des chemins absolus du système de fichiers et des noms de fichiers.
  • Cartographier la structure de l'application et l'agencement du système de fichiers côté serveur.
  • Identifier des fichiers sensibles, des sauvegardes, des fichiers de configuration, des journaux ou des artefacts de déploiement par leur nom.
  • Potentiellement exposer des fichiers image/SVG en dehors de la racine web prévue via la génération de cache ou d'URL publique.

Cette vulnérabilité relève de la classe des divulgations et ne doit pas être signalée comme une exécution de code à distance.

Correction

Correctifs recommandés :

  1. Retirer media_directory de la liste blanche du bac à sable Twig du contenu des pages.

ou :

  1. Appliquer un confinement strict des chemins canoniques à media_directory() :
  • Résoudre tous les chemins avec realpath().
  • Rejeter les chemins contenant des séquences de traversée.
  • Rejeter les chemins qui se résolvent en dehors des racines contrôlées par Grav et approuvées.
  • Autoriser uniquement les racines sûres telles que user://pages, user://images ou d'autres répertoires média explicitement approuvés.
  • Revalider les chemins avant l'indexation des fichiers et avant la génération de cache/URL.

Divulgation

Ce problème a été signalé par CYBER-SEC.

Références

  • https://github.com/getgrav/grav
  • https://github.com/getgrav/grav/releases
  • https://getgrav.org/downloads
  • https://github.com/getgrav/grav/security/advisories
Télécharger l’outil