
Prodotti interessati: Atlassian Confluence Data Center & Confluence Server.
Data di pubblicazione: 04/10/2023.
Severità: Critical (CVSS ~ 10.0).
Tipo di vulnerabilità: Broken Access Control / Improper Authorization → consente a un attaccante di creare un account admin da remoto.
Il difetto risiede nel meccanismo di setup di Confluence
Versioni interessate: Confluence Data Center & Server 8.0.0 → 8.5.1.

Ciò deriva da uno degli interceptor, SetupCheckInterceptor di struts.xml
struts.xml è il file di configurazione centrale per Struts.
Definisce come Confluence mappa URL → Action class → View template.
Dichiara inoltre gli interceptor (classi di intercettazione che elaborano la request prima/dopo l'esecuzione dell'action).

In SetupCheckInterceptor viene chiamato BootstrapUtils.getBootstrapManager().isSetupComplete()
public String intercept(ActionInvocation actionInvocation) throws Exception {
if (BootstrapUtils.getBootstrapManager().isSetupComplete() && ContainerManager.isContainerSetup())
return "alreadysetup";
return actionInvocation.invoke();
}
Spiegazione
BootstrapUtils.getBootstrapManager().isSetupComplete()
→ Verifica se Confluence ha completato il processo di setup (tramite wizard, inserimento licenza, creazione utente admin) o meno.
ContainerManager.isContainerSetup()
→ Verifica se il container Spring IoC è stato inizializzato completamente.
Se entrambe le condizioni sono vere:
→ Significa che il sistema ha completato il setup → l'interceptor restituisce immediatamente "alreadysetup".
→ Non consente di eseguire altre action (di solito le action di setup come SetupDatabaseAction, SetupLicenseAction, ...).
Se il setup non è completo:
→ Chiama actionInvocation.invoke() → cioè continua l'esecuzione dell'action richiesta dall'utente.
getBootstrapManager() → di solito restituisce DefaultAtlassianBootstrapManager, che gestisce tutte le informazioni di configurazione principali durante il setup.
DefaultAtlassianBootstrapManager.isSetupCompletepossiamo vedere che il metodo di configurazione dell'applicazione isSetupCompleteviene chiamato per verificare se il processo di setup è stato completato.
=> Se impostiamo isSetupComplete = False, SetupCheckInterceptornon restituirà "alreadysetup" e /setup/setupadministrator.actionsarà accessibile.
Di seguito abbiamo un ServerInfoAction
ServerInfoAction = Action pubblica in Confluence → consente a qualsiasi utente di chiamarla senza login e senza token CSRF. Quando viene eseguita, restituisce solo "success" → mappata a un template che mostra le informazioni del server.
ConfluenceActionSupportConfluenceActionSupport vediamo che getBootstrapStatusProviderrestituisce BootstrapStatusProviderImpl, l'istanza che stiamo cercando
BootstrapStatusProviderImplc'è getApplicationConfig per restituire la configurazione dell'applicazione
ApplicationConfig, si può vedere che implementa il controllo setSetupComplete
setSetupComplete = falsegetBootstrapStatusProvider(). getApplicationConfig (). setSetupComplete ( false );
bootstrapStatusProvider.applicationConfig.setupComplete=false
/server-info.action, un URL in Confluence gestito da ServerInfoAction, poiché è un endpoint pubblico che non richiede login./server-info.action?bootstrapStatusProvider.applicationConfig.setupComplete=false

Controlliamo il Debug:
setupComplete (parametro passato al metodo)
→ false
Cioè il metodo viene chiamato con il parametro false.
this.setupComplete (variabile di istanza dell'oggetto ApplicationConfig)
→ true (prima dell'assegnazione).
Quando il comando termina → this.setupComplete diventa false.

/setup/setupadministrator.action e riusciamo
