
Passo a passo de exploração para CVE-2023-22515, uma vulnerabilidade crítica de controle de acesso quebrado no Atlassian Confluence Server and Data Center, permitindo a criação remota de conta de administrador.
Produto afetado: Atlassian Confluence Data Center & Confluence Server.
Data de divulgação: 04/10/2023.
Gravidade: Crítica (CVSS ~ 10.0).
Tipo de vulnerabilidade: Controle de Acesso Quebrado / Autorização Impropria → permite que um invasor crie uma conta de administrador remotamente.
O erro está no mecanismo de configuração do Confluence
Impacto: Confluence Data Center & Server 8.0.0 → 8.5.1.

Isso se origina de um dos interceptadores, o SetupCheckInterceptor, no .
struts.xmlstruts.xml é o arquivo de configuração central do Struts.
Ele define como o Confluence mapeia URL → Classe Action → Template de View.
Também declara interceptadores (classes que interceptam o processamento da requisição antes/depois de executar a action).

No SetupCheckInterceptor é chamado BootstrapUtils.getBootstrapManager().isSetupComplete()
public String intercept(ActionInvocation actionInvocation) throws Exception {
if (BootstrapUtils.getBootstrapManager().isSetupComplete() && ContainerManager.isContainerSetup())
return "alreadysetup";
return actionInvocation.invoke();
}
Explicação
BootstrapUtils.getBootstrapManager().isSetupComplete()
→ Verifica se o Confluence concluiu o processo de configuração (via wizard, inserção de licença, criação de usuário admin).
ContainerManager.isContainerSetup()
→ Verifica se o container Spring IoC foi completamente inicializado.
Se ambas as condições forem verdadeiras:
→ Significa que o sistema já foi configurado completamente → o interceptador retorna "alreadysetup" imediatamente.
→ Impede a execução da action (geralmente actions de configuração como SetupDatabaseAction, SetupLicenseAction, …).
Se ainda não estiver totalmente configurado:
→ Chama actionInvocation.invoke() → ou seja, continua a execução da action solicitada pelo usuário.
getBootstrapManager() → geralmente retorna DefaultAtlassianBootstrapManager
é o gerenciador de todas as informações de configuração essenciais durante o setup.
DefaultAtlassianBootstrapManager.isSetupComplete, podemos ver que o método de configuração da aplicação isSetupComplete é chamado para verificar se a configuração foi concluída.
=> Se fizermos isSetupComplete = False, então o SetupCheckInterceptor não retornará “alreadysetup” e /setup/setupadministrator.action poderá ser acessado.
Abaixo temos um ServerInfoAction
ServerInfoAction = Action pública no Confluence → permite que qualquer usuário a chame sem necessidade de login, sem token CSRF. Quando executada, ela retorna apenas "success" → mapeia para um template que exibe informações do servidor.
ConfluenceActionSupport.ConfluenceActionSupport, encontramos getBootstrapStatusProvider retornando BootstrapStatusProviderImpl, a instância que estamos procurando.
BootstrapStatusProviderImpl existe getApplicationConfig para retornar a configuração da aplicação.
ApplicationConfig, podemos ver que ele implementa a verificação setSetupComplete.
setSetupComplete = false.getBootstrapStatusProvider(). getApplicationConfig (). setSetupComplete ( false );
bootstrapStatusProvider.applicationConfig.setupComplete=false
/server-info.action, que é uma URL no Confluence, processada por ServerInfoAction, sendo um endpoint público que não requer autenticação./server-info.action?bootstrapStatusProvider.applicationConfig.setupComplete=false

Vamos verificar o Debug:
setupComplete (parâmetro passado ao método)
→ false
Ou seja, o método está sendo chamado com o parâmetro false.
this.setupComplete (variável de instância do objeto ApplicationConfig)
→ true (antes da atribuição).
Quando o comando termina → this.setupComplete se torna false.

/setup/setupadministrator.action e obter sucesso.
