CVE-2021-41117
Təsvir
keypair, javascript dilində yazılmış bir RSA PEM açar generatorudur. keypair çox sayda kriptoqrafik primitivləri özü tətbiq edir və ya mümkün olduqda, o cümlədən node-forge kitabxanasından istifadə edərək digər kitabxanalardan borclar alır. Bu kitabxananın SSH-də istifadə olunan eyni RSA açarlarını yaratdığı aşkar edilmişdir. Bu o deməkdir ki, kitabxana eyni P, Q (və buna görə də N) dəyərləri yaradır ki, bu da praktiki baxımdan RSA-2048 açarları üçün qeyri-mümkündür. Eyni dəyərlərin təkrarlanaraq yaradılması adətən zəif təsadüfi ədəd generasiyasına və ya CSPRNG çıxışının yanlış idarə edilməsinə işarə edir. Problem 1: Zəif təsadüfi ədəd generasiyası (`GHSL-2021-1012`). Kitabxana tamamilə platforma tərəfindən təmin edilən CSPRNG-dən asılı olmayaraq, öz sayğac əsaslı CMAC yanaşmasından istifadə edir. Səhv, `defaultSeedFile` funksiyasında CMAC implementasiyasının "həqiqi" təsadüfi məlumatlarla doldurulması zamanı baş verir. AES-CMAC generatorunu başlatmaq üçün kitabxana JavaScript icra mühitindən asılı olaraq iki fərqli yanaşma tətbiq edir. Brauzerdə kitabxana [`window.crypto.getRandomValues()`](https://github.com/juliangruber/keypair/blob/87c62f255baa12c1ec4f98a91600f82af80be6db/index.js#L971)-dən istifadə edir. Lakin nodeJS icra mühitində `window` obyekti təyin edilməmişdir, buna görə də o, daha az təhlükəsiz olan və həmçinin xəta ehtiva edən həll yoluna yönəlir. Görünür ki, kitabxana mümkün olduqda node-un CSPRNG-dən istifadə etməyə çalışır, lakin təəssüf ki, eyni adlı bir dəyişən elan edilib `null` təyin edildiyi üçün `crypto` obyekti null olur. Beləliklə, node CSPRNG yolu heç vaxt seçilmir. Bununla belə, `window.crypto.getRandomValues()` mövcud olmadıqda, CMAC sayğacını başlatmaq üçün Lehmer LCG təsadüfi ədəd generatorundan istifadə olunur və LCG `Math.random` ilə başladılır. Bu zəif bir yanaşmadır və özlüyündə təhlükəsizlik xətası sayıla bilər, lakin dublikat açarların yaranma tezliyini izah etmir. Əsas qüsur: Lehmer LCG-nin çıxışı yanlış şəkildə kodlaşdırılır. Xətanın olduğu konkret [sətir][https://github.com/juliangruber/keypair/blob/87c62f255baa12c1ec4f98a91600f82af80be6db/index.js#L1008] belədir: `b.putByte(String.fromCharCode(next & 0xFF))`. `putByte`-ın [tərifidir](https://github.com/juliangruber/keypair/blob/87c62f255baa12c1ec4f98a91600f82af80be6db/index.js#L350-L352): `util.ByteBuffer.prototype.putByte = function(b) {this.data += String.fromCharCode(b);};`. Sadələşdirsək, bu `String.fromCharCode(String.fromCharCode(next & 0xFF))` şəklindədir. İkiqat `String.fromCharCode` istifadəsi böyük ehtimalla qeyri-ixtiyari olub və zəif başlatmanın mənbəyidir. Təəssüf ki, bu, xəta ilə nəticələnmir. Əksinə, bu, buferin böyük hissəsinin sıfırlardan ibarət olmasına səbəb olur. 0xFF ilə maskalama apardığımız üçün müəyyən edə bilərik ki, LCG-dən gələn çıxışların 97%-i sıfırlara çevrilir. Yalnız 48-dən 57-yə qədər (daxil olmaqla) olan çıxışlar mənalı dəyərlər verir. Bunun təsiri odur ki, yanlış konvertasiya səbəbindən RNG seed-indəki hər bir baytın 0 olma ehtimalı 97%-dir. Sıfır olmadığı halda isə baytlar 0-dan 9-a qədər olur. Xülasə, üç dərhal narahatlıq mövcuddur: 1. Kitabxananın təhlükəsiz olmayan təsadüfi ədəd ehtiyat yolu var. Ideal halda kitabxana LCG və `Math.random` istifadə etməyə çalışmaq əvəzinə güclü CSPRNG tələb etməli idi. 2. Güclü CSPRNG mövcud olsa belə, kitabxana NodeJS-də işlədikdə güclü təsadüfi ədəd generatorundan düzgün istifadə etmir. 3. Ehtiyat yolunun implementasiyasında problem var və seed məlumatlarının əksəriyyəti effektiv olaraq sıfır olur. Zəif təsadüfi ədəd generasiyası səbəbindən keypair təxmin edilməsi nisbətən asan olan RSA açarları yaradır. Bu, hücumçuya məxfi mesajları dekripsiya etməyə və ya qurbanın hesabına icazəli giriş əldə etməyə imkan verə bilər.
Necə düzəltmək olar
- keypair_project keypair1.0.4 və ya daha yeni versiya
- keypair1.0.4 və ya daha yeni versiya
Təsirlənən məhsullar
| Məhsul | Təsirlənən versiyalar | Düzəldildiyi versiya |
|---|---|---|
| keypair_project keypair | v < 1.0.4 | 1.0.4 |
| keypairnpm | v < 1.0.4 | 1.0.4 |
Versiyanızı yoxlayın
Məhsulu seçin və istifadə etdiyiniz versiyanı yazın; versiyanın təsirlənən aralıqda olub-olmadığını görün.
Attack Surface Management
Domenlərinizə bağlı aktivləri, onlarda işləyən texnologiyaları və məlum zəiflikləri bir siyahıda görün.