
CVE-2023-22515 के लिए चरण-दर-चरण शोषण वॉकथ्रू, जो Atlassian Confluence Server और Data Center में एक महत्वपूर्ण टूटी हुई एक्सेस नियंत्रण भेद्यता है, जो दूरस्थ व्यवस्थापक खाता निर्माण को सक्षम बनाती है।
प्रभावित उत्पाद: Atlassian Confluence Data Center और Confluence Server.
प्रकाशन तिथि: 04/10/2023.
गंभीरता स्तर: क्रिटिकल (CVSS ~ 10.0).
भेद्यता प्रकार: टूटा हुआ एक्सेस कंट्रोल / अनुचित प्राधिकरण → हमलावर को दूरस्थ रूप से व्यवस्थापक खाता बनाने की अनुमति देता है।
त्रुटि Confluence सेटअप तंत्र में स्थित है
प्रभाव: Confluence Data Center और Server 8.0.0 → 8.5.1.

यह struts.xml के इंटरसेप्टर से उत्पन्न होता है
SetupCheckInterceptorstruts.xml Struts के लिए केंद्रीय कॉन्फ़िगरेशन फ़ाइल है।
यह परिभाषित करता है कि Confluence URL को Action class → View template से कैसे मैप करता है।
साथ ही इंटरसेप्टर (वे वर्ग जो एक्शन चलाने से पहले/बाद में अनुरोध प्रोसेसिंग को रोकते हैं) घोषित करता है।

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 कंटेनर पूरी तरह से आरंभ हो गया है या नहीं।
यदि दोनों शर्तें सत्य हैं:
→ इसका मतलब है कि सिस्टम पूरी तरह से सेटअप हो चुका है → इंटरसेप्टर तुरंत "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 का लाभ उठाएंगे, जो Confluence में एक URL है, जिसे ServerInfoAction द्वारा संभाला जाता है क्योंकि यह एक सार्वजनिक एंडपॉइंट है जिसमें लॉगिन की आवश्यकता नहीं है।/server-info.action?bootstrapStatusProvider.applicationConfig.setupComplete=false

आइए डीबग की जाँच करें:
setupComplete (विधि में पास किया गया पैरामीटर)
→ false
अर्थात विधि को false पैरामीटर के साथ कॉल किया जा रहा है।
this.setupComplete (ApplicationConfig ऑब्जेक्ट का इंस्टेंस वेरिएबल)
→ true (असाइनमेंट से पहले)।
जब कमांड निष्पादित हो जाता है → this.setupComplete false हो जाएगा।

/setup/setupadministrator.action पर फिर से जाने का प्रयास करें, और यह सफल होता है
