Sayfayı Yazdır | Pencereyi Kapat

Kod Eriþim Güvenliði !

Nereden Yazdırıldığı: Bilginin Adresi
Kategori: Bilgisayar Güvenliði / Computer Security
Forum Adı: Güvenlik / Security Makaleleri
Forum Tanımlaması: Bilgisayarýnýzý Her Türlü Saldýrýya Karþý Korumak Ýçin Yapmanýz Gerekenler
URL: https://www.bilgineferi.com/forum/forum_posts.asp?TID=7731
Tarih: 04-05-2024 Saat 22:17


Konu: Kod Eriþim Güvenliði !
Mesajı Yazan: megabros
Konu: Kod Eriþim Güvenliði !
Mesaj Tarihi: 12-06-2009 Saat 10:20

Birçok güvenlik sistemi kullanýcýlarýn kimliklerine göre sisteme ve kaynaklara eriþim haklarýný verir ve/veya kýsýtlar. Kullanýcý kimliði olarak çoðu zaman kullanýcý adý ve þifre kullanýlmaktadýr. Bu yazýmýzda .NET”in saðladýðý kod bazýndaki güvenlik katmanlarýnýn temel olarak yapýsýný inceleyeceðiz.

Kullanýcýlar kullandýklarý kodlarýn kaynaklarýný bilmemektedirler, dolayýsýyla kullanýlan programýn sadece vaat ettiði iþi yaptýðýný veya yapmadýðýný bilmeleri de olanaksýzdýr. Daha önceki yazýlarýmýzda da sýkça bahsettiðimiz trojan ve trap doorlar da tamamiyle bu mantýk üzerine çalýþmaktadýrlar. Bu yüzden çoðu iþletim sistemi kodu çalýþtýrmadan önce kodun güvenilir bir kaynaktan gelip gelmediðini araþtýrýr. Örneðin web sitelerindeki ActiveX kontrollerinin çalýþtýrýlabilmesi için kullanýcýnýn siteye güvendiðini belirtmesi gerekmektedir.

Buna karþýn, internet üzerinden daðýtýlan, güvenilir olduðuna inandýðýnýz bir programýn gerçekten de o program olup olmadýðýnýn da teyidi gerekmektedir. Bir zamanlarýn en iyi virüs tarama programý olan FProt programýndaki küçük bir hata bir çok sistemin zarar görmesine sebep olmuþtur. Bu tarihteki FProt programýnýn sürümünde unutulmuþ, çok önemli bir detay vardý: Fprot tüm sistemde virüs taramasý yaparken sadece kendisini tarayamýyordu. Ýnternet üzerinden daðýtýlan virüslü FProt programýný kuran kiþilerin bilgisayarlarýnda yapacaklarý ilk virüs taramasýyla bilgisayarlarýndaki tüm dosyalara virüs yayýlmasý bir oluyordu. Virüs, FProt programýyla henüz taranan dosyaya kendi bulaþtýrarak yayýlýyordu. Virüsün kaynaðý virüs tarama programýnýn kendisi olunca temizlenmesi de imkansýz bir hale geliyordu. Zaten FProt programýndaki bu hatadan sonra FProt”a olan güven fazlasýyla sarsýlmýþtýr.

Kod eriþim güvenliði, iþlemleri ve kaynaklarý korumakla yükümlü koda eriþimleri kontrol eden güvenlik mekanizmasýdýr. Biraz karýþýk bir taným gibi gözükse de temelde yapýlan iþler oldukça basittir. .NET Framework”teki kod eriþim güvenliði temel olarak aþaðýdaki iþlemleri yapar:

