
CVE-2023-22515のステップバイステップのエクスプロイトウォークスルー。Atlassian Confluence ServerおよびData Centerの重大なアクセス制御の欠陥で、リモートでの管理者アカウント作成を可能にする。
影響を受ける製品: Atlassian Confluence Data Center & Confluence Server。
公開日: 2023年10月4日。
深刻度: Critical (CVSS ~ 10.0)。
脆弱性の種類: Broken Access Control / Improper Authorization → 攻撃者がリモートから管理者アカウントを作成できる。
脆弱性は Confluence setup mechanism に存在する。
影響: Confluence Data Center & Server 8.0.0 → 8.5.1。

これは、struts.xml のインターセプターの1つである SetupCheckInterceptor に起因します。
struts.xml は Struts のです。
Confluence が URL → Action クラス → View テンプレートへマッピングする方法を定義します。
また、インターセプター (アクション実行前後にリクエストを処理するクラス) を宣言します。

SetupCheckInterceptor 内で BootstrapUtils.getBootstrapManager().isSetupComplete() が呼び出されます。
public String intercept(ActionInvocation actionInvocation) throws Exception {
if (BootstrapUtils.getBootstrapManager().isSetupComplete() && ContainerManager.isContainerSetup())
return "alreadysetup";
return actionInvocation.invoke();
}
解説
BootstrapUtils.getBootstrapManager().isSetupComplete()
→ Confluence のセットアッププロセス (ウィザード、ライセンス入力、管理者ユーザー作成など) が完了しているかどうかを確認します。
ContainerManager.isContainerSetup()
→ Spring IoC コンテナーが完全に初期化されているかどうかを確認します。
両方の条件が true の場合:
→ システムはセットアップが完了していることを意味します → インターセプターは即座に "alreadysetup" を返します。
→ アクションは実行されません (通常は SetupDatabaseAction、SetupLicenseAction などのセットアップアクション)。
セットアップが未完了の場合:
→ actionInvocation.invoke() を呼び出します → つまり、ユーザーがリクエストしたアクションの実行を続行します。
getBootstrapManager() → 通常は DefaultAtlassianBootstrapManager を返します。これはセットアップ中にコアとなる全設定情報を管理します。
DefaultAtlassianBootstrapManager.isSetupComplete では、アプリケーション設定メソッド isSetupComplete が呼び出され、セットアッププロセスが完了しているかどうかが確認されることがわかります。
=> isSetupComplete を False にすると、SetupCheckInterceptor は "alreadysetup" を返さなくなり、/setup/setupadministrator.action にアクセスできるようになります。
次に、ServerInfoAction があります。
ServerInfoAction は Confluence 内の公開アクションです → ログイン不要、CSRF トークン不要で誰でも呼び出せます。実行時には "success" を返すだけで、サーバー情報を表示するテンプレートにマッピングされます。
ConfluenceActionSupport を継承しています。ConfluenceActionSupport 内で、getBootstrapStatusProvider が目的の BootstrapStatusProviderImpl を返すことがわかります。
BootstrapStatusProviderImpl には、アプリケーション設定を返す getApplicationConfig があります。
ApplicationConfig の内部で setSetupComplete のチェックが実装されていることが確認できます。
setSetupComplete を false に変更するための一連のメソッド呼び出しを導き出せます。getBootstrapStatusProvider(). getApplicationConfig (). setSetupComplete ( false );
bootstrapStatusProvider.applicationConfig.setupComplete=false
/server-info.action を利用します。この URL は ServerInfoAction によって処理されます。/server-info.action?bootstrapStatusProvider.applicationConfig.setupComplete=false

デバッグを確認します:
setupComplete (メソッドに渡されるパラメーター)
→ false
つまり、メソッドはパラメーター false で呼び出されています。
this.setupComplete (ApplicationConfig オブジェクトのインスタンス変数)
→ 代入前は true。
コマンドの実行が完了すると、this.setupComplete は false になります。

/setup/setupadministrator.action に再度アクセスすると成功します。
