yazgelistir.com
  Ana Sayfa   Forumlar   Blog  Hakkımızda
  
Loading... Yükleniyor. Lütfen bekleyin ...
 Kategoriler
ASP.NET
ADO.NET
Visual Basic .NET
Visual C# .NET
Visual Studio ve Araçlar
Windows Server System
Office System
.NET Framework
SQL Server
XML Web Servisleri
Yazılım Güvenliği
Yazılım Mühendisliği
Mobil Teknolojileri
Dynamics
Smart Client
Expression Studio
Silverlight
Kod Parçaları
Açık Kaynak Kodlu Uygulamalar
İş Zekası
Windows Mobile Embedded

    0
Çıkış Yap
Üyelik Bilgilerimi Güncelle
Seminerlerim
Favorilerim
Ajanım

 Yazgeliştir
Yazar olmak ister misiniz?
Forumlar
Kitap Önerileri
Haberler
Röportajlar
Yazarlar
İpuçları
Görüşleriniz
Hakkımızda

  İstatistikler
En son kayıt olan üye:
ftonak

Şuanki online üyeler ( 6 ) :
murat_karaslan , analyzer20 , SoftwareExperts , myurt87 , lammoth , ahmetkilic
 

DorukNet 
     Yazılım Güvenliği Kategorisi  » Bir Saldırının Anatomisi ve Application Domain Sınıfı-4    

Bir Saldırının Anatomisi ve Application Domain Sınıfı-4

Print Versiyonu


 
Yazar: Suat Tuncer

Tarih:12.12.2007

Puan:3,5 (Oy Kullanan:4)

Okuma Sayısı:226

  Makaleyi İşaretle


Makale Özeti
Bu makalede Bir Saldırının Anatomisi ve Application Domain Sınıfı-3 makalesin’e kadar yapmış olduğumuz işlemleri artık güvenlik çerçevesinde yapacağız.


Makale

Bu makalede Bir Saldırının Anatomisi ve Application Domain Sınıfı-3 makalesin’e kadar yapmış olduğumuz işlemleri artık güvenlik çerçevesinde yapacağız.

Son yaptıklarımızı hatırlayacak olursak, bir Assembly’i ozelAlan domainimiz üzerinden instance’ladık ve sonra içinde yer alan Test Class’ın metodlarına erişip bunları denedik. Bu metodları biraz inceliyelim

        public void SaveFile(string file, string text)

        {

            FileStream fs = new FileStream(file, FileMode.OpenOrCreate, FileAccess.Write);

            StreamWriter sw = new StreamWriter(fs);

            sw.Write(text);

            sw.Close();

            fs.Close();

        }

 

HardDisk’te istenilen isimde bir dosya açan ve bu dosya içeriğine text modda birşeyler kaydeden bir void diğeri ise ;

        public void Navigate(string adres)

        {

            System.Diagnostics.Process.Start(adres);

  }

Verilen linki Web Browser’da açan bir void. Kodlarımızı pek fazla değiştirmeden sadece bazı güvenlik kıstlamaları yaparak tekrar çalıştıracağız birazdan. Geçmeden önce ;

 

 

 

Bu satırdaki parametrelerden null gönderdiğimiz parmetre artık bizim güvenlik bilgilerimizi barındıran bir Evidence nesnesi olmalı. Biz bu nesne içersine tüm güvenlik yetkilerimizi ve kıstlamalarımız yerleştirip domain oluştururken parmetre olarak göndereceğiz. Önceki yazılardan hatırlarsanız AppDomain oluşturulduktan sonra bazı değerlere müdahele edilemiyordu. Bu yüzden seneryomuzu net bir şekilde belirledikten sonra Domainimizi oluşturacağız.

Evidence Nedir ?

 

Rol Based Security’den farklı olarak, uygulama içerisindeki kodlara yetki vermek için geliştirilmiş bir güvenlik modelinin yani CAS’ın temel yapı taşlarındandır. Yapısal olarak incelienirse aslında ICollection interfacenin implement edildiği bir Collection’dır, içersiinde Güvenlik Bölgeleri (Zone), Permission’lar gibi bilgileri barındırır.

Bir Evidence oluşturulurken çoğunlukla Mevcut AppDomain’deki Evidence’dan instance’lanarak oluşturulur. Oysa biz default Domainimizde özel bir yetkilendirme yapmadığımız için Constructure’ın 3. Overload’ı ile instance’layacağız,

hostEvidence                    : Güvenlik AppDomain seviyesinde oluşturulacaksa, güvenlik bilgilerinin bulunduğu objcet dizisi buraya verilecektir,

assemblyEvidence          : Güvenlik AppDomain içersindeki bir Assembly için uygulanacaksa güvenlik bilgilerinin bulunduğu objcet dizisi buraya verilecektir,

