Race Condition Saldırıları Nedir? (50.sayı Dergi)

MekoR

Katılımcı Üye
6 Şub 2010
660
6


Race Condition Nedir?

Bu terim, birbirinden bağımsız birden fazla eş sürecin aynı kaynak üzerine aynı zaman diliminde erişmeye çalışması sonucu bir process’in diğerinden önce o kaynağa erişip olumsuz sonuçlar üretmesine sebep olabilecek tanımlardır.

maxresdefault.jpg


Race Condition'lar genellikle uygulamanın doğru çalışmasını bozdukları için bug olarak adlandırılırlar.
Her ne kadar da çoklu işlemcilerde eş zamanlılık mevcutsa da söz konusu tek bir kaynağa aynı veriyolu üzerinden erişim olduğundan iki eş süreçten biri aynı zaman diliminde kaynağa erişim sağlamaktadır. Yalnız bu işlemler nanosaniyeler ölçeğinde olup bitmektedir.

Race Condition Saldırıları Nasıl Oluşur?

Race Condition saldırılarında gönderilen process’ler kaynağa rastgele sızma girişiminde bulunur. Attack süresi değişken olduğu için race condition’ların ne zaman oluşacağı tahmin edilemeyebilir.

Kendiğinden Oluşur mu?

Bir program yeterince şanslı ise race condition oluşmadan belki haftalarca düzgün bir şekilde çalışabilir. Ancak bu onun hiç oluşmayacağı anlamına gelmez. Bu kesinlikle garanti değildir. Çünkü race condition’a zemin hazırlayan şartlar tamamen işlemciler üzerinden çalışan diğer süreçlerin zamanlanmasına bağlıdır. Race condition oluştuğunda şartlar öyle bir haldedir ki her iki işlemci aynı süreci aynı anda işletmeye çalışmaktadır.

multithreaded_testing.jpg


Yazıda anlatılanı kod ile örneklendirelim ve örnekte bir adet paylaşımlı bir değişken olsun.Eşzamanlı çalışacak 2 adet sürecimiz olsun. Yaptığı iş bu paylaşımlı değeri +1 kadar arttırmak olsun.

Kod:
int g_sharedValue = 0;
 
**** work()
{
	int iteration=5;
	
	while (iteration-- > 0) 
	{
		g_sharedValue++;
	}
}
 
**** start()
{
	const int WORKER_COUNT=5;
	
	for (int i=0;i<WORKER_COUNT;i++)
	{
		create_worker(work);
	}
}

Şimdi yukarıdaki misal verilen kod 5 farklı iş parçacığı (Thread) içinde work adında bir fonksiyonu çalıştırıyorlar. Ve create_worker fonksiyonunu da her bir work fonksiyonunu farklı processorlar üzerinde çalıştırmaktadır. Burada mühim olan work fonksiyonudur.
Normal Süreçte Beklentimiz Nasıl Olmalı?
Elimizde 5 adet thread (iş parçacığı) var. Ve bu 5 farklı süreç kendi içinde 5’er defa paylaşımlı olan g_sharedValue adlı değişkenimizi +1 arttırıyor. Bizim beklentimiz bu program çalışıp sonlandığında g_sharedValue değişkeninin 25 değerini tutuyor olması. Ancak programı defalarca çalıştırdığımızda şu şekilde sonuçlar almamız olasıdır.

1. çalışma: 25
2. çalışma: 25
3. çalışma: 25
4. çalışma: 25
5. çalışma: 25
6. çalışma: 23
7. çalışma: 25
8. çalışma: 25
9. çalışma: 24
10. çalışma: 25

Çoğunlukta beklediğimiz sonucu alsak da aralarda çok farklı sonuçlar alabildik. İşte bu duruma sebebiyet veren durum Race condition’ın tam olarak karşılığıdır

maxresdefault.jpg


İşlemciler programladığımız işlemleri yapmak için yazdığımız programlara karşılık gelen bir dizi makine komutu dizilerini çalıştırmak durumundadırlar. Her ne kadar da biz makine komutlarına göre yüksek seviye sayılacak dillerde bu işlemleri bir bütün halinde çalışacağını düşünsek de bu kodların makine kodu karşılıkları birkaç adımdan meydana gelebilir.

The-left-side-of-the-figure-shows-a-possible-race-condition-of-mutation-and-message.png


Yukarıdaki örneğimizde bir değişkeni bir arttıran kod işlemcinin perspektifinden şu adımlarla gerçekleşir. Bu adımlar işlemci mimarisinden mimarisine değişse de genel olarak hemen hepsinde aynı yol izlenir. İşlemciler bir bellek bölgesinde bir değer üzerinde değişikliğe gideceği zaman bunu doğrudan bellek üzerinde yapamazlar. Önce bellek bölgesinden veriyi içsel yazmaçlarına (Registers) almalı (Load), yazmaçlar üzerinde gerekli değişiklik yapıldıktan sonra tekrar bellek bölgesine yazılmalıdır (Store).

Kısacası g_sharedValue++ operasyonu işlemci üzerinde şu adımlarla gerçekleşir.

1 – REGISTER1 = [g_sharedValue] //g_sharedValue değişken adresindeki değeri 1 nolu yazmaç'a yükle
2 – REGISTER1 = REGISTER1 + 1 //yazmaç değerini 1 arttır.
3 – [g_sharedValue] = REGISTER1 //yazmaçtaki değeri geri bellek bölgesine depola.

Şimdi baktığımızda bizim açımızdan tek adımda halledilen bir kodun esasen 3 ayrı adımdan meydana geldiğini gördük. Bu noktada bir kavramdan daha bahsetmek gerek. O da Atomicity' dir.
Atomicity yani bölünmezlik işlemci üzerindeki bir makine komut çalışırken onu hiçbir başka komutun araya girip bölememesi demektir. Örneğin yukarıdaki her bir adım birer atomic operasyondur. Yani çalışmaları asla bölünemez.

47%2Brace%2Bconditions_html_5c0b8f06.png


Race condition problemimizin derinliklerine indiğimizde meselenin atomicity konusunda indirgendiğini görmüş olmalısınız. Eğer yazdığımız bir kod aslında bölünebilir birkaç adıma ayrılabiliyorsa bir komut tamamlanmadan belli şartlar oluştuğunda pek ala çalışması kesilebilir.

50.Sayı
[/B][/COLOR]​
 
Üst

Turkhackteam.org internet sitesi 5651 sayılı kanun’un 2. maddesinin 1. fıkrasının m) bendi ile aynı kanunun 5. maddesi kapsamında "Yer Sağlayıcı" konumundadır. İçerikler ön onay olmaksızın tamamen kullanıcılar tarafından oluşturulmaktadır. Turkhackteam.org; Yer sağlayıcı olarak, kullanıcılar tarafından oluşturulan içeriği ya da hukuka aykırı paylaşımı kontrol etmekle ya da araştırmakla yükümlü değildir. Türkhackteam saldırı timleri Türk sitelerine hiçbir zararlı faaliyette bulunmaz. Türkhackteam üyelerinin yaptığı bireysel hack faaliyetlerinden Türkhackteam sorumlu değildir. Sitelerinize Türkhackteam ismi kullanılarak hack faaliyetinde bulunulursa, site-sunucu erişim loglarından bu faaliyeti gerçekleştiren ip adresini tespit edip diğer kanıtlarla birlikte savcılığa suç duyurusunda bulununuz.