Race Conditions

Race Conditions Zafiyeti Nedir?

Race condition, bilgisayar programlama ve sistem tasarımında, iki veya daha fazla işlem veya thread'in aynı kaynağa erişim sağlayarak işlemlerini belirli bir sırayla yürütmek zorunda olduğu durumlarda ortaya çıkan bir güvenlik açığıdır. Bu zafiyet, işlemlerin beklenmedik bir sırayla gerçekleştirilmesi durumunda sistemin hatalı davranmasına veya güvenlik açıklarının oluşmasına neden olabilir.

Örnek olarak, iki thread'in aynı dosyaya yazma işlemi yapması durumunda, her iki thread de dosyanın mevcut durumunu kontrol edip ardından yazma işlemini gerçekleştirmek isteyebilir. Eğer bu işlemler arasındaki zamanlama tam olarak kontrol edilmezse, bir thread dosyayı kontrol edip yazmaya başlamadan önce diğer thread'in dosyayı değiştirmiş olabileceği bir durum oluşabilir. Bu, dosyanın beklenmedik şekilde bozulmasına veya hassas verilerin yanlış kişiler tarafından erişilmesine yol açabilir.

Yöntemler

Race Condition ile Limit Aşma

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.

Race Condition ile Rate Limit Bypass

Login istekleri gibi rate limit olması gereken işlemlerde çok hızlı istek gönderdiğimizde hemen bloklanmıyor olabilir.

def queueRequests(target, wordlists):
    engine = RequestEngine(endpoint=target.endpoint,
                           concurrentConnections=1,
                           engine=Engine.BURP2
                           )
                           
    passwords = wordlists.clipboard
    
    for password in passwords:
        engine.queue(target.req, password, gate='1')
 
    engine.openGate('1')

def handleResponse(req, interesting):
    table.add(req)

Farklı Endpointler ile Race Condition

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.

Tek Endpoint ile Race Condition

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.

Zamana Bağlı Tokenler ile Race Condition

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.

Veritabanı Kaynaklı Race Condition

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.

Kaynaklar

Portswigger Academy: https://portswigger.net/web-security/race-conditions

Last updated