
Lokaler Proof-of-Concept-Verifier für CVE-2026-100671, der die Offenlegung und Wiederverwendung von Grav-Twig-Seitencache-Session-Cookies gegen Loopback-Ziele reproduziert.
Minimaler, nur lokal einsetzbarer Verifizierer für die Übernahme der Session
über den Grav Content-Twig/Page-Cache, die in Grav 2.0.25 behoben wurde.
Advisories:
exploit.py ist bewusst auf Loopback-Ziele beschränkt:
127.0.0.1::1localhostEs lehnt Remote-Hosts ab, folgt nur Loopback-Redirects, verwendet HTTP-Clients aus der Python-Standardbibliothek, wendet Request-Timeouts an und gibt niemals Bearer-Tokens, Cookies oder Response-Bodies aus.
Nur gegen eine Grav-Instanz verwenden, die Sie besitzen oder deren Test ausdrücklich autorisiert ist. Das Skript erstellt eine öffentliche Proof-Seite im lokalen Lab. Entfernen Sie diese Seite nach dem Test, wenn das Lab Inhalte zwischen Läufen behält.
get_cookie() liest serverseitig das Session-Cookie des besuchenden
Administrators.Das Page-Write-Konto benötigt nur den dokumentierten Low-Privilege-Write-Pfad.
Es benötigt kein api.pages.read, kein admin.* und keinen Super-Admin-Zugriff.
Der Opfer-Admin muss die öffentliche Seite nur einmal besuchen.
2.0.19 bis 2.0.24: anfällig mit der mitgelieferten
Standard-Content-Twig-Konfiguration.2.0.0 bis 2.0.18 und 1.7.x: nur betroffen, wenn Content-Twig
explizit aktiviert wurde.2.0.25: behoben.Betreiben Sie ein lokales Grav-Lab mit:
Dieses Zwei-Datei-Repository stellt Grav, PHP, Plugins oder Konten nicht bereit.
Legen Sie die Zugangsdaten über Umgebungsvariablen fest, damit sie nie in die Versionskontrolle gelangen:
export GRAV_BASE_URL=http://127.0.0.1:8080
export GRAV_WRITER_USERNAME=low
export GRAV_WRITER_PASSWORD='local-writer-password'
export GRAV_ADMIN_USERNAME=admin
export GRAV_ADMIN_PASSWORD='local-admin-password'
python3 exploit.py
Die Basis-URL muss Loopback bleiben. Die Standard-Route ist zufällig. Eine feste Route kann gewählt werden, wenn Läufe verglichen werden sollen:
python3 exploit.py --route /cookie-proof-24
Erwartetes anfälliges Ergebnis:
page_create_status=201
admin_login_status=200
victim_page_status=200
attacker_page_status=200
cached_victim_cookie_visible_to_attacker=yes
admin_cookie_value_match=yes
replayed_cookie_api_status=200
result=VULNERABLE
Der Befehl beendet sich mit 0, wenn das erwartete Ergebnis reproduziert wird,
mit 1, wenn es nicht reproduziert wird, und mit 2 bei einem Setup- oder
Transportfehler.
Führen Sie denselben Befehl gegen Grav 2.0.25 aus:
python3 exploit.py --expect fixed
Erwartetes behobenes Verhalten: kein für den Angreifer sichtbarer Session-Wert
und kein erfolgreiches Session-Replay. Ein sauberes behobenes Ergebnis beendet
sich mit 0 bei --expect fixed.
Aktualisieren Sie auf Grav 2.0.25 oder später. Für ältere Deployments listet
das Advisory diese temporären Maßnahmen auf:
security.twig_content.process_enabled: false; odersystem.pages.never_cache_twig: true setzen;Behandeln Sie HttpOnly, Secure oder SameSite nicht als Behebung: Das
anfällige Cookie-Auslesen erfolgt serverseitig während des Twig-Renderings.
Gemeldet von canhieu. Dieses Repository ist eine Reproduktionshilfe für das bereits öffentliche Advisory, kein Remote-Scanner und kein Tool zum Ernten von Zugangsdaten.