13 Haziran 2013 Perşembe

YAZILIM GÜVENLİĞİNE GENEL BAKIŞ VE GÜVENLİĞİN ÖNEMİ


Yazılım Güvenliğine Genel Bakış ve Yazılım Güvenliğinin Önemi

Yazılım ve Güvenlik

Bilgisayarları istediğimiz şekilde çalıştırmak için ihtiyaç duyduğumuz kod yığınlarından ve bileşenlerden oluşan binary bütünlüğe program demekteyiz. Bir program bilindiği üzere herhangi bir programlama dili ile geliştirilebilir (C++, Delphi, C#, Java, vb.). Bizler hangi programlama dilini kullanırsak kullanalım yazdığımız kodlar bilgisayarın anlayacağı dil olan Assembly'e dönüştürülmektedir. Yani bilgisayarın evrensel dilidir Assembly. Örnek verecek olursak; C++ ve Delphi dillerinde basit bir toplama işlemi yaptıran işlev geliştirip assembly karşılıklarına bakalım:

C++ dili ile toplama işlemi:


int __stdcall Topla( int _giA, int _giB )

{ return _giA + _giB; }

Delphi dili ile toplama işlemi:


function Topla( _giA, _giB : Integer ) : Integer; stdcall;

begin

Result := _giA + _giB;

end;

Bu iki farklı dilde yazılan kodların Assembly karşılıkları aşağıdaki gibi olacaktır:

C++ dili ile yapılan toplama işleminin Assembly karşılığı:


push ebp

mov ebp, esp

mov eax, [ ebp + 8 ]

mov edx, [ ebp + 0C ]

add eax, edx

mov esp, ebp

pop ebp

ret 8

Delphi dili ile yazılan kodların Assembly karşılıkları aşağıdaki gibi olacaktır:


push ebp

mov ebp, esp

mov eax, [ ebp + 8 ]

add eax, [ ebp + 0C ]

mov esp, ebp

pop ebp

ret 8

Görüldüğü gibi hangi dilde yazılırsa yazılsın derleyiciler tarafından üretilecek assembly kodları birbirinin ya tamamen aynısı ya da çok az farklı olacaktır. Assembly dilinde üst seviyeli programlama dillerindeki farklar ortadan kalktığı için programlara yapılmak istenen müdahale de yine bu dil ile olmaktadır.

Assembly ile yapılacak değişikliğin program üzerindeki etkisini anlamak için yukarıda; 1. örnekteki add eax, edx satırını şu şekilde değiştirelim sub eax, edx ve 2. örnekteki add eax, [ebp + 0C ] satırını şu şekilde değiştirelim sub eax, [ ebp + 0C ]. Bu değişiklik ile Topla işlevinden beklenen toplama işlemi sonucu yerine çıkarma işlemi sonucu üretilecektir.

Gözden kaçırılmamalıdır ki; programınız için geliştirdiğiniz algoritmalar da başkaları tarafından yine aynı şekilde kopya edilebilir, kontrol mekanizmalarınız kırılabilir, şifreler elde edilebilir, vs.

Durum böyle olunca ister istemez akla programımızın amacından farklı çalıştırılmasının nasıl önüne geçilebilir sorusu akla gelmektedir. İşte bu sorunun cevabıdır, yazılım güvenliği.
Yazılım Güvenliğine Genel Bakış

Yazılım güvenliği genel olarak; yazılımların tersine mühendislik yöntemleri ve araçları ile (debugger, disassembler, vb.)algoritmalarının ortaya çıkartılması veya değiştirilmesini engellemeyi amaçlayan yöntemler bütünüdür. Yazılım güvenliğinin ele aldığı temel sorunlar, kodların açığa çıkmasını ve değiştirilmesini (debugging, tracing ya da disassembly ile) ve tersine mühendislik araçlarını (debugger, disassembler, vb.) engellemek şeklinde özetlenebilir.

Tersine mühendislik için kullanılan araçları da kısaca tanıyacak olursak:

Debugger: Derlenmiş bir programın, çalışma anında assembly kodlarına dönüştürülmesi ve üzerinde değişiklik yapılmasını sağlayan araçlardır. En yaygın tersine mühendislik aracıdır. Çok çeşitlidir tersine mühendislerin en sevdiği araçtır.

Disassembler: Derlenmiş bir programın, çalıştırılmadan çözümlenmesini (assembly kodlarına dönüştürme) sağlayan tersine mühendislik aracıdır. Uygulama algoritmalarının ve denetim mekanizmalarının kavranarak çözümlenmesi amacıyla sıkça kullanılmaktadır.

Özetleyecek olursak; yazılım güvenliğini ortaya çıkaran sorun tersine mühendislik araç ve yöntemlerininin kötüye kullanılmasıdır. Buna karşı yöntem geliştirmek çok fazla bilgi ve tecrübe gerektirdiğinden sıradan bir yazılımcı ya da programcılar tarafından engellenmesi de mümkün değildir.
Yazılım Güvenliğinde Etkileşim

Gelişen bilgisayar ve yazılım teknolojileri yazılım güvenliğini daha da karmaşık hale getirmiştir. Dün, işletim sistemleri ve programlarımız sadece donanım ile etkileşim halinde iken bugün işletim sistemleri, işletim sistemi bileşenleri, kullanıcı bileşenleri, 3. parti bileşenler vs. ile etkileşimlidir.

Etkileşim beraberinde güvenlik sorunlarını da getirmektedir. Böylesi karmaşık problemlerin çözümlenmesi için problemde soyutlama yapılarak, saldırıya en fazla maruz kalacak nesne (base object) tespit edilerek korunması sağlanır. Bu yaklaşım ise çoğu zaman etkileşimli bileşenlerin korunmasını göz ardı etmeyi gerektirir.
Güvenliğin En Zayıf Halkası Çalışabilirler (Programlar)

Yukarıda da anlattığı gibi yazılım güvenliğnin en zayıf halkasını çalışabilirler (programlar) oluştururlar. Çünkü; uygulama geliştiriciler (programcılar) yazılım güvenliği bilgilerine sahip değillerdir. Bir program üzerinde güvenlik açığı oluşturabilecek pek çok unsur bulunmaktadır.

Bu unsurlar:

Code: Uygulamaların kodlarının bulunduğu bölümdür. Programların çalışabilir kodları burada bulunur. En fazla saldırıya maruz kalan bölümdür. Üzerinde değişiklik yapılması çok da kolay değildir. Temel assembly bilgisinden daha fazlasını gerektirir.

Import: Uygulamaların diğer bileşenleriyle ve işletim sistemleriyle bütünleşme noktalarıdır. Programların çalışmasına doğrudan etkisi vardır. Ulaşılması ve değiştirilmesi oldukça kolay olduğundan saldırganlar tarafından sıkça kullanılmaktadır. Bölümün bir özelliği de, uygulamanın çalışmasına yönelik bilgiler bulundurmasıdır. Buradaki bilgiler normal kullanıcılar ya da program geliştiriciler için önemli gibi görünmesede, saldırgan için değerli bilgiler içerir. Bu bakımdan da saldırganlar için yüksek önceliğe sahiptir. Genel olarak bu bölüme yapılan saldırılar:


Bütünleşme adresleri üzerinde değişiklikler,


Saldırgan tarafından hazırlanan bileşenlerin uygulama etkileşimine dahil edilmesi,


Uygulama kodlarının ve verilerinin daha belleğe yüklenme sırasında değiştirilmesi ya da yönlendirilmesi,


Bütünleşmesi beklenen bileşenler yerine saldırgan tarafından hazırlanan bileşenleri ikame edilmesi, vb. yöntemler sayılabilir.

Resource: Uygulama iç verilerinin tutulduğu ve ihtiyaç duyulduğunda karşılandığı bölümüdür. Programların çalışmasına dolaylı etkisi vardır. Ulaşılması ve değiştirilmesi oldukça kolaydır, ancak doğrudan çalışabilir olmadığından saldırganlar için daha düşük önceliğe sahiptir. Uygulama iç verileri (resimler, sesler, ikonlar, vb.) burada bulunduğundan başkaları tarafından da kolayca kopya edilebilir. Herhangi bir program üzerinden kopya edilen resimler, sesler ya da ikonlar değersiz gibi görünsede ülkemizde de patente konu olduğundan dikkatle korunması gerekmekir. Bu bölüm üzerinden saldırı yapmak daha fazla tecrübe gerektirdiğinden uzman saldırganlar tarafından tercih edilir.

Uygulama güvenliğinde korunması gereken en önemli unsurları bu üç bölüm oluşturmaktadır. Bunlar dışında uygulama üzerinden yapılacak pek çok saldırı türü ve bu amaçla kullanılabilecek uygulama unsurları bulunmaktadır. Bu yazıda yalnızca en güncel ve en çok kullanılan yöntemler ele alınmıştır.



KAYNAK :Erkan Demirkan, Arf Teknoloji

26.04.2012



Hiç yorum yok:

Yorum Gönder