öncelikle ozelAlan AppDomain nesnemize güvenlik bölgesini seçelim bunu için System.Security.Policy altında yerlan Zone nesnesini kullanacağım, Zone kullanıma en güzel örnek IE’da bulunan güvenlik ayarlarıdır. Görüldüğü üzere uygulama güvenliği, bölge (Zone) seçerek yada mevcut bir bölgeyi özelliştirerek düzenlenmektedir. Evidence’lar ile birlikte kullanılan Zone’larda bize AppDomain’lere veya Spesifik olarak Assemblylere yetkilendirme ve bölgelere atama yeteneği kazandırmakdır. Evidence, Zone ve Permission’ları CAS ile Uygulama Güvenliği isimli makalemde daha ele alacağım

IE ‘da Güvenlik Bölgeleri

 

 

 

 

Görüldüğü gibi instance’lanırken bir güvenlik bölgesi seçmeliyiz. Varsayılan olarak .Net’de kullana bileceğimiz bölgeler şunlardır;

 

namespace System.Security

{

    [Serializable]

    [ComVisible(true)]

    public enum SecurityZone

    {

        NoZone = -1,         //yer hangi bir bölge yok

        MyComputer = 0,      //bilgisayarım

        Intranet = 1,        //yerel ağ

        Trusted = 2,         //güvenli

        Internet = 3,        //internet, dış dünya

        Untrusted = 4,       //güvensiz

    }

}

 

1.       Biz AppDomanimizi’ başlangıçda Güvenli olarak belirteceğiz

 

Zone bolge = new Zone(SecurityZone.Trusted);

 

2.       Hemen sonrasında bolgeyi atacağımız, object parametreyi tanımlayalım

            object[] host = new object[1];

host[0] = bolge;

3.       ve şimdeide Evidence’sımızı tanılayalım

Evidence ev = new Evidence(host, null);

4.       Güvenliği AppDomain seviyesinde kullanacağımız için assemblyHost paremetresini nul gönderiyorum. Son olarak evidencei AppDomaine gönderiyoruz;

 

AppDomain ozelAlan = AppDomain.CreateDomain("domain#1", ev, domainBilgi);

 

 

Son yapılan değişikliklerle birlikte kodumuzun görüntüsü şöyle olacaktır (Kırmızı ve kalın yazılmış kısımlar yeni eklediklerimizi gösteriyor);

using System;

using System.Collections.Generic;

using System.Text;

using System.Reflection;

using System.Security.Policy;

using System.Security.Permissions;

using System.IO;

using System.Security;

 

namespace expConsole

{

    class Program

    {

        static void Main(string[] args)

        {

 

            AppDomainSetup domainBilgi = new AppDomainSetup();

            domainBilgi.ApplicationBase = "D:\\Alt_Domain";

 

            Zone bolge = new Zone(SecurityZone.Trusted);

            object[] host = new object[1];

            host[0] = bolge;

 

            Evidence ev = new Evidence(host, hostForAsm);

 

            AppDomain ozelAlan = AppDomain.CreateDomain("domain#1", ev, domainBilgi);

 

            Console.Write("Default Domain Adı : {0}\n" +

                          "Uygulama Dizini    : {1}\n" +

                          "------------------------\n" +

                          "Alt Domain Adı     : {2}\n" +

                          "Uygulama Dizini    : {3}\n",

                          AppDomain.CurrentDomain.FriendlyName,

                          AppDomain.CurrentDomain.SetupInformation.ApplicationBase,

                          ozelAlan.FriendlyName,

                          ozelAlan.SetupInformation.ApplicationBase

                          );

            //ApplicationBase'de yer alan assembly'i domaine yükleniyor

            Assembly asm = Assembly.LoadFile(ozelAlan.SetupInformation.ApplicationBase + "\\expTestAssembly.dll");

 

            /* test classının bir instance oluştmak ve kullanmak */

            object obj;

            obj = ozelAlan.CreateInstanceAndUnwrap(asm.GetName().Name, "expTestAssembly.Test");

            expTestAssembly.Test test = (expTestAssembly.Test)obj;

 

            //MethodInfo met;

            //met = test.GetType().GetMethod("Navigate");

            //object[] param ={ "http://suattuncer.blogcu.com" };

            //met.Invoke(test, param);

 

            test.Navigate("http://suattuncer.blogcu.com");

            test.SaveFile("d:\\DomainTest.txt", "buda bir test file denemesidir");

 

            /*--------------------------------------------------*/

 

            //Assebmly listeleri alınıyor

            Console.Write("\nDefault Domain Assemblies\n------------------------\n");

            foreach (Assembly assm in AppDomain.CurrentDomain.GetAssemblies())

            {