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

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

Bu yazı gerçek bir hikâyeden alınmıştır, Kişilerin takma adları kullanılmıştır.

Dromedary o gece sabaha karşı uymuştu ve şimdi uyanmak oldukça zor geliyordu, oda tıpkı diğer yazılımcılar gibi geceleri çalışmayı seven biriydi. Sabah güçlüklede olsa yatağından doğruldu ve hızlıca hazırlanıp evden çıktı. Şirkete geldiğinde mesai henüz başlamamıştı. Masasına geçip bilgisayarını açtı ve sistemi kontrol etti, herşey yolundaydı . Dromedary CSoft’da yazılım uzmanı olarak çalışıyordu.Bir ekip olarak, Visual Studio 2005 üzerinde C# ile geliştirdikleri tedarik zinciri projesi test aşamasına gelmişti ve bazı kullanıcılılar tarafından gerçek verilerle test edilmekteydi. Bu yüzden, düzenli olarak her sabah uygulamanın kullandığı DataBase Server’i kontrol ediyordu.

Saat öğlene yaklaştığında test kullanıcılarından biri server’a login olurken hatayla karşılaştığını ve ani bir yavaşlama yaşadığını raporetti. Dromedary hemen server hareketlerini tekrar gözden geçirdi ve logları inceledi. Test kullanıcısın hesabıyla oturum açılmış görünüyordu hesabı düşürüp tekrar bağlanmasını sağladı. Fakat dikkatini çeken bir durum daha vardı. Gece geç saatlerde bir hareketlilik yaşanmıştı ve istemci olarakta geliştirdkleri program görünüyordu. Programın kaynak kodlarını incelemeye başladı fakat herşey normal görünüyordu. Önemsiz olabileceğini düşündü ve bunu not edip rutin işlerine geri döndü.

Akşam çıkış saatine doğru öğlen yaşanan olayla ilgili kafasında tekrar soru işaretleri oluştu ve kalıp DataBase Server’ı izlemeye karar verdi. Saat oldukça geç olmuştu ama olağan dışı bir durum yaşanmamıştı. Kalkıp bir kahve aldı ve tekrar masısına oturup DBTracer programını açtı, tam bu sırada bir hareketlilik yaşandı. Geliştirdikleri Uygulama üzerinden Server’a bir bağlantı yapılmıştı veriler inceleniyordu, kayıtlara bakılıyordu. İstemcilerin bağlantı bilgilerinin tutulduğu tabloyu açıp IP adresi ve kullanıcı adı bilgilerine baktığında test kullanıcılarından biri olduğunu farketti. IP adresini araştırdığında adresin Bağcılar çıkışlı olduğunu gördü. Oysa bu kullanıcı hesabı Kadıköy’dek bir şirkete aitti. Kesinlikle bu başka biriydi ve Geliştirilen uygulame ile birlikte kullanıcı bilgilerinide ele geçirmişti.

Server’da tutulan bilgiler, test amaçlı olduğu için çok önemli değildi fakat gerçek verilerle örtüşen kayıtlarda yer almaktaydı Bağlanan kişiyi farkettiğini belli etmemek için server’ı farklı bir adrese yönlendirdi. Aynı kullanıcı yaklaşık bir hafta önce uygulamanın hatalar ürettiğni rapor etmişti. Bu sorun, direk Dromedary’a rapor edilmemişti ve başka bir arkadaşı uygulamayı yeniden kurup çalışır hale getirmişti. Hemen geçen hafta kullanıcı pc’sine uygulamayı tekrar kuran arkadaşı Barış’ı aradı. Uygulama dizininde bir anormallikle karşılaşıp karşılaşmadığını sordu. Barış, sadece uygulamanın kullandığı CheckPoint.dll dosyasının zarar gördüğünü, onarmak için tekrar kurduğunu söyledi.

Bu bilgiden sonra Dromedary incelemelerini tamamen bu dll üzerine yoğunlaştırdı. Bu dll dosyası uygulama her çalıştırıldığında ilk çağrılan, içerisinde bir çok Class yeralan bir dll’di ve tabiki kendileri yazmıştı. Yavaş yavaş işi anlamaya başlıyordu, ve tahmin ettiği gibi DLL dosyası üzerinden kendi uygulamaları kullanılarak sisteme sızılmıştı. Dromedary sonradan öğrenecekti, aslında bu işi yapan kişi merXas’tan başkası değildi

merXas sadece uygulamanın kullandığı CheckPoint.dll dosyasını kendi istediği işleri yapıcak bir hale getirmiş ve uygulamayının referanslarında yer alan orjinal dll ile değiştirmişti. Bu sayede uygulama , kendisine ait olan bir dll’e, bir proxy dll üzerinde ulaşıyordu. Bu tüm akışın izlenmesini ve istenilen verilerin elde edilmesini sağlamıştı tıpkı kullanıcı adı ve şifrelerin alındığı gibi,

Şekil-1 : Uygulamanın Orjinal Hali

Şekil-1 : Uygulamanın proxy dll ile bozulmuş hali

Peki böyle bir açık kapatılamazmıydı, evek kesinlikle kapatılabilirdi. Zaten merXas ’da, uygulamayı incelerken uygulamanın AppDomain sınıfını kullanmadığını, yani program içerisinde kullanılan Assemblylerin izole edilmediğini ve güvenlik seviyelerinin ayarlanmadığını farkettikten sonra, bu yöntemi kullanmaya karar vermişti. Peki nedir bu AppDomain sınıfı ve güvenlik seviyeleri;

