Documented in docs/SECURITY.md, tracked here so it isn't lost: apps under /app/* are same-origin with /admin/*, so compromised app JS can issue authenticated requests to the admin. The Fetch-Metadata/Origin CSRF guard helps contra cross-site requests, but same-origin code passes that boundary by design. This makes the Disk-panel backstops (#871) mandatory, but those checks are defense-in-depth, not an isolation boundary.
Threat model confirmado
Hoje uma aplicação proxied pode servir JavaScript arbitrário sob o mesmo scheme/host/port do painel. Se um container for comprometido, uma dependência frontend estiver maliciosa ou o próprio app não for confiável, esse JavaScript pode:
- chamar endpoints
/admin/* com o cookie de sessão automaticamente anexado;
- ler respostas same-origin;
- executar ações POST que o usuário logado poderia executar.
HttpOnly impede a leitura do valor do cookie, mas não impede o browser de enviá-lo. SameSite=Strict, validação de Origin e Fetch Metadata também não separam dois caminhos da mesma origem. CSP no documento do admin não controla o JavaScript já executando no documento da aplicação.
Impacto
O comprometimento de um app deixa de estar restrito ao container/upstream e pode alcançar o plano de controle do Ruscker usando a autoridade de um administrador que abriu o app na mesma sessão do navegador.
Direção sugerida
Curto prazo: topologia suportada e documentada
- Documentar uma receita oficial com pelo menos duas origens, por exemplo
admin.example.com e apps.example.com (ou wildcard por app).
- O reverse proxy deve encaminhar
/admin, login e portal apenas na origem administrativa; a origem de apps deve encaminhar somente /app//api/WS e assets estritamente necessários.
- Confirmar que cookies administrativos são host-only (
Domain ausente), Secure, HttpOnly e com o menor Path viável.
- Alertar que apenas trocar o path não cria isolamento.
Médio prazo: enforcement no próprio Ruscker
- Adicionar configuração explícita de hosts/origins administrativos e de apps.
- Rejeitar
/admin/* no host de apps e /app/* no host administrativo, inclusive quando X-Forwarded-Host é usado.
- Validar que forwarded headers só são confiados atrás de proxy configurado.
- Preservar base-path, rewriting, sticky sessions, WebSocket e redirects entre as origens sem abrir CORS amplo.
Critérios de aceite
Prioridade sugerida: alta / security hardening, especialmente para operadores que executam imagens de terceiros ou permitem que equipes publiquem seus próprios apps.
Documented in
docs/SECURITY.md, tracked here so it isn't lost: apps under/app/*are same-origin with/admin/*, so compromised app JS can issue authenticated requests to the admin. The Fetch-Metadata/Origin CSRF guard helps contra cross-site requests, but same-origin code passes that boundary by design. This makes the Disk-panel backstops (#871) mandatory, but those checks are defense-in-depth, not an isolation boundary.Threat model confirmado
Hoje uma aplicação proxied pode servir JavaScript arbitrário sob o mesmo scheme/host/port do painel. Se um container for comprometido, uma dependência frontend estiver maliciosa ou o próprio app não for confiável, esse JavaScript pode:
/admin/*com o cookie de sessão automaticamente anexado;HttpOnlyimpede a leitura do valor do cookie, mas não impede o browser de enviá-lo.SameSite=Strict, validação deOrigine Fetch Metadata também não separam dois caminhos da mesma origem. CSP no documento do admin não controla o JavaScript já executando no documento da aplicação.Impacto
O comprometimento de um app deixa de estar restrito ao container/upstream e pode alcançar o plano de controle do Ruscker usando a autoridade de um administrador que abriu o app na mesma sessão do navegador.
Direção sugerida
Curto prazo: topologia suportada e documentada
admin.example.comeapps.example.com(ou wildcard por app)./admin, login e portal apenas na origem administrativa; a origem de apps deve encaminhar somente/app//api/WS e assets estritamente necessários.Domainausente),Secure,HttpOnlye com o menorPathviável.Médio prazo: enforcement no próprio Ruscker
/admin/*no host de apps e/app/*no host administrativo, inclusive quandoX-Forwarded-Hosté usado.Critérios de aceite
Host/X-Forwarded-Host, base-path, HTTP e WebSocket.Prioridade sugerida: alta / security hardening, especialmente para operadores que executam imagens de terceiros ou permitem que equipes publiquem seus próprios apps.