Skip to content
KitploitKITPLOIT
أدواتالمدونة
إرسال
أدواتالمدونة
إرسال

أدوات الاختراق واختبار الاختراق والأمن السيبراني لترسانتك الأمنية!

Kitploit هو دليل لأدوات الاختراق والأمن السيبراني واختبار الاختراق. اكتشف آخر تحديثات المشاريع للعثور على الثغرات وتحليل الأنظمة وأتمتة الاختبارات وتعزيز أمنك.

··الخلاصات·اتصال·الخصوصية·© 2026 Kitploit

دليل الأدوات

الفئات

عرض جميع الفئات
Loading categories
CVE-2026-33936 — ثغرة حجب الخدمة في ecdsa (PyPI) | Kitploit
أدوات/GitHubGitHub/0xmrma/cve-2026-33936
تحليل الثغرات الأمنيةتحليل الكودالتشفيرالأوراق والأبحاثالتعلم والتعليم
GitHub0xmrma/cve-2026-33936

CVE-2026-33936

ثغرة حجب الخدمة في ecdsa (PyPI)

عرض المستودع
1منذ 4 أشهرلم تتم المراجعة بعد

الأكثر شعبية

عرض الكل →

اكتشف الأدوات الأكثر استخدامًا من قبل مجتمعنا.

استكشف جميع الأدوات

تصفح مجموعتنا من الأدوات

عرض جميع الأدوات →
مشاركة

CVE-2026-33936

ثغرة رفض الخدمة في ecdsa (PyPI)

مقدمة

حددتُ وكشفتُ بشكل مسؤول عن ثغرة بمستوى متوسط الخطورة في python-ecdsa، وهي مكتبة تشفير Python تُستخدم على نطاق واسع، وقد حققت 47.8 مليون عملية تنزيل في الشهر الماضي.

وجدت هذه المشكلة أثناء مراجعة python-ecdsa ومعي سؤال محدد جدًا في ذهني:

ماذا يحدث إذا ادّعى ترميز DER تالف كذبًا بشأن طوله ووثق به المحلل أكثر مما ينبغي؟

في هذه الحالة، قادني هذا السؤال إلى خلل حقيقي.

قبلت أدوات تحليل DER المساعدة في ecdsa.der بيانات مبتورة في الحالات التي ادّعى فيها الطول المشفّر وجود بايتات أكثر مما هو موجود فعلًا. كان يجب رفض هذا الإدخال التالف فورًا. وبدلًا من ذلك، كان بإمكانه التسلل أعمق إلى منطق التحليل وإطلاق IndexError داخلي في النهاية أثناء تحليل المفاتيح.

أصبحت هذه المشكلة CVE-2026-33936.

المشروع: python-ecdsa على GitHub
الحزمة: ecdsa (pip)
CVE: CVE-2026-33936

photo0

سلسلة الهجوم

attacker-controlled malformed DER → truncated length accepted as valid → parser continues past trust boundary → SigningKey.from_der() reaches internal exception path → unexpected IndexError / application-level DoS risk


ماذا يفعل python-ecdsa

python-ecdsa هي مكتبة Python تُستخدم على نطاق واسع للتشفير بالمنحنيات الإهليلجية.

من بين أمور أخرى، تعالج:

  • تحليل المفاتيح
  • تسلسل المفاتيح
  • فك ترميز DER/ASN.1
  • سير عمل التوقيع والتحقق

وهذا يعني أن كود التحليل لديها يقع مباشرة على حدود أمنية.

كلما قبِلت مكتبة ما مواد مفاتيح مقدمة من الخارج أو مدخلات ثنائية منظمة، فإن الصحة ليست مجرد مسألة جودة. إنها خاصية أمنية.

إذا قُبل إدخال تالف بينما كان يجب رفضه، يبدأ الكود اللاحق في بناء افتراضات فوق حالة غير صالحة.

هنا تتوقف الأخطاء عن كونها «مجرد أخطاء تحليل» وتبدأ في التحول إلى ثغرات.


لماذا كان هذا السطح جديرًا بالفحص

