Yarış durumu nedir?
Yarış durumu (race condition), bir işlemin sonucunun birden fazla işlemin ya da isteğin çalışma sırasına ve zamanlamasına bağlı olduğu durumdur. Güvenlik açısından saldırgan bu zamanlamayı kullanarak denetimleri atlatabilir, bir işlemi birden fazla kez yaptırabilir veya yetkisiz erişim kazanabilir.
Sorun, bir kontrolün yapılması ile sonucun kullanılması arasında kısa bir aralık kalmasından doğar. Bu aralıkta durum değişirse kontrol geçersiz hâle gelir. Buna “kontrol anı – kullanım anı” (TOCTOU) sorunu da denir.
Nasıl çalışır?
Bir web uygulamasında kupon kodunu yalnızca bir kez kullanmaya izin veren kontrol, bakiyeyi düşüren işlem tamamlanmadan ikinci bir istek geldiğinde atlatılabilir. Saldırgan aynı isteği çok kısa sürede paralel olarak gönderir; sistem hepsini “henüz kullanılmamış” görür ve hepsini kabul eder.
Dosya sistemlerinde de benzer durum olur: bir dosyanın izinleri kontrol edildikten sonra, kullanılmadan hemen önce bir sembolik bağ ile değiştirilirse program beklenmeyen bir dosyaya erişebilir.
Sunucu ve hosting ortamında
Çok kullanıcılı Linux sunucularda geçici dosyalar için /tmp kullanan betikler, tahmin edilebilir dosya adları yüzünden yarış durumlarına açık olabilir. Web tarafında ise sepet, bakiye, stok, oy kullanma, parola sıfırlama ve hesap doğrulama akışları tipik hedeflerdir.
Birden fazla uygulama sürecinin ya da sunucunun aynı veritabanını kullandığı yapılarda, uygulama içinde yapılan bir kilit tek başına yetmez; kontrol veritabanı düzeyinde de güvenceye alınmalıdır. Eşzamanlı istek sayısı arttıkça sorun görünür hâle gelir.
Nasıl korunulur?
- Kritik işlemleri veritabanı işlemleri (transaction) içinde atomik olarak yapın
- Kontrol ve güncellemeyi tek adımda birleştirin; kullanılan kuponu doğrudan koşullu
UPDATEile işaretleyin - Benzersizlik gerektiren alanlara veritabanında kısıt (unique constraint) ekleyin
- Gerekli yerlerde satır kilidi ya da dağıtık kilit kullanın
- Geçici dosyaları rastgele adlı ve güvenli yöntemlerle oluşturun
- Hassas uç noktalar için istek hız sınırlaması uygulayın
Sık yapılan hatalar
- Kontrolü uygulama kodunda, güncellemeyi ayrı bir adımda yapmak
- Testleri yalnızca tek tek gönderilen isteklerle yapmak
- Yalnızca arayüzdeki düğmeyi kilitleyip sunucuyu korumasız bırakmak
- Önbelleğe alınmış eski değere göre karar vermek
Sık sorulan sorular
Yarış durumu güvenlik açığı sayılır mı?
Evet, özellikle iş mantığını atlatmaya, tekrar kullanıma veya yetki aşımına yol açtığında. Bu tür açıklar sıradan hata gibi görünebilir ama maddi sonuç doğurabilir.
Race condition nasıl tespit edilir?
Aynı isteği çok kısa aralıklarla paralel göndererek sonuçta tutarsızlık olup olmadığına bakılır. Kod incelemesinde “kontrol et, sonra işlem yap” kalıpları aranır.
Yarış durumu nasıl önlenir?
İşlemi atomik hâle getirmek en sağlam çözümdür. Veritabanı işlemleri, kilitler ve benzersizlik kısıtları kontrol ile güncelleme arasındaki boşluğu kapatır.
İlgili terimler
- Yetki yükseltme (privilege escalation)Düşük yetkili bir hesabın daha yüksek yetki elde etmesi.
- Zararlı yazılım (malware)Sisteme zarar vermek ya da yetkisiz erişim sağlamak için yazılmış yazılımların genel adı.
- Açık yönlendirme (open redirect)Bir sitenin kullanıcıyı denetimsiz biçimde başka bir adrese yönlendirmesine izin veren ve kimlik avında kullanılan zafiyet.
- Alt alan adı ele geçirme (subdomain takeover)Artık kullanılmayan bir hizmete işaret eden DNS kaydı üzerinden alt alan adının saldırganca sahiplenilmesi.
- APT (Gelişmiş kalıcı tehdit)Uzun süre fark edilmeden hedefte kalan, kaynakları güçlü saldırı grupları.
- Arabellek taşması (buffer overflow)Programın ayrılan bellek alanının dışına yazması.