
Stirling-PDF v3.2.0 – Kritisch – Remote – H2 RUNSCRIPT-Überbleibsel – CREATE OR REPLACE ALIAS import-database
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · stirling-h2-import-leftover
Stirling-PDF 3.2.0 - Stirling Tools
Klasse: H2-RUNSCRIPT-Überbleibsel von GHSA-mrr8. Reichweite: Remote ROLE_ADMIN.
POST /api/v1/database/import-database ist @PreAuthorize("hasRole('ADMIN')"). validateSqlContent soll CREATE ALIAS verhindern. Die Denylist lautet CREATE\s+(FORCE\s+)?ALIAS. H2 parseCreate erlaubt OR REPLACE vor ALIAS, sodass CREATE OR REPLACE ALIAS … FOR "java.lang.…" auf die Allowlist \bCREATE\b passt und die Denylist umgeht. Der Validator bereinigt eine Kopie. verifyBackup und die Produktion führen RUNSCRIPT FROM ? auf der Originaldatei aus.
GHSA-mrr8-934j-4g8m / CVE-2026-85714 hat die ursprünglichen FILE_READ- / CREATE ALIAS- / CSVWRITE-Strings geschlossen. Dieses Überbleibsel ist die OR REPLACE-Lücke in demselben Validator.
Ein ROLE_ADMIN-Import erzeugt einen Java-Alias, den die Denylist eigentlich verhindern soll. Ein späterer Backup-Download enthält Angreifer-SQL. Host-FILE_READ / FileUtils-RCE aus dem ursprünglichen Advisory ist abgeleitet, nicht im Labor in diesem Paket nachgewiesen.
| ID | noch keine CVE |
| CWE | CWE-94 / CWE-184 |
| CVSS | 9.1 CVSS:3.1/AV:N/AC:L/PR:H/UI:N/S:C/C:H/I:H/A:H |
| Produkt | Stirling-PDF |
| Betroffen | v3.2.0 (a7e593728dd9aa81e75318a949789d3c2e9ee754), Image stirlingtools/stirling-pdf:3.2.0-fat |
| Auth | ROLE_ADMIN, standardmäßig eingebettetes H2. Standardmäßig erster Admin admin / stirling, bis geändert |
| Lizenz | GNU Affero GPL v3.0 |
| Lab | nur 127.0.0.1:18152 |
Überbleibsel der Reihe Stirling-PDF v3.2.0 leftovers. Verwandt: stirling-storage-folder-idor (implizites Storage-Root des Processing-Ordners). Dieses Paket ist das H2-Import-Überbleibsel.
ROLE_ADMIN bei login-on proprietary/fat mit dem standardmäßig eingebetteten H2. Der standardmäßige erste Admin ist admin / stirling, wenn initialLogin leer ist. Unauth ist nicht erforderlich. Lite-Image und PostgreSQL-Datenquellen liefern diesen Controller nicht mit.
Privilegientabelle (vollständig). Gleicher Maßstab wie Signal-Server Dropwizard admin: Methode + Pfad, was dieser Aufruf gewährt, Recon vs. Integrität vs. Verfügbarkeit, im Labor nachgewiesen vs. abgeleitet, angrenzende Angriffsfläche, die geschlossen bleibt.
| Achse | Methode + Pfad | Gewährt | Provenienz |
|---|---|---|---|
| Integrität | ROLE_ADMIN POST /api/v1/database/import-database mit CREATE OR REPLACE ALIAS lab_nano FOR "java.lang.System.nanoTime" plus INSERT INTO lab_w VALUES('STIRLING-H2-IMPORT-WITNESS') | 200 importIntoDatabaseSuccessed. Java-Alias erstellt. Angreifer-SQL unter RUNSCRIPT committet | Im Labor nachgewiesen |
| Recon | ROLE_ADMIN GET /api/v1/database/createDatabaseBackup, dann GET /api/v1/database/download/backup_202610172328.sql | 50432-Byte-Backup enthält STIRLING-H2-IMPORT-WITNESS | Im Labor nachgewiesen |
| Recon / Host-Datei | derselbe Import, der FILE_READ('/etc/os-release') in EXECUTE IMMEDIATE einbettet | 500 Backup verification failed. Host-Bytes nicht in einem Backup | Labor-Zusatz FEHLGESCHLAGEN |
| Integrität / RCE | Alias org.h2.store.fs.FileUtils plus CSVWRITE einer Python-User-Site-.pth, dann Office-Konvertierung | Befehlsausführung als das Dienstkonto | Abgeleitet aus GHSA-mrr8. Hier nicht im Labor getestet |
| Verfügbarkeit | keine beansprucht | Import kann Anwendungstabellen ersetzen | Abgeleitet. Nicht das Labor-Orakel |
Bleibt bei diesem Pin geschlossen
| Achse | Methode + Pfad | Warum geschlossen |
|---|---|---|
| Integrität | unauth POST /api/v1/database/import-database | 401 Authentication required. Methodensicherheit ADMIN bleibt aktiv, wenn HTTP permitAll ist |
| Integrität | ROLE_ADMIN-Import von bloßem CREATE ALIAS | 500 SQL script contains disallowed operations and was rejected |
| Integrität | Lite- / DISABLE_ADDITIONAL_FEATURES-Image | DatabaseController fehlt |
| Integrität | benutzerdefinierte PostgreSQL-Datenquelle | @Conditional(H2SQLCondition.class) |
Ich beanspruche keine Reverse Shell, und ich beanspruche Host-FILE_READ nicht als im Labor nachgewiesen. Der Rest ist der Denylist-Fehlgriff, der CREATE OR REPLACE ALIAS … FOR "java.lang.…" durch RUNSCRIPT lässt.
v3.2.0 liefert noch den GHSA-mrr8-Validator aus. Ich blieb auf diesem Tag und las DENIED_PATTERNS. Die Alias-Zeile ist CREATE\s+(FORCE\s+)?ALIAS. H2s Parser akzeptiert CREATE OR REPLACE ALIAS. Tests decken die offensichtlichen CREATE ALIAS- / FILE_READ(-Strings ab. Sie decken OR REPLACE nicht ab.
Das Labor meldet sich als Standard-Admin an, schließt change-password-on-login ab, importiert ein verweigertes CREATE ALIAS (500) und importiert dann CREATE OR REPLACE ALIAS plus einen INSERT-Zeugen (200). Ein Backup-Download enthält den Zeugen.
Irrwege: unauth-Import als im Scope behandeln (401); EXECUTE IMMEDIATE + FILE_READ als den Rest behandeln (verifyBackup 500); das ursprüngliche, nicht verschleierte CREATE ALIAS als noch aktiv behandeln (es wird verweigert).
python3 stirling-h2-import-leftover-Abraxas-Labs.py
oder
cd lab
./run.sh
Ziel ist ausschließlich http://127.0.0.1:18152. Image stirlingtools/stirling-pdf:3.2.0-fat. Docker erforderlich. Login aktiviert. Der Launcher führt chdir in lab/ aus und startet run.sh per exec.
IOC unauth-import http=401
IOC negative-import http=500 ... disallowed operations ...
IOC leftover-import bypass=create-or-replace-alias http=200 ... importIntoDatabaseSuccessed
IOC download file=backup_202610172328.sql http=200 bytes=50432 witness=1
SUCCESS stirling-h2-import-leftover negative-denied=yes bypass=create-or-replace-alias backup-has-witness=yes file=backup_202610172328.sql unauth-import=401 STIRLING-H2-IMPORT-WITNESS
Erweitern Sie die Denylist so, dass OR REPLACE nicht zwischen CREATE und ALIAS stehen kann. Führen Sie validateSqlContent auf denselben Bytes aus, die RUNSCRIPT ausführen wird. Verweigern Sie EXECUTE IMMEDIATE, es sei denn, das innere SQL wird ebenfalls gescannt.
Pattern.compile("(?i)\\bCREATE\\s+(OR\\s+REPLACE\\s+)?(FORCE\\s+)?ALIAS\\b")