Çeþitli sistem kaynaklarýna eriþim haklarýný tanýmlar. Yöneticilerin güvenlik politikalarýný belirli bir grup kod için özelliþtirmeleri için gerekli iliþkilendirmeleri yapmalarýný saðlar. Bir kodun çalýþabilmesi için gerekli olan izin ve izin kümelerinin neler olmasý gerektiðini, sahip olmasý ve sahip olmamasý gereken izinlerin neler olduðunu tanýmlanmasýný saðlar. Belleðe yüklenen her bir assembly için izin ve ayrýcalýklarý verir. Ve kodu çaðýran kiþilerin yaptýklarý her iþleme göre nasýl bir güvenlik politikasý izleneceðini belirtir. Kodu çaðýran kiþilerin (ya da programlarýn) belirli ayrýcalýklara sahip olmasýný saðlar. Kodu çaðýran kiþilerin digital imzalarýnýn kontrolünün yapýlabilmesini saðlar. Bu da kodun sadece belirli bir grup, kurum/ kuruluþ tarafýndan çaðrýlabilmesini saðlar. Kodu çaðýran program parçaçýklarýnýn call stack”te sahip olmalarý gereken hak ve ayrýcalýklar için gerekli kýsýtlamalara zorlar.

Bir kodun belirli bir iþlemi gerçekleþtirmeye ya da belirli bir kaynaða eriþimi için yeterli haklara sahip olup olmadýðýnýn tespiti için “call stack” (çaðýrma yýðýtý) kullanýlýr. Her fonksiyon içerisinde çaðýrdýðý fonksiyonu çaðýrýrken “call stack” adýný verdiðimizi yýðýta gerekli atamalarý yapar. Bu atamalar, çalýþan fonksiyona çaðýrdýðý fonksiyondan döndüðünde, her þeyi býraktýðý gibi bulmasý için sistem tarafýndan otomatik yapýlýr. Assembly ile uðraþmýþ olalnlar bilirler. Bir fonksiyonu çaðýrmadan önce tüm flaglarý, registerlarý stack”e push ederler. Fonksiyon dönüþü ayný deðerleri tekrar pop ederler. “Call Stack” bu yapýya benzer bir yapýya sahiptir, bu yapý “call stack” deðildir.

Yine COM programlama ile uðraþanlar bilecektir, “Call Context” fonksiyonlara parametre geçirmeden deðiþken ve/ve ya deðer göndermenize izin veren yapýdýr. .NET destekli çoðu web sitesi sisteme giriþ yapmýþ kullanýcý adýný session”da ya da cookie”de tutmak yerine, call contextte tutarak sistemlerinin güvenliðini en iyi düzeye getirmeye uðarþýrlar. Bu uðraþ oldukça yerinde ve doðru bir uðraþtýr. Bu sayede sisteminizde bu ya da benzer sebepten oluþabilecek güvenlik açýklarýný önleme görevini COM, COM+ ya da .NET”e yüklersiniz. COM, COM+ ya da .NET dedik çünkü call context bu üç yapýyla da birebir uyumludur.

Þimdi .NET”in bu güvenliði nasýl saðladýðýna kaldýðýmýz yerden devam edelim. Her fonksiyon kendisini çaðýran diðer fonksiyonlarý sahip olmasý gereken gerekli güvenlik izinlerinin ya da ayrýcalýklarýnýn olup olmadýðýnýn kontrolünü yapar. Bu kontrol sýrasýnda her hangi bir güvenlik ihlaliyle karþýlaþýlýrsa, security exception atýlýr ve eriþim engellenir. Bu kontrol iþlemine stack walk adý verilir. Stack walk .NET”de daha az güvenilen kodun daha çok güvenilen bir kod ile çaðrýlmasý ve izin verilmeyen iþlemler gerçeklenmesini engelleyecek þekilde tasarlanmýþtýr. Yani bu demektir ki, FProt programýnýn virüslü versiyonu .NET teknolojilerini kullanýlarak gerçeklenmiþ olsaydý, bu tür bir güvenlik açýðýnýn oluþmasý imkansýz olurdu.

Kod eriþim güvenliðinin nerede kullanýlabileceðini düþünelim. Kullanýcýnýn belirli bir bilgiyi girebilmesi bir Web sitesinden bir kontrolü indiren bir uygulamayý ele alalým. Bu kontrolde istemci tarafýnda kurulu olan bir kütüphaneyi kullanarak oluþturulmuþtur. Bunun için saðlanabilecek kod eriþim güvenliði senaryolarý aþaðýdak gibi olabilir.

Yüklemeden önce, sistem yöneticisi bir digital imza kullanarak, gerekli ayrýcalýklara sahip olacak kodun güvenlik politikasýný belirleyecek þekilde sistemi tasarlayabilir.  Kullanýcýnýn önceden belirlenmiþ Internet ayarlarýnýn tümü zaten bizim uygulamamýz için de geçerli olacaktýr. Yapýlacak diðer ek iþler için uygulama inen kontrolün geçerlilik testi için digital imza kullanýr. Ýnen kontrol de kendisini kullanacak kod için ayný digital imza kontrolünü yapabilir. Yani ActiveX gibi çalýþýr. ActiveX”i yükleyebilmek ya da kullanabilmek için kullanýcýnýn kendisine yöneltilen güvenlik kontrolü sorusuna olumlu cevap vermesi gerekmektedir. Yükleme zamanýnda, kontrol güvenli bir imzaya sahip olmadan, yürütme süresince Internet güvenlik ayarlarýnýn da hepsi iptal olur. Bu sayede güvenliði tamamen sizin kontrolünüze alýrsýnýz. Bir önceki senaryo ile arasýndaki en önemli fark, sistem güvenliði için Internet ayarlarýnda önceden tanýmlanmýþ izin ve ayrýcalýklara ek yapýyorduk. Ancak artýk o haklarý da kontrolden ve kullanýcýdan almýþ oluyoruz. Ve diðer önemli fark da güvenlik kontrollerinin yükleme zamanýnda yapýlmasýdýr. Bir baþka senaryo ya da yaklaþýmda þöyle olabilir. Kullanýcýnýn bilgisayarýnda normal sahip olduðu haklarýn üzerinde bir iþlem gerçekleneceðinde güvenlik kontrolü yani “stack walk” iþlemi gerçeklenebilir. Diðer güvenlik senaryolarýndan en önemli farký, güvenlik kontrollerinin diðerlerinde yükleme iþleminden önce ya da yükleme iþlemi sýrasýnda yapýlmasýdýr. Bu senaryoda ise bu kontroller gerektiðinde yani ek güvenlik kontrolü gerektiðinde yapýlmasýdýr.

.NET ile geliþtirilen CLR (Common Language Runtime) kullanmayý amaçlayan tüm uygulamalar, yürütme sürecindeki güvenlik sistemi ile ortak çalýþmaktadýr. Þimdi bu kavramý biraz daha açalým. Geliþtirilen uygulamanýn sahip olacaðý tüm ayrýcalýk ve haklar, o an ki uygulamayý çalýþtýran kullanýcýnýn grubuna ve sistemin çalýþma seviyesine baðlýdýr. Çalýþma seviyenize göre gerektiðinde donanýmýn belirli özelliklerinin kullanabilirsiniz. Akýllarda kalabilecek en basit örnek Windows”u güvenli kip de açtýðýnýzda yönetici olarak sisteme girseniz bile, donanýmlarýnýzýn tüm özelliklerini kullanamazsýnýz. Kullanýcý grubuna göre sahip olduðunuz izinler deðiþir dediydik. Buna verilebilecek örnek ise, þu an giriþ yaptýðýnýz sitedir. Sahip olduðunuz kullanýcý adý ve þifreyle yalnýzca sitedeki makaleleri okuyabilirsiniz. Yönetici ayrýcalýklarýna sahip bir kullanýcý ile giriþ yaptýðýnýzda ayný makaleleri deðiþtirebilirsiniz, ya da yenilerini girebilirsiniz. Çalýþtýrýlan uygulamada ayný þekilde güvenlik ayrýcalýklarýný almaktadýr. Öncelikle, CLR”den uygulamanýn sahip olacaðý hak ve ayrýcalýklarý alýr ve CLR üzerinde çalýþmaya baþlar. Uygulamanýn sahip olduðu hak ve ayrýcalýklar CLR tarafýndan uygulamanýn “call stack” “ine yazýlýr. Þimdi bu noktada sistemde bir açýk olduðu düþüncesine kapýlabilirsiniz. “Ben bu uygulamanýn call stackindeki ayrýcalýklara sistem yöneticisi ayrýcalýklarýný da eklersem, sistem yöneticisi olmadan sistem yöneticisi statüsüne eriþebilir miyim?”. Eminim bu soru bir çoðunuzun aklýna gelmiþtir. Cevap tabi ki de ”HAYIR !!!!”. Sistem yöneticisi olarak eriþmek istediðiniz sahip olmanýz gereken hak ve ayrýcalýklar “call stack” te yukarýdan aþaðýya doðru kontrol edilir. Belki üst katmanlarý geçmenin bir yolunu bulabilirsiniz. Ancak daha sonraki katmanlarda yani güvenlik kontrolü .NET Framework”e kadar indiðinde, sistem tarafýndan security exception otomatik olarak atýlacak, ve istek red edilecektir.

