Arabellek Taşması güvenlik açığı

İçindekiler

Bu derste arabellek taşması hakkında konuşacağız (Tampon Taşması), uzun süredir var olan bir hata, bir bellek alanına (daha önce ayrılmış olan) kopyalanan veriler doğru kontrol edilmediğinde oluşur, kullanıcı bir yeterli boyut, ancak 15 karakterlik bir bellek ayırırsak ve kullanıcı 20 eklerse, bu, ayrılmış olabilecek veya olmayabilecek başka bir bellek alanını etkileyecektir.

Bu, programımızın askıda kalmasına neden olabilir, ancak çok daha kötü olabilir, kötü niyetli bir kullanıcı bu hatadan yararlanabilir ve uygulamanın çalışmasını etkileyebilir veya bir bilgisayarda rasgele kod çalıştırabilir (normalde bu kod bir komut yorumlayıcısını açar) ). Ayrıca program yükseltilmiş ayrıcalıklarla çalışıyorsa ciddi bir güvenlik açığımız var. Bir uygulamanın çalışmasını değiştirebilecek veya kod enjekte edebilecek başka bir saldırı XSS'dir.

NotBu eğitimde göreceğiniz yürütme işlemleri 32 bit Ubuntu 16.04 işletim sisteminde gerçekleştirilmiştir.

bir görelim Bu saldırıya açık olan basit bir C kodu örneği, programı başlatırken bir parametre geçmeliyiz, uygulama 15 karakterden uzun olmayan bir dize almayı bekleyin, eğer beklenen dizge ise başarılı bir erişim olacak, değilse "reddedilecektir". Kod aşağıda gösterildiği gibidir:

 #include #include #define şifre "Test" geçersiz testi (char * str) {char buffer [15]; int n = 0; strcpy (tampon, str); if (strcmp (arabellek, parola) == 0) {n = 1; } if (n) {printf ("Başarı \ n"); çıkış (0); } else {printf ("Erişim engellendi \ n"); }} int main (int argc, char * argv []) {if (argc <2) {printf ("Uygulama bir parametre gerektirir \ n"); çıkış (-1); } testi (argv [1]); }
Program adını almıştır taşma.c, ve aşağıdakileri derlemek için kullanılmıştır:
 gcc overflow.c -o taşma -fno-yığın koruyucusu
Son kısım: -fno-yığın koruyucusu Derleyicinin koruma koymaması için kullanılır ve örneğini gösterebiliriz. Kullanıcı, maksimum 15 karakterlik bir dizi olan doğru verileri girerse, program iyi çalışır, yanlış bir "şifre" girersek bize gösterecektir. Erişim reddedildi, ve eğer koyarsak "Ölçek”Bizi koyacak Başarı. Programı 2 kez yürüten bir yakalama görelim, bir kez yanlış erişimle ve diğeri doğru Dize ile:

Her şeyin doğru çalıştığını görüyoruz. Ama ya bir üst dize eklersek, ne olacağını görelim:

20 harf A ile programı başlattık, ve bize gösterir Başarı. Bu uygulamada hiçbir şeyimiz yok, sadece uygulamadan çıkıyoruz ama şifreyi bilmeden kısıtlı bir alana girdik. Aşağıdaki işlevi yerine koyarsak:

 strcpy (tampon, str);
Aşağıdakiler tarafından:
 strncpy (tampon, str, 15);
Y kodu 20 harf A ile yürütüyoruz, aşağıdaki çıktıya sahibiz:

kullandığımızı da görebilirsiniz. strcmpbunun yerine kullanmalıyız strncmp, bu yüzden boyutu da kontrol ediyoruz. En fazla 15 karakterin kopyalanabileceğini kontrol ettik, bu nedenle daha fazlasını eklerlerse programımızı etkilemez. Mesajı görüntüledikten sonra Başarı bir sistem komutu yürütüyoruz (bu durumda ben kimim), şu bilgileri elde ederiz:

Yukarıda root değiliz, ancak sudo ile çalıştırırsak aşağıdakileri elde ederiz:

Eklediğimiz tek şey, kod satırının altında yukarıda gördüğümüz kodda bir satır:

 printf ("Başarı \ n");
koyduk:
 sistem ("whoami");
Neler olduğunu biraz anlamak için programı, sahip olduğumuz 2 değişkeni gösterecek şekilde değiştireceğim (tampon Y n) doğru olup olmadığı ve çıktı aşağıdadır, ilk olarak doğru olarak değerlendirilecek bir dize ekleriz (“Ölçek”), Sonra uzunluğu aşmayan yanlış bir tane ve son olarak 20 harf A:

İlk infazda buna değdiğini görüyoruz. 1 Değişken n, çünkü geçen zincir doğru olanıdır, ikincisinde buna değer 0, çünkü yanlış, ama sonuncusunda buna değer 1094795585, bu da koyduğumuz koşulu atlamamızı sağlar eğer (n)n, 0'dan farklı olduğu sürece doğru olacaktır. Kodun geri kalanı doğru olsaydı başarısız olması gerekmeyecek olsa da, bu iyi bir koşul değildir. eğer koyarsak 16 harf A parametre olarak değişkenin değerinin n bu 65:

ASCII koduna bakarsak, sayı 65 mektuba karşılık gelir İLEn değişkeninin hafızasına yanlışlıkla bizim tarafımızdan dokunulduğunu, parametre olarak geçirdiğimiz o fazladan harfin değişkene gittiğini gördük. n. Belleğimiz şu şekilde olurdu:

Karakterlerin ötesine geçersek, bize bir segment ihlali mesajı gönderiyor olabilir (eğer çıkış (0) bizde ne var eğer (n)), aşağıdaki resimde görebiliriz:

Bu uyarı, işletim sistemi tarafından uygulamaya atanan sınırların dışında kalan bir bellek alanına erişme girişimi nedeniyledir. Örneği şu şekilde derlersek:

 gcc overflow.c -o taşma -fstack-koruyucu
Ya da sadece kaldırma -fno-yığın koruyucusu İlk defa gördüğümüz ve kodu taşma ile çalıştırdığımız derlemeden şu sonucu elde ederiz:

gcc'nin bize sağladığı ekstra koruma.

NotBir kod yürütmek istersek (kabuk kodu) dönüş adresini kabuk kodumuzunkiyle üzerine yazmamız gerekir, bu, öğreticide görülen örnekten biraz daha karmaşıktır ve bu nedenle daha fazla çalışma gerektirir.

Birisi bu güvenlik açığından yararlanmayı başarırsa, size çok fazla zarar verebilir. Bu tür arızalardan kaçınmak ve kötü niyetli bir kullanıcının bundan faydalanabilmesi çok kolaydır, doğru programlayın, kullanılan programlama dilini iyi bilmeniz, hangi işlevleri kullanıp neleri kullanmayacağınızı bilmeniz, uygulamayı test etmeniz gerekir. peki, sadece doğru verilerle değil, öngörülemeyen verilerle uğraştığımızda da doğru çalışması gerekiyor.

Sizi etkilememesi veya risklerini en aza indirmemesi için inceleyip farkında olabileceğiniz diğer saldırılar ise şunlardır: DoS ve Brute Force. Ve güvenlik açıkları için CVE sayfasını kontrol etmeyi unutmayın.

Bu Eğitimi beğendiniz ve yardım ettiniz mi?Yazara olumlu puan vermek için bu düğmeye basarak yazarı ödüllendirebilirsiniz.

Arkadaşlarınızla sayfasını paylaşan sitenin gelişimine yardımcı olacak

wave wave wave wave wave