CVE-2021-41117
Açıklama
keypair, javascript ile yazılmış bir RSA PEM anahtar oluşturucudur. keypair, node-forge dahil olmak üzere mümkün olan yerlerde diğer kütüphanelerden ödünç alarak veya kendi başına birçok kriptografik primitifi uygular. Bu kütüphanenin SSH'ta kullanılan özdeş RSA anahtarları oluşturduğu tespit edilmiştir. Bu durum, kütüphanenin özdeş P, Q (ve dolayısıyla N) değerleri ürettiği anlamına gelir ki bu, pratik açıdan RSA-2048 anahtarları için imkansızdır. Tekrar eden şekilde özdeş değerler üretilmesi genellikle zayıf rastgele sayı üretimiyle veya CSPRNG çıktısının hatalı yönetimiyle ilgili bir soruna işaret eder. Sorun 1: Zayıf rastgele sayı üretimi (`GHSL-2021-1012`). Kütüphane tamamen platform tarafından sağlanan bir CSPRNG'ye güvenmek yerine, kendi sayaç tabanlı CMAC yaklaşımını kullanır. Hata, `defaultSeedFile` fonksiyonunda CMAC uygulamasının "gerçek" rastgele verilerle tohumlanmasında meydana gelmektedir. AES-CMAC oluşturucusunu tohumlamak için kütüphane, JavaScript yürütme ortamına bağlı olarak iki farklı yaklaşım benimser. Bir tarayıcıda kütüphane, [`window.crypto.getRandomValues()`](https://github.com/juliangruber/keypair/blob/87c62f255baa12c1ec4f98a91600f82af80be6db/index.js#L971) kullanır. Ancak, bir nodeJS yürütme ortamında `window` nesnesi tanımlı değildir; bu nedenle kütüphane, içinde hata da barındıran çok daha az güvenli bir çözüme yönelir. Kütüphanenin mümkün olduğunda node'un CSPRNG'sini kullanmaya çalıştığı görülse de maalesef aynı isimle bir değişken tanımlanıp `null` olarak ayarlandığı için `crypto` nesnesi null görünmektedir. Dolayısıyla node CSPRNG yolu hiçbir zaman izlenmez. Bununla birlikte, `window.crypto.getRandomValues()` mevcut olmadığında, CMAC sayacını tohumlamak için bir Lehmer LCG rastgele sayı oluşturucu kullanılır ve LCG, `Math.random` ile tohumlanır. Bu durum yetersizdir ve tek başına bir güvenlik açığı sayılabilir ancak yinelenen anahtarların ortaya çıkma sıklığını açıklamaz. Temel kusur: Lehmer LCG'den gelen çıktı yanlış kodlanmıştır. Kusurlu olan spesifik [satır][https://github.com/juliangruber/keypair/blob/87c62f255baa12c1ec4f98a91600f82af80be6db/index.js#L1008] şöyledir: `b.putByte(String.fromCharCode(next & 0xFF))`. `putByte` [tanımı](https://github.com/juliangruber/keypair/blob/87c62f255baa12c1ec4f98a91600f82af80be6db/index.js#L350-L352) ise şu şekildedir: `util.ByteBuffer.prototype.putByte = function(b) {this.data += String.fromCharCode(b);};`. Basitleştirilmiş haliyle bu işlem `String.fromCharCode(String.fromCharCode(next & 0xFF))` şeklindedir. Çift `String.fromCharCode` kullanımı neredeyse kesinlikle kasıtlı değildir ve zayıf tohumlamanın kaynağıdır. Maalesef bu durum bir hataya yol açmaz; bunun yerine tampon belleğin çoğunun sıfırlardan oluşmasına neden olur. 0xFF ile maskeleme yapıldığı için, LCG'den gelen çıktıların %97'sinin sıfıra dönüştürüldüğü belirlenebilir. Anlamlı değerlerle sonuçlanan tek çıktılar 48 ile 57 arasındakilerdir. Bunun etkisi, hatalı dönüşüm nedeniyle RNG tohumundaki her baytın %97 olasılıkla 0 olmasıdır. Sıfır olmadığı durumlarda ise baytlar 0 ile 9 arasındadır. Özetle, üç acil sorun bulunmaktadır: 1. Kütüphanenin güvensiz bir rastgele sayı yedekleme yolu vardır. İdeal olarak kütüphane, bir LCG ve `Math.random` kullanmaya çalışmak yerine güçlü bir CSPRNG gerektirmelidir. 2. Güçlü bir CSPRNG mevcut olmasına rağmen, kütüphane NodeJS üzerinde çalıştırıldığında güçlü bir rastgele sayı oluşturucuyu doğru şekilde kullanmamaktadır. 3. Yedekleme yolunun uygulamasında, tohum verilerinin çoğunluğunun etkili olarak sıfır olacağı bir sorun vardır. Zayıf rastgele sayı üretimi nedeniyle keypair, tahmin edilmesi nispeten kolay RSA anahtarları oluşturur. Bu durum, bir saldırganın gizli mesajları çözmesini veya mağdura ait bir hesaba yetkisiz erişim sağlamasını mümkün kılabilir.
Nasıl düzeltilir
- keypair_project keypair1.0.4 ya da sonraki bir sürüm
- keypair1.0.4 ya da sonraki bir sürüm
Etkilenen ürünler
| Ürün | Etkilenen sürümler | Düzeltildiği sürüm |
|---|---|---|
| keypair_project keypair | v < 1.0.4 | 1.0.4 |
| keypairnpm | v < 1.0.4 | 1.0.4 |
Sürümünüzü kontrol edin
Ürünü seçin ve kullandığınız sürümü yazın; sürümün etkilenen aralıkta olup olmadığını görün.
Attack Surface Management
Alan adlarınıza bağlı varlıkları, bu varlıklarda çalışan teknolojileri ve bilinen zafiyetleri tek listede görün.