Race Conditions
Last updated
Was this helpful?
Last updated
Was this helpful?
Race condition, iş mantığı kusurlarıyla yakından ilişkili yaygın bir güvenlik açığı türüdür. Web siteleri istekleri yeterli güvenlik önlemleri olmadan eş zamanlı olarak işlediğinde ortaya çıkarlar.
Bu durum, birden fazla farklı iş parçacığının aynı anda aynı verilerle etkileşime girmesine yol açarak uygulamada istenmeyen davranışlara neden olan bir “çarpışma” ile sonuçlanabilir. Bir yarış koşulu saldırısı, kasıtlı çarpışmalara neden olmak ve bu istenmeyen davranışı kötü niyetli amaçlarla kullanmak için dikkatlice zamanlanmış istekleri kullanır.
Bir çarpışmanın mümkün olduğu süre “race window” olarak bilinir. Bu, örneğin veritabanı ile iki etkileşim arasındaki saniyenin bir kısmı olabilir.
Sadece bir kere kullanılabilen bir fonksiyonun isteklerini paralel olarak gönderirsek birden fazla kez kabul edilebilir.
Örneğin kupon istekleri aynı anda gönderildiğinde aynı kupon birden fazla kez kullanılabilir.
Login istekleri gibi rate limit olması gereken işlemlerde çok hızlı istek gönderdiğimizde hemen bloklanmıyor olabilir.
Sırayla gönderilmesi gereken istekler aynı anda gönderildiğinde hatalı çalışabilir.
Örneğin sepete ürün ekleme ve satın alma istekleri aynı anda gönderildiğinde bedavaya ürün alınabilir.
Farklı verilere sahip istekler aynı anda gönderildiğinde hatalı durumlar oluşabilir.
Örneğin eposta değiştirme fonksiyonunda farklı epostalar ile aynı anda istekler gönderiyoruz. Bu şekilde gelen onaylama mailine tıkladığımızda bize ait olmayan bir postayı onaylayabiliriz.
Eğer kullanıcıya özel olarak oluşturulan tokenler sadece zamana bağlı olarak oluşturuluyorsa aynı anda istekler göndererek başkasının tokenini ele geçirebiliriz.
Örneğin parola sıfırlama bağlantısındaki token zamana göre üretiliyor. Aynı anda hem kendimize hem hedefe parola sıfırlama bağlantısı gönderirsek bizim tokenimiz ile hedefin tokeni aynı olacaktır.
Bir istekte kullanılan bir veri kısa süreliğine null gibi bir değerde kalıyor ise bu durum zafiyet oluşturabilir.
Örneğin hesap oluşturma ve hesap onaylama için istekler gönderiliyor. Hesap oluşturma sırasında bir token oluşturuluyor ve veritabanına kaydediliyor ve onaylama isteğinde bu token kullanılıyor. Eğer veritabanında bu değer çok kısa süreliğine null gibi bir değerde kalıyor ise boş bir token ile onaylama kısmını bypass edebiliriz. Bunun için kayıt ve boş token içeren onaylama isteği paralel yollarız.
Farklı depolama yerlerinden gelen verileri karıştırmaktan kaçının.
Veri deposunun eşzamanlılık özelliklerini kullanarak hassas uç noktaların durum değişikliklerini atomik hale getirmesini sağlayın. Örneğin, ödemenin sepet değeriyle eşleştiğini kontrol etmek ve siparişi onaylamak için tek bir veritabanı işlemi kullanın.
Derinlemesine bir savunma önlemi olarak, sütun benzersizliği kısıtlamaları gibi veri deposu bütünlüğü ve tutarlılık özelliklerinden yararlanın.
Bir veri depolama katmanını diğerinin güvenliğini sağlamak için kullanmaya çalışmayın. Örneğin, oturumlar veritabanlarında limit aşımı saldırılarını önlemek için uygun değildir.
Oturum işleme çerçevenizin oturumları dahili olarak tutarlı tuttuğundan emin olun. Oturum değişkenlerini toplu iş yerine tek tek güncellemek cazip bir optimizasyon olabilir, ancak son derece tehlikelidir. Bu ORM'ler için de geçerlidir; işlemler gibi kavramları gizleyerek, bunların tüm sorumluluğunu üstlenirler.
Bazı mimarilerde, sunucu tarafı durumundan tamamen kaçınmak uygun olabilir. Bunun yerine, örneğin JWT'leri kullanarak durumu istemci tarafına iletmek için şifreleme kullanabilirsiniz.
Portswigger Academy: