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

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} " +

                          "Uygulama Dizini    : {1} " +

                          "------------------------ " +

                          "Alt Domain Adı     : {2} " +

                          "Uygulama Dizini    : {3} ",

                          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(" Default Domain Assemblies ------------------------ ");

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

            {

                Console.WriteLine(" " + assm.GetName().Name);

            }

            Console.Write(" Child Domain Assemblies ------------------------ ");

            foreach (Assembly assm in ozelAlan.GetAssemblies())

            {

                Console.WriteLine(" " + assm.GetName().Name);

            }

 

            Console.ReadKey();

        }

    }

}

 

Son eklenen kodlar ve güvenlik bölgesinin belirlenmesiyle birlikte uygulama alanındaki kodların sadece verilen yetkilerle çalıştırılmasını sağlamış olduk. 

 

.: SON :.

Soru ve görüşleriniz için

suattuncer@hotmail.com .::. http://suattuncer.blogcu.com

Döküman Arama

Başlık :

Kapat