ثغرة Authlib: قائمة توقيعات فاضية بتمرّق أي JWS، حدّث لـ 1.9.0

Authlib لحد 1.8.0 بتقبل JWS بصيغة JSON فيه قائمة توقيعات فاضية، وبترجّع محتواه كأنه موقّع، بلا ما تفحص ولا مفتاح. الإصلاح بنسخة 1.9.0.

نُشر في دقيقتين قراءة#أمن التطبيقات#تحديثات أمنية

إذا مشروعك Python وبيستعمل Authlib ليتحقق من توكنات JWS جاية من برّا، في ثغرة حرجة بتخلّي أي حدا يبعتلك محتوى بلا توقيع، والمكتبة بترجّعه كأنه موقّع. هون بتعرف إذا كودك متأثر، وكيف تصلّحه.

شو الثغرة بـ Authlib؟

ثغرة Authlib هي إنو الدالة JsonWebSignature.deserialize_json() بتقبل JWS بصيغة JSON قائمة توقيعاته (signatures) فاضية، وبترجّع المحتوى كأنه موقّع، بلا ما تفحص ولا توقيع وبلا ما يلزمها مفتاح.

الـ JWS هو محتوى (متل بيانات مستخدم أو صلاحياته) ومعه توقيع بيثبت مين كتبه. صيغة JSON منه بتسمح بأكتر من توقيع على نفس المحتوى، لهيك التوقيعات فيها قائمة.

الإرشاد بقاعدة ثغرات GitHub اسمه GHSA-6v38-4h7w-rj9h، ورقم الثغرة CVE-2026-96760.

تقييمها حرج: 9.1 على CVSS 3.1.

ليش التوقيعات الفاضية بتمرق؟

السبب إنو علامة «صالح» بالكود بتبلّش صح، وما بتصير غلط إلا جوّا حلقة بتمرق على التوقيعات. إذا القائمة فاضية، الحلقة ما بتشتغل ولا مرة، فالعلامة بتضل صح والمحتوى بيرجع كأنه موقّع.

الإرشاد بيعطي مثال: JSON فيه محتوى و"signatures": []. على Authlib 1.8.0 المكتبة قبلته، حتى لما الكود مرّق مفتاح حقيقي. أما توقيع خربان، فالمكتبة رفضته متل ما لازم.

هل كودي متأثر؟

كودك متأثر إذا نسخة Authlib عندك لحد 1.8.0، وبتنادي deserialize_json() على JWS ما إنت يلي عملته.

الإرشاد بيقول إنو الخطر هون: إذا المحتوى فيه هوية المستخدم أو صلاحياته، المهاجم بيكتب يلي بدّه ياه وبيدخل بلا تسجيل دخول وبلا مفتاح.

وانتبه للنسخة 1.8.0 بالذات. إرشاد Authlib نفسه بيقول إنو الثغرة كانت منشورة قبل، والجديد هو مدى النسخ: السجلات يلي انتشرت كانت ما بتعدّ 1.8.0 بين النسخ المتأثرة. فإذا فحصت مشروعك قبل وطلع «سليم» على 1.8.0، افحصه من جديد.

إذا قصة التوكنات المزوّرة بتهمك، كتبنا قبل عن ثغرة Postiz يلي بتخلّي مستخدم يسرق منظمة كاملة بتوكن مزوّر.

كيف بتصلّحها؟

حدّث Authlib لـ 1.9.0. ملاحظات الإصدار فيها إصلاح التوقيعات الفاضية بـ JWS JSON، ومعه إصلاحات تانية بالتحقق من الـ JOSE والـ OAuth.

pip install --upgrade "authlib>=1.9.0"
pip show authlib

وإذا ما فيك تحدّث اليوم، ارفض بنفسك أي JWS قائمة توقيعاته فاضية قبل ما توصّله للمكتبة. هاد نفس الإصلاح يلي اقترحه الإرشاد، بس بكودك إنت:

import json

def require_signatures(raw: str) -> str:
    data = json.loads(raw)
    if not data.get("signatures"):
        raise ValueError("JWS without signatures")
    return raw

هاد حل مؤقت. التحديث بيضل هو الإصلاح.

وإذا عم تحدّث Python نفسه كمان، شوف تحديثات Python الأمنية لتشرين الأول.

من وين تبلّش هلق؟

بلّش بنسختك وبالأماكن يلي بتتحقق فيها من توكنات.

  1. شغّل pip show authlib وشوف إذا النسخة 1.8.0 أو أقدم.

  2. دوّر بكودك على deserialize_json وشوف مين بيبعت المدخل.

  3. حدّث لـ 1.9.0، أو حط فحص التوقيعات الفاضية لحد ما تحدّث.

وإذا بدك حدا يجرّب مسار تسجيل الدخول والتوكنات بمنصتك متل ما بيجرّبه مهاجم، هاد شغل مُحَصَّن.

ومقالات أمان التطبيقات كلها بمكان واحد: أمن التطبيقات.

أسئلة شائعة

هل المهاجم بيحتاج المفتاح؟

لأ. حسب الإرشاد، المحتوى بيرجع كأنه موقّع بلا ما ينفحص ولا توقيع، وبلا ما يلزم ولا مفتاح.

كنت فاكر إنو 1.8.0 مش متأثرة، ليش؟

إرشاد Authlib بيقول إنو الثغرة كانت معروفة، والجديد هو مدى النسخ: السجلات المنشورة قبل كانت ما بتعدّ 1.8.0. هلق النسخ المتأثرة لحد 1.8.0، والإصلاح بـ 1.9.0.

إذا ما بستعمل deserialize_json، أنا بأمان؟

الإرشاد بيسمّي deserialize_json وبس. ومع هيك حدّث لـ 1.9.0، لأنو نفس النسخة فيها إصلاحات تانية بالتحقق من الـ JOSE والـ OAuth.

شارك المقال

مقالات أخرى