Ayrýca unutmamanýz gereken bir diðer önemli nokta da sistemin geliþtirilen bir uygulamanýn compile edilme süresince çok zayýf olacaðýdýr. Her hangi bir þekilde geliþtirilen uygulamanýn compile edildiði threadin kontrolü kaybolursa, sistemin güvenlik katmaný diye bir þey kalmayacaktýr. Geliþtirilen tüm iþletim sistemlerinde genelde performans nedenleriyle güvenlik kernelde saðlanmaz. Sistem güvenliði iþletim sistemleri için birer servistir. Compile süresince compile iþlemini gerçekleyen thread kernele eriþir. Kernele eriþimlerin gerçeklendiði bu anlarda, sisteminiz bu thread üzerinden her türlü saldýrýya açýktýr. Bunun için gerçekten güvenilir compilerlarý kullanmanýzý öneririz.

Kod eriþim güvenliði saðlanmamýþ uygulamalar hem kullanýcýlarý hem de uygulama geliþtiricileri tehlikeye s****ktadýr. Oluþturacaðýnýz sistem ne denli büyük ve kompleks olursa olsun, .NET gibi güvenilir bir framework üzerine uygulamanýzý kurmanýz yararýnýza olacaktýr. .NET ile 3D flight simulator yapýlabildiðini de düþünürseniz eðer, geliþtireceðiniz uygulamalar için daha güvenilir bir framework bulamazsýnýz. Kullanacaðýnýz frameworkün ve compiler”in önemini de hatýrlattýktan sonra yazýmýzý tamamlamak istiyoruz.

Son Söz

.NET ile kod eriþim güvenliðinin nasýl saðlanacaðýný incelediðimiz bu yazýmýz da ”call stack” kullanýmýndan bahsettik. Bu tür bir stack walk kullanmak sistemimizin güvenliði için bize oldukça fazla artý getirse de sürekli yapýlan bu security checkler sistemimizin performansýndan götürmektedir. Optimizasyon için stack walk performans için mümkün olduðunca kýsa ama güvenlik için de mümkün oldukça uzun olmasýna dikkat etmelisiniz. Sistem güvenliði saðlamanýn yolu, sistemi ve sistem programlamayý çok iyi bilmekten geçmektedir. .NET ile kuracaðýnýz güvenlik sistemi konusunda bazý senaryolardan bahsettik, bu senaryolarý arttýrmak tabi ki de mümkün. Yalnýz unutmamanýz gereken en önemli þey, doðru programlama araçlarýný ancak doðru þekilde kullanarak yeterince güvenli sistemleri oluþturabilirsiniz.

Saygýlar..



Sayfayı Yazdır | Pencereyi Kapat