AppDomain sınıfı .Net uygulamalarında, uygulamaların diğer .Net uygulamlarından ve kendi içerisinde kullandığı Assemblyleri bir birinden izol etmek için kullanılan bir sınıfdır. Bu sınıfda Application Domainler yer alır. Application Domainler Assemblyler’i yalıtmak için kullanılan sınırlayıcılar gibi düşünülebilir. Aşağıdaki şekilde görüldüğü gibi uygulamanın ADMain isminde bir Application Domaini ve bunun içerisinde yer alan diğer Application Domainler ve her domainin içerisinde yer alan Assembly’leri bulunuyor.

İşte böyle bir yapı kurulmadan oluştulan Csoft projesinde merXas bu açığı sömürerek uygulamayı kendi istediği işleri yapıcak şekilde revize etmişti. Peki Dromedary bunu nasıl kullanmalıydı, yapıcağı işlem aslında oldukça basitti bir domain oluturup güvenlik seviyesi belirlemek, şöyleki;

Herhangi bir proje içerisinde kullanılacak her nesne, yeni olluşturulacak her nesne bir domain üzerinden instance edilmeli, bunu için her class MarshalByRefObject sınıfından türemiş olmalıdır.

Yani Dromedary CheckPoint Clasını şu şekilde yazmış olsaydı;

namespace CheckPoint

{

public class CheckPoint : MarshalByRefObject

{

//CSoft projesindeki, uygulama ve db arasındak yapılanmayı sağlıyan

//ve uygulamayı kullanıma hazır hale getiren bir methodu inceleyelim

public void StartInterraction()

{

//burada çalıştılmak istenen kodlar

}

}

}

Class yukarıdaki gibi düzenlendikten sonra, şöyle çağırlmalıydı

//Class’ ın instance edileceği domain

AppDomain ad = AppDomain.CreateDomain("CheckPoint");

//instance edilen clasın ObjectHandle bilgisi tutulacak

ObjectHandle objHandle;

//nesne instance ediliyor ve instance edilen objenin handle adresi

objHandle = ad.CreateInstance("CheckPoint", "CheckPoint.CheckPoint");

//instance edilen nesnenin .StartInterraction() metodu çağrılıyor

((CheckPoint.CheckPoint)objHandle.Unwrap()).StartInterraction();

Buraya kadar yaptıklarımız , AppDomain sınıfını sadece yalıtım seviyesinde kullanmaktı. Burası önerilen bir yönetem değildir. Güvenlik seviyesiyle kullanılması daha sağlıklı olacaktır. Günvelik seviyesinde kullanmak içinde tasarım iyi yapılmalı.

Burada çok önemli iki ayrım söz konusu, güvenlik sınırlamaları assembly seviyesindemi olacak domain seviyesindemi !!, Tavsiyem domain seviyesnde olmasıdır. Böylece genel bir kontrol sağlanmış olur. Aynı zaman güvenlik seviyesi düşük yada bulunmayan bir Application Domain’den assembly lerin sızması önlenmiş olur. Ununtmadan aynı zamanda bir Application Domain içerisinde hem domaine hemde assembly’e ayrı ayrı güvenlik seviyeleri uygulanabilir.

/* güvenlik seviyesi için gerekli bilgiler oluşturuluyor */

// Assembly"nin çalışacağı ortam

Zone bolge = new Zone(SecurityZone.Internet);

//ortam dışında bilgiler varsa bunlarda izinler dizisine aktarılabilir

object[] izinler = new object[1];

izinler[0] = bolge;

//güvenlik bilgileri Evidence nesnesne aktarılıyor

Evidence guvenlik = new Evidence(izinler, null);

//clasın instance edileceğii domain

AppDomain ad = AppDomain.CreateDomain("CheckPoint", guvenlik);

//instance edilen clasın ObjectHandle bilgisi tutulacak

ObjectHandle objHandle;

//nesne instance ediliyor ve instance edilen objenin handle adresi

objHandle = ad.CreateInstance("CheckPoint", "CheckPoint.CheckPoint");

//instance edilen nesnenin .StartInterraction() metodu çağrılıyor

((CheckPoint.CheckPoint)objHandle.Unwrap()).StartInterraction();

Artık yeni oluşturduğumuz nesnemiz sadece İnternet ortamında çalışacak seviyede ayarlandı, bunun avantaji yerel sisteme hiç bir şekilde müdahele edememesidir. Böylece bilgisayardan kullanıcının yetkisi olmadan hiç bir veri okuyamaz hiç bir yere kayıt yapamaz daha güvenli bir ortam sağlanmış oldu.

Bu uygulamları yapabilmek için projeye aşağıdaki NameSpacelerin dahil edilmesi gereklidir

using System.Runtime.Remoting;

using System.Security;

using System.Security.Policy;

CSoft böyle bir kaç güvenlik önemlemiyle bu sıkıntıdan kurtulabilirdi, peki bizler herşeyiyle güvenli tasarlanmış bir uygulama nasıl geliştirebilriiz ? Bununla ilgili detaylı örneği Applicatin Domain ve Günvelik konulu yazıda bulacaksınız

Devam edecek...

suattuncer@hotmail.com

Döküman Arama

Başlık :

Kapat