تحليل DER هو أحد تلك المجالات التي يمكن أن يكون لأخطاء التحقق الصغيرة فيها تأثيرات غير متناسبة.

فئة هذا الخلل واضحة ومباشرة:

  • حقل الطول يقول شيئًا
  • المخزن الفعلي يحتوي شيئًا أقصر
  • المحلل يثق بالادعاء أكثر مما ينبغي
  • الكود اللاحق يعمل على حالة كان يفترض ألا توجد أصلًا

هذا بالضبط نوع فشل الحدود الذي يستحق الفحص في المراجعة الأمنية.

لم أكن أبحث عن سلوك تشفيري غريب هنا. كنت أبحث عن إخفاقات الثقة في معالجة المدخلات المنظمة.

وكان ذلك هو المكان الصحيح للبحث.


السبب الجذري

كانت المشكلة الجذرية هي التحقق غير السليم من حقول طول DER عند تحليل إدخال تالف أو مبتور.

تحديدًا، قبِلت ecdsa.der.remove_octet_string() إدخالًا تجاوز فيه طول DER المُعلَن عدد البايتات المتاحة فعلًا في المخزن.

لذا بدلًا من رفض DER التالف مثل هذا:

  • الطول المُعلَن: 4096
  • البايتات المتبقية الفعلية: 3

قبِلت الأداة المساعدة ذلك وأعادت المحتوى المبتور كما لو كان صالحًا.

هذا بالفعل خلل.

لكن التأثير الأقوى ظهر في المراحل اللاحقة.

ولأن الإدخال التالف قُبل بدلًا من رفضه عند الحدود، فقد يصل SigningKey.from_der() لاحقًا إلى مسار استثناء داخلي ويُطلق:

root@kitploit:~
IndexError: index out of bounds on dimension 1

هذا مهم لأن هذا ليس نوع الفشل الذي يتوقعه المستدعي من إدخال تالف. السلوك الصحيح هو رفض تحليل نظيف مثل UnexpectedDER أو ValueError.

إذن لم تكن الثغرة هي «وجود IndexError» بمعزل عن غيره.

كانت الثغرة الحقيقية هي:

  • حقول طول DER التالفة لم يُتحقق منها بشكل صحيح
  • الإدخال المبتور عبر حدود التحليل
  • اصطدم الكود اللاحق بمسار استثناء داخلي كنتيجة لذلك

هذه سلسلة خلل واحدة، وليست مشكلتين مستقلتين.


لماذا هذه مشكلة أمنية، وليست مجرد سوء ممارسة في التحليل

رفض المحلل لإدخال تالف ليس تحسينًا تجميليًا. إنه جزء من النموذج الأمني.

التمييز المهم هنا ليس ما إذا كان الإدخال غير صالح. بالطبع كان غير صالح.

التمييز المهم هو كيف تصرفت المكتبة في مواجهة الإدخال غير الصالح.

هناك فرق حقيقي بين:

  • رفض DER التالف بنظافة عند الحدود، و
  • قبول DER التالف، والاستمرار أعمق، والانهيار باستثناء داخلي

الأول سلوك متين.

الثاني يُنشئ خطرًا على مستوى التطبيق إذا كان البرنامج يحلل DER غير موثوق ويفترض أن إخفاقات المكتبة تبقى ضمن أنواع الاستثناءات المتوقعة.

لهذا صُنّفت هذه بشكل صحيح كثغرة وليست مجرد خلل في جودة المحلل.


إثبات المفهوم

استخدمت إثباتَي مفهوم (PoC) لأنهما أظهرا جزأين مختلفين من سلسلة الخلل نفسها.

PoC 1: قبول DER المبتور

أظهر إثبات المفهوم الأول أن remove_octet_string() قبِلت DER مبتورًا يتجاوز طوله المُعلَن المخزن المتاح.

وهذا أثبت فشل التحقق الأساسي:

  • كان المخزن أقصر من الطول المشفّر
  • كان على الأداة المساعدة رفضه
  • لكنها لم تفعل

PoC 2: مسار استثناء داخلي حتمي

أظهر إثبات المفهوم الثاني التأثير اللاحق الأكثر أهمية: DER التالف المُمرَّر إلى SigningKey.from_der() كان يُطلق بشكل حتمي IndexError داخليًا قبل الإصلاح.

وهذا أثبت التأثير المرتبط بالأمن:

  • الإدخال التالف عبر الحدود
  • استمر التحليل أبعد مما ينبغي
  • أطلق كود المكتبة استثناءً داخليًا بدلًا من خطأ تحليل نظيف

هذه نتيجة أقوى بكثير من «المحلل قبِل بايتات غريبة».

إنها تُظهر فشل الحدود بالإضافة إلى عواقب تشغيلية حقيقية.


لماذا اختيرت إثباتات المفهوم بهذه الطريقة

يُثبت إثبات المفهوم الأول السبب الجذري.

ويُثبت إثبات المفهوم الثاني التأثير.

هذا التقسيم مهم.

كثير من التقارير تتوقف عند:

«هذا المحلل يقبل بيانات تالفة».

هذا مفيد، لكنه ليس دائمًا كافيًا لإظهار سبب أهمية الخلل.

في هذه الحالة، كان التقرير الأقوى هو:

  • DER التالف يُقبل بشكل خاطئ
  • وهذا القبول ليس مكتفيًا بذاته
  • ويمكن أن ينتشر إلى مسار استثناء داخلي مُنهار في تحليل المفاتيح

وهذا يجعل القصة الأمنية أوضح بكثير.


تحليل الإصلاح

كان الإصلاح بسيطًا وصحيحًا.

أضاف التصحيح قاعدة الأمان المفقودة نفسها المستخدمة بالفعل في remove_sequence():

يجب أن يتسع الطول المُعلَن ضمن المخزن المتاح

طُبّق هذا الفحص على:

  • remove_constructed()
  • remove_implicit()
  • remove_octet_string()

وبمجرد إضافة فحوصات الحدود هذه، أصبح DER التالف/المبتور يُرفض فورًا بـ:

root@kitploit:~
UnexpectedDER: Length longer than the provided buffer

ولم يعد إثبات المفهوم الذي كان يُطلق IndexError سابقًا يصل إلى مسار الاستثناء الداخلي. لقد فشل بنظافة أثناء التحليل، وهو بالضبط ما كان يجب أن يحدث منذ البداية.

هذا هو نوع الإصلاح الذي تريد رؤيته في ثغرة محلل:

  • ضيّق النطاق
  • صريح
  • مرتبط مباشرة بحدود الثقة
  • سهل الاستدلال عليه
  • معزّز بتغطية اختبارات الانحدار

لا إعادة تصميم. لا غموض. فقط تحقق صحيح حيث كان مفقودًا.


اختبارات الانحدار

أضفتُ أيضًا اختبارات انحدار مركّزة للتأكد من بقاء هذه الفئة بالضبط من DER التالف مرفوضة.

تغطي الاختبارات الجديدة رفض الطول المبتور لكل من:

  • remove_octet_string
  • remove_constructed
  • remove_implicit

كان ذلك مهمًا لأن الخلل لم يكن يتعلق بمسار تشغيل غريب واحد. بل كان يتعلق بقاعدة تحقق كان يجب أن تصمد باستمرار عبر أدوات DER المساعدة المرتبطة.

بعد إضافة الإصلاح والاختبارات، اجتازت المجموعة الكاملة الاختبارات محليًا:

root@kitploit:~
python -m pytest -q
# 2018 passed, 5 skipped

هذا مهم في أعمال الإفصاح الحقيقية.

يكون الإصلاح أقوى بكثير عندما يأتي مع اختبارات تُحكم قبضتها على الحدود.


الخطورة والتصنيف

صُنّفت هذه المشكلة بشكل معقول على أنها متوسطة.

التأثير الرئيسي هنا هو التوافر/المتانة، وليس السرية أو السلامة.

كان تصنيف النشرة الأمنية:

  • CWE-20: Improper Input Validation
  • CVSS: CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:L

هذا منطقي.

الادعاء ليس أن DER التالف يسمح للمهاجم بتنفيذ كود. الادعاء هو أن DER التالف قد يُطلق استثناءات داخلية غير متوقعة في البرمجيات التي تحلل مواد DER غير موثوقة باستخدام هذه المكتبة.

هذا خلل تحليل حقيقي وقابل للدفاع عنه بأسلوب رفض الخدمة (DoS).


الإفصاح

أُبلغ عن هذه المشكلة بشكل خاص عبر GitHub Security Advisories.

تضمن التقرير:

  • خلل التحقق
  • مُعيد إنتاج حتمي لـ IndexError في المراحل اللاحقة
  • تصحيح بسيط
  • اختبارات انحدار
  • نتائج تحقق محلية

تحقق المُطوِّر الرئيسي من المشكلة، وطلب أن يُدمج الإصلاح مع اختبارات وحدة، وتقدّم الإصلاح المنسّق عبر سير عمل الفرع الخاص المؤقت في GHSA.

أثناء معالجة CVE، رفض GitHub في البداية تعيين المعرف لأن نص النشرة بدا وكأنه قد يصف أكثر من ثغرة واحدة.

كان التوضيح بسيطًا:

هذه كانت ثغرة واحدة ذات سبب جذري واحد — تحقق غير سليم من طول DER — وكانت IndexError الناتجة عن SigningKey.from_der() نتيجة لاحقة لنفس قبول الإدخال التالف، وليست مشكلة منفصلة قابلة للإصلاح بشكل مستقل.

كان هذا التوضيح كافيًا، وعُيّن للمشكلة المعرف:

CVE-2026-33936


ما الذي يعلّمه هذا الخلل فعلًا

الدرس هنا ليس «DER معقّد».

الجميع يعرف مسبقًا أن DER معقّد.

الدرس الحقيقي هو:

يجب رفض الإدخال المنظم التالف في النقطة الدقيقة التي يعلم فيها المحلل أنه غير صالح.

إذا فاتتك تلك الحدود، ينتهي الأمر بالكود اللاحق ليعمل على افتراضات لم تعد جديرة بالثقة.

هكذا تتحول أخطاء التحليل منخفضة المستوى إلى مشكلات أمنية.

يعزز هذا الخلل أيضًا شيئًا مهمًا حول الكتابات الفنية (writeups) والفرز (triage):

  • السبب الجذري مهم
  • مسار التأثير مهم
  • وربط الاثنين بنظافة أكثر أهمية

كان «قبول إدخال تالف» بداية القصة.

كان «قبول إدخال تالف، ثم انتشاره إلى مسار استثناء داخلي أثناء تحليل المفاتيح» هو القصة الكاملة.

ساعد هذا التمييز في تقديم الحجة بوضوح وبشكل صحيح.


النقاط الرئيسية

  • محللات DER هي حدود أمنية
  • يجب التحقق من حقول الطول التالفة مقابل المخزن الفعلي
  • قبول الإدخال المنظم المبتور هو خلل بحد ذاته
  • وتتحول إلى ثغرة أقوى عندما يصل التحليل اللاحق إلى مسارات استثناء داخلي
  • رفض التحليل النظيف جزء من السلوك الآمن
  • إصلاحات التحقق البسيطة بالإضافة إلى اختبارات الانحدار هي بالضبط ما تحتاجه في معالجة أخطاء المحللات

كلمات أخيرة

لم تكن هذه الثغرة حول تشفير غريب.

بل كانت حول محلل وثق بإدخال تالف لفترة أطول مما كان ينبغي.

عبر حقل طول DER مبتور الحدود، ونجا من التحقق بينما كان يجب رفضه، وتسبب في النهاية في سلوك انهياري في تحليل المفاتيح.

لهذا أصبحت هذه CVE-2026-33936.

عولجت بفرض فحوصات مناسبة لحدود طول DER في أدوات التحليل المساعدة المتأثرة.

photo0
تنزيل الأداة