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
- Güvenlikle ilgili sonuçlar söz konusu olduğunda
java.security.SecureRandom
'ı kullanın - Diğer tüm durumlarda
java.util.Random
kullanın. Math.random
hiçbir zaman kullanılmamalıdır.
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
- java.security.SecureRandom
- Java.util.Rastgele
- Math.random
- Öngörülen Tohum CWE
- Kriptografik Olarak Zayıf PRNG CWE
- Java Secure Rastgele
- Java Rastgele ve SecureRastgele Karşılaştırma
- SecureRandom nasıl kullanılır?
- Python PRNG güvenlik kılavuzu
- OWASP Kriptografik Depolama Alanı Hakkında Yardımcı Kısa Bilgiler
- CVE-2013-6386: Drupal'da zayıf PRNG güvenlik açığı
- CVE-2006-3419: Tor'da zayıf PRNG güvenlik açığı
- CVE-2008-4102: Joomla'da Tahmin Edilebilir Tohum
- Linux çekirdeği rastgele yaması