Zayıf PRNG

OWASP kategorisi: MASVS-CRYPTO: Kriptografi

Genel Bakış

Sözde rastgele sayı oluşturucu (PRNG), rastgele sayı oluşturma aracından (PRNG) çekirdek adı verilen başlangıç değerine dayalı, tahmin edilebilir sayı dizileridir. CEVAP PRNG tarafından oluşturulan sayı dizisi ile yaklaşık aynı özelliklere sahiptir: gerçekten rastgele sayı dizisidir, ancak daha hızlıdır ve işlem açısından daha az pahalıdır oluşturuyoruz.

Diğer bir deyişle, PRNG'ler, gerçek rastgele sayı dizilerini taklit eden entropi dağılımının eşitliği açısından zayıf RNG'lere (ör. java.math.Random) kıyasla daha yüksek güvence sunar. Gerçekten rastgele sayı oluşturmak için ve genellikle normal geliştirmenin dışındadır. Bu belge tamamen rastgele sayı oluşturmayı kapsamaz ve yalnızca PRNG'ler (ör. PRNG'ler), kullanımdaki standart metodolojiler.

Zayıf PRNG güvenlik açıkları geliştiriciler için normal bir PRNG kullandığında ortaya çıkar kriptografik olarak güvenli bir PRNG (CSPRNG) yerine kriptografik kullanıma yöneliktir. CSPRNG'lerin daha katı koşulları vardır ve tohum bilinmediğinde, saldırgana bir çıkış dizisini gerçek bir rastgele diziden ayırt etme konusunda yalnızca önemsiz bir avantaj sağlamalıdır.

Saldırganlar, bir PRNG veya CSPRNG'yi başlatmak için tahmin edilebilir tohumlar (geliştirici tarafından sabit kodlananlar gibi) kullanıldığında oluşturulan sayı dizisini de tahmin edebilir. Saldırgan, tohumu tahmin edip PRNG tarafından oluşturulan çıktıyı tahmin edebilir.

Etki

Kimlik doğrulama gibi bir güvenlik bağlamında kriptografik olarak güvenli olmayan bir PRNG kullanılırsa saldırgan, rastgele oluşturulan sayıları tahmin edip ayrıcalıklı verilere veya özelliklere erişebilir.

Çözümler

Genel

java.security.SecureRandom

Güvenlikle ilgili kullanımlar için önerilir. Linux çekirdek sürümü 5.17 veya üzeri bir sürümse veya iş parçacığının engellenmesi kabul edilebilir bir durumdur. Öyleyse, önce siz rastgele sayılar oluşturursunuz (ör. /dev/random kullanın). Bunun için şu numarayı arayın: getInstanceStrong():

Kotlin

val rand = SecureRandom.getInstanceStrong()

Java

SecureRandom rand = SecureRandom.getInstanceStrong();

Aksi takdirde, iş parçacığının engellenmesi, 5.17'den önceki Linux çekirdek sürümlerinde rastgele sayılar oluşturulurken kabul edilemez, ardından SecureRandom oluşturucusu doğrudan çağrılmalıdır:

Kotlin

import java.security.SecureRandom

object generateRandom {
    @JvmStatic
    fun main(args: Array<String>) {
        // Create instance of SecureRandom class
        val rand = SecureRandom()

        // Generate random integers in range 0 to 999
        val rand_int = rand.nextInt(1000)

        // Use rand_int for security & authentication
    }
}

Java

import java.security.SecureRandom;

public class generateRandom {

    public static void main(String args[])
    {
        // Create instance of SecureRandom class
        SecureRandom rand = new SecureRandom();

        // Generate random integers in range 0 to 999
        int rand_int = rand.nextInt(1000);

        // Use rand_int for security & authentication
    }
}

SecureRandom, /dev/urandom kaynağından varsayılan başlangıç numarasını alır ve otomatik olarak bu işlemden geçer nesne oluşturulduğunda veya elde edildiğinde kullanılır, dolayısıyla oluşturacaktır. Genel olarak, SecureRandom değerinin herhangi bir şekilde belirlenmiş şekilde kullanılması önerilmez (özellikle de bu, uygulamayı derlemeyi bozan herkesin görebileceği bir başlangıç değeri kodlamasına yol açıyorsa). Tekrarlanabilir sözde rastgele çıkış oluşturmak isteyen geliştiriciler HMAC, HKDF ve SHAKE gibi daha uygun primitifler kullanmalıdır.

java.util.Random

Güvenlik/kimlik doğrulama amacıyla kullanmaktan kaçının. Diğer her şey için kullanılabilir.

Kotlin

import java.util.Random

object generateRandom {
    @JvmStatic
    fun main(args: Array<String>) {
        // Create instance of SecureRandom class
        val rand = Random()

        // Generate random integers in range 0 to 999
        val rand_int = rand.nextInt(1000)
    }
}

Java

import java.util.Random;

public class generateRandom {

    public static void main(String args[])
    {
        // Create instance of Random class
        Random rand = new Random();

        // Generate random integers in range 0 to 999
        int rand_int = rand.nextInt(1000);
    }
}

Kaynaklar