
استغلال لـ CVE-2021-21239: تجاوز التحقق من توقيع SAML في pysaml2/Redash. يقوم بتزوير استجابات SAML بمفاتيح عامة مدمجة لانتحال هوية المستخدمين وتصعيد الامتيازات عبر التزويد الفوري (JIT).
لغة تأكيد الأمان القابلة للتوسيع (SAML) هي معيار مفتوح لتبادل بيانات المصادقة والتفويض بين الأطراف في نظام هوية موحد. تمكن من الدخول الموحد (SSO) عبر النطاقات. المكونات الرئيسية هي:
في تدفق SAML النموذجي، يعيد موفر الخدمة توجيه المستخدم إلى موفر الهوية للمصادقة. يعيد موفر الهوية استجابة SAML موقعة تحتوي على تأكيدات حول المستخدم (مثل البريد الإلكتروني، الاسم). يتحقق موفر الخدمة من التوقيع ويقوم بتوفير المستخدم أو تسجيل دخوله.
CVE-2021-21239 هي ثغرة في تجاوز التحقق من التوقيع في مكتبة pysaml2 (إصدارات <6.5.0)، والتي تستخدمها Redash <=10.1.0 لـ SAML SSO. على المستوى العالي، تسمح للمهاجم بتزوير استجابة SAML تحتوي على مفتاح عام مدمج عشوائي، مما يمكن من انتحال شخصية المستخدم وتصعيد الصلاحيات عبر التوفير الفوري (JIT).
تنشأ الثغرة من كيفية قيام pysaml2 باستدعاء xmlsec1 للتحقق من توقيعات SAML. xmlsec1، بشكل افتراضي، يفضل المفاتيح العامة المدمجة في <ds:KeyInfo> الخاصة باستجابة SAML على شهادة موفر الهوية المكونة. يمكن للمهاجم صياغة استجابة SAML بزوج مفاتيح RSA مولد ذاتيًا، ودمج المفتاح العام في ، وتوقيع التأكيد بالمفتاح الخاص. بما أن pysaml2 لا يقيد لاستخدام شهادة موفر الهوية الموثوقة فقط، يعتبر التوقيع المزور صحيحًا، مما يسمح للمهاجم بتسجيل الدخول كأي مستخدم (مثل مسؤول) والحصول على أعلى الصلاحيات.
<ds:RSAKeyValue>xmlsec1على مستوى الكود، الثغرة موجودة في sigver.py (دالة check_signature) في pysaml2. قائمة أوامر xmlsec1 تفتقر إلى خيار --enabled-key-data raw-x509-cert، مما يسمح لـ xmlsec1 باستخدام مفاتيح مدمجة غير موثوقة:
com_list = [
self.xmlsec, '--verify', '--enabled-reference-uris', 'empty,same-doc',
'--pubkey-cert-pem', cert_file_name,
'--id-attr:%s' % id_attr, node_name,
'--node-id', nodeid, '--output', output_file_name, xml_file_name
]
يسمح هذا بهجمات حيث يقوم المهاجم بتعديل البريد الإلكتروني في <saml:NameID> لانتحال شخصية أي مستخدم، مستفيدًا من التوفير الفوري.
لاختبار الاستغلال، يتم تشغيل مثيل محلي لـ Redash (الإصدار v10.1.0 أو أقدم) باستخدام Docker Compose. يتضمن الإعداد تكوين SAML SSO مع موفر هوية Google:
docker-compose up.REDASH_SAML_LOGIN_ENABLED=true، REDASH_SAML_METADATA_URL=... من موفر هوية Google).يسمح هذا الإعداد باختبار استجابة SAML المزورة المرسلة عبر سكريبت Python أو Burp Suite، مع التحقق من تصعيد الصلاحيات.
تنشأ الثغرة لأن استدعاء pysaml2 لـ xmlsec1 يسمح باستخدام المفاتيح المدمجة للتحقق، متجاوزًا شهادة موفر الهوية الموثوقة. يقوم المهاجم بتوليد زوج مفاتيح RSA، وصياغة استجابة SAML بالمفتاح العام في <ds:RSAKeyValue>، وتعديل السمات (مثل البريد الإلكتروني إلى بريد المسؤول)، وتوقيع التأكيد. xmlsec1 يتحقق باستخدام المفتاح المدمج، معتبرًا إياه صحيحًا.
تم تنفيذ الإصلاح في pysaml2 v6.5.0 (الالتزام الأولي في 17 يناير 2021) في src/saml2/sigver.py. تم تحديث قائمة أوامر xmlsec1 لتتضمن --enabled-key-data raw-x509-cert، مما يقيد التحقق بشهادة موفر الهوية المكونة:
com_list = [
self.xmlsec, '--verify', '--enabled-reference-uris', 'empty,same-doc',
'--pubkey-cert-pem', cert_file_name,
'--enabled-key-data', 'raw-x509-cert',
'--id-attr:%s' % id_attr, node_name,
'--node-id', nodeid, '--output', output_file_name, xml_file_name
]
يفرض هذا التحقق من سلسلة الثقة، مما يمنع استخدام المفاتيح المدمجة. قامت Redash بإصلاح ذلك عن طريق ترقية pysaml2 في الإصدارات اللاحقة (مثل v11+). الإصدارات الضعيفة لم تستخدم --insecure؛ كان الخلل هو عدم وجود خيار التقييد.
كود الاستغلال منفذ في cve-2021-21239.py. هذا السكريبت بلغة Python يقوم بأتمتة عملية تزوير استجابة SAML لاستغلال CVE-2021-21239 في Redash <=10.1.0، مما يمكن من انتحال شخصية المستخدم وتصعيد الصلاحيات عبر التوفير الفوري. يستهدف الاستغلال موفر هوية SAML من Google Workspace ولكن تم اختبار الهجوم مع موفري هوية آخرين (keycloak). يقوم السكريبت بالخطوات التالية:
email="[email protected]").idpid من نقطة نهاية تسجيل الدخول SAML لـ Redash إذا لم يتم توفيره، لضمان التوافق مع تكوين الهدف.SAMLResponseTempalte.xml) يحتوي على حوامل للبريد الإلكتروني والأسماء والطوابع الزمنية ومعرف التأكيد. يتم توليد طوابع زمنية ديناميكية بتوقيت UTC مع نافذة صلاحية مدتها 5 دقائق لاجتياز التحقق من صحة Redash.xmlsec لتوقيع عنصر <saml:Assertion> بـ RSA-SHA256، مع دمج المفتاح العام في <ds:RSAKeyValue> لاستغلال الثغرة./saml/callback?org_slug=default).تطلب استغلال CVE-2021-21239 صياغة استجابة SAML مزورة يقبلها Redash عبر التوفير الفوري. الصعوبات الرئيسية وطرق تجاوزها:
<ds:RSAKeyValue>، والتوقيع بالمفتاح الخاص.xmlsec1 الثنائية، لكن مكتبة Python xmlsec تسببت في عدم تطابق الملخص بسبب مشاكل المسافات/tسوية المتعارف عليها. تم تجاوزها بتسلسل XML في سطر واحد (etree.tostring(..., pretty_print=False)) قبل التوقيع.NotOnOrAfter البعيد في المستقبل في الرفض؛ تم تجاوزه باستخدام طوابع زمنية ديناميكية بتوقيت UTC مع نافذة صلاحية مدتها 5 دقائق.SAMLResponse مزدوجًا، مما تسبب في فشل التحليل؛ تم تجاوزه بإرسال بيانات النموذج الخام.تسلط هذه التحديات الضوء على الحاجة إلى معالجة دقيقة لـ XML وإعداد البيئة لاستغلال الثغرة بفعالية. يوضح كود الاستغلال المقدم ذلك بنجاح، مزورًا استجابة SAML لانتحال شخصية المستخدمين والحصول على الوصول.