
Controle de Acesso Quebrado no Confluence Server - CVE-2023-22515
A Atlassian foi informada sobre uma possível vulnerabilidade que poderia ser explorada e comprometer o ambiente por meio de acesso administrativo. Em 4 de outubro de 2023, a Atlassian divulgou um aviso de segurança sobre a CVE-2023-22515, que recebeu uma pontuação CVE de 10.0. A vulnerabilidade foi introduzida na versão 8.0.0 do Confluence Server e nas edições Data Center e está presente nas versões <8.3.3, <8.4.3, <8.5.2.
Um atacante pode explorar a vulnerabilidade para criar uma conta adicional no Confluence com privilégios administrativos totais. O atacante não precisa de nenhuma informação prévia para explorar a vulnerabilidade. Acredita-se que a vulnerabilidade possibilite outros vetores de ataque desconhecidos e deve ser corrigida o mais rápido possível.
Com essa vulnerabilidade, o atacante pode retornar ao estágio de configuração inicial do Confluence, conseguindo criar um novo usuário com acesso administrativo. Tudo isso é possível porque o Confluence é construído usando o framework Apache Struts, que depende do pacote XWork. O XWork permite definir Actions na forma de uma classe Java. Cada Action pode ser invocada por meio de uma URL, e a classe Java correspondente tratará a solicitação, fará o que a Action exigir e emitirá uma resposta.
Esse problema ocorre principalmente devido a uma action de classe, onde podemos invocar atributos via URL
A exploração ocorre na action ServerInfoAction, onde podemos manipular os getters/setters da classe e redefinir a configuração de setup.
Se você analisar o código da classe ServerInfoAction, verá que ela estende a classe ConfluenceActionSupport. Ao fazer isso, ela herdará também todos os seus métodos. Um desses métodos é um getter que retorna um objeto BootstrapStatusProvider:
public class ConfluenceActionSupport extends ActionSupport implements LocaleProvider, WebInterface, MessageHolderAware {
public BootstrapStatusProvider getBootstrapStatusProvider() {
if (this.bootstrapStatusProvider == null)
this.bootstrapStatusProvider = BootstrapStatusProviderImpl.getInstance();
return this.bootstrapStatusProvider;
}
}
Nós nos importamos com a classe BootstrapStatusProvider porque ela tem outro método getter que podemos usar para recuperar um objeto ApplicationConfiguration:
public class BootstrapStatusProviderImpl implements BootstrapStatusProvider, BootstrapManagerInternal {
public ApplicationConfiguration getApplicationConfig() {
return this.delegate.getApplicationConfig();
}
}
Esse objeto contém a configuração do aplicativo, incluindo um atributo que informa ao Confluence se a configuração inicial foi concluída. Tal atributo pode ser modificado usando um setter na classe ApplicationConfig:
public class ApplicationConfig implements ApplicationConfiguration {
public synchronized void setSetupComplete(boolean setupComplete) {
this.setupComplete = setupComplete;
}
}
Se pudermos chamar setSetupComplete(false), podemos redefinir o processo de configuração inicial, e podemos fazer isso usando os métodos getters/setters da seguinte forma;
http://10.10.227.86:8090/server-info.action?bootstrapStatusProvider.applicationConfig.setupComplete=false
Esta url chamará todos os métodos que mencionamos acima, chegando ao método alvo responsável por redefinir o setup.
getBootstrapStatusProvider().getApplicationConfig().setSetupComplete(false)
Abaixo, temos um exemplo de um servidor com uma versão vulnerável do Confluence.
vamos tentar reiniciar o processo de configuração usando a chamada de método explicada acima;
http://atlassian.poc:8090/server-info.action?bootstrapStatusProvider.applicationConfig.setupComplete=false
Depois de definir o parâmetro setupcomplete como false, receberemos o retorno de sucesso. Isso significa que a tentativa de alterar o parâmetro foi bem-sucedida.
vamos tentar criar uma nova conta acessando a url de setup, da qual tentamos redefinir o processo.
http://atlassian.poc:8090/setup/setupadministrator-start.action
Conseguimos redefinir o processo de configuração e criar um novo usuário com acesso administrativo.
A vulnerabilidade foi corrigida nas versões 8.3.3, 8.4.3 e 8.5.2. Quaisquer branches de versões mais recentes também devem estar seguras.
Para mais detalhes, a Atlassian divulgou detalhes dessa vulnerabilidade em seu site (Saiba mais - Atlassian).