
Laboratório baseado em Docker para reproduzir e validar CVE-2026-28496, uma vulnerabilidade de Server-Side Template Injection no renderizador Twig do FOSSBilling, com alvos de comparação vulneráveis e corrigidos.
Este repositório contém um laboratório Docker local para reproduzir e validar o CVE-2026-28496, uma vulnerabilidade de Injeção de Template no Lado do Servidor que afeta o comportamento de renderização de templates Twig do FOSSBilling.
FOSSBilling é uma plataforma gratuita e de código aberto de faturamento e gerenciamento de clientes. As versões anteriores a 0.8.0 são afetadas por um comportamento inseguro de renderização de templates Twig que pode avaliar expressões de template fornecidas. O FOSSBilling 0.8.0 é usado como alvo de comparação corrigido neste laboratório.
Este laboratório compara duas versões do FOSSBilling:
| Serviço | Versão do FOSSBilling | Propósito | URL |
|---|---|---|---|
| vuln | 0.7.2 | Alvo de comparação vulnerável | http://localhost:8081 |
| patched | 0.8.0 | Alvo de comparação corrigido | http://localhost:8082 |
O caminho de validação HTTP demonstrado neste laboratório local é:```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
No alvo vulnerável, a chamada de API retorna:```json
{"result":"49","error":null}
No alvo corrigido, a mesma solicitação retorna:```json {"result":null,"error":{"message":"Unknown API call system/system/string_render","code":879}}
Este laboratório valida o comportamento HTTP vulnerável versus corrigido usando FOSSBilling 0.7.2 e FOSSBilling 0.8.0.
O laboratório é intencionalmente limitado a serviços Docker locais. Não visa sistemas externos e não inclui web shells, malware, persistência, callbacks externos, dumping de banco de dados ou cargas destrutivas.
## Fatos Verificados
| Alegação | Evidência | Como verificar neste laboratório |
| ----------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------ | -------------------------------------------------------------------------------------- |
| CVE-2026-28496 afeta versões do FOSSBilling anteriores a 0.8.0. | O CVE público e os metadados de aviso identificam o FOSSBilling anterior a 0.8.0 como afetado por SSTI do Twig. | Revise a seção de Referências e compare as versões vulnerável e corrigida do alvo. |
| O FOSSBilling 0.7.2 é usado como alvo vulnerável de comparação. | O serviço vulnerável é construído a partir da imagem Docker oficial `fossbilling/fossbilling:0.7.2`. | Inspecione `vuln/Dockerfile` e execute `docker compose ps -a`. |
| O FOSSBilling 0.8.0 é usado como alvo corrigido de comparação. | O serviço corrigido é construído a partir da imagem Docker oficial `fossbilling/fossbilling:0.8.0`. | Inspecione `patched/Dockerfile` e execute `docker compose ps -a`. |
| O caminho HTTP vulnerável é `/api/system/system/string_render`. | O alvo vulnerável retorna JSON com `result: "49"` para `_tpl={{ 7*7 }}`. | Execute `python3 poc/poc.py --url http://localhost:8081`. |
| O alvo corrigido não expõe o mesmo comportamento HTTP. | O alvo corrigido retorna `Unknown API call system/system/string_render`. | Execute `python3 poc/poc.py --url http://localhost:8082`. |
| O PoC é exclusivamente HTTP. | `poc/poc.py` envia requisições HTTP POST e não chama Docker, Docker Compose, comandos de shell ou APIs de contêiner. | Inspecione `poc/poc.py`. |
| O laboratório instala automaticamente ambos os alvos FOSSBilling durante a inicialização do Docker Compose. | Os contêineres sidecar de instalação única completam a configuração e saem com status 0. | Execute `docker compose ps -a` e `docker compose logs installer-vuln installer-patched`. |
| O alvo vulnerável renderiza a expressão Twig inofensiva. | A resposta HTTP da porta 8081 é `{"result":"49","error":null}`. | Execute o comando PoC vulnerável. |
| O alvo corrigido não renderiza a mesma expressão através do caminho de API testado. | A resposta HTTP da porta 8082 é um erro da API JSON com código `879`. | Execute o comando PoC corrigido. |
## Premissas e Desconhecidos
Este laboratório usa o FOSSBilling 0.7.2 como alvo vulnerável de comparação porque pesquisas públicas de vulnerabilidade identificam versões do FOSSBilling anteriores a 0.8.0 como afetadas, e 0.7.2 é a última versão vulnerável usada na cadeia testada.
Este laboratório usa o FOSSBilling 0.8.0 como alvo corrigido de comparação porque metadados de aviso público identificam 0.8.0 como a versão corrigida.
Este laboratório foca no comportamento HTTP observável de:```text
POST /api/system/system/string_render
com este corpo JSON:```json {"_tpl":"{{ 7*7 }}"}
O laboratório demonstra que o FOSSBilling 0.7.2 renderiza a expressão Twig fornecida através do caminho da API HTTP, enquanto o FOSSBilling 0.8.0 não expõe a mesma chamada de API.
Este laboratório não afirma testar todos os recursos de renderização de templates do FOSSBilling. O CVE-2026-28496 também se relaciona a outros contextos de renderização Twig, como recursos de renderização de templates disponíveis dentro da aplicação.
Este laboratório não demonstra a cadeia completa de execução remota de código não autenticada. Ele valida o comportamento HTTP não autenticado observado no alvo local do FOSSBilling 0.7.2 e o compara com o FOSSBilling 0.8.0. A cadeia pública completa envolve comportamento adicional de autorização da API além da validação segura de expressão Twig mostrada aqui.
O laboratório não demonstra:
* execução remota de comandos,
* extração de credenciais,
* extração de banco de dados,
* instalação de extensões,
* escrita arbitrária de arquivos,
* persistência,
* upload de web shell,
* callbacks externos,
* ataques contra sistemas não laboratoriais,
* ou atividades de pós-exploração.
## Resumo da Causa Raiz
A causa raiz do CVE-2026-28496 é a renderização insegura de templates Twig.
O FOSSBilling usa Twig para renderizar templates dinâmicos. Em versões vulneráveis, uma string de template fornecida pode ser passada para a lógica de renderização Twig sem restrições de sandbox suficientes.