20 Mart 2014 Perşembe

“Dünyayı 80’lerde kablolarla, 90’larda bilgisayar ağlarıyla bağladık. Bugünse dünyayı yazılımlarla bağlıyoruz. Bu yazılımların güvenli bir şekilde tasarımı, geliştirilmesi ve uygulamaya sokulması günümüz evrimleşen dünyası için kritiktir”(Mark Curphey, Microsoft ürün geliştirme başkanı ve OWASP kurucusu)

NEDEN GEREKLİ?



Privacy Rights Clearinghouse adlı derneğin 2005 yılından itibaren kayda geçirdiği bilişim güvenliği ihlalleri olaylarına göre, istisnasız her yıl büyük bir bilgi hırsızlığı olayı yaşandığı tespit edilmiştir. Bugüne kadar sadece bu derneğin raporladığı 226 milyon bilişim güvenliği ihlali, durumun vahametini gözler önüne sermektedir. Gartner adlı teknoloji araştırma ve danışmanlık firması bilişim güvenliği ihlalleri ile alakalı yaptığı araştırmada bu ihlallerin %80 oranında yazılım güvenliği problemlerinden kaynaklandığını ortaya koymuştur.

Bu bulgulardan yola çıkarak rahatlıkla varabileceğimiz sonuç şudur: Bugüne kadar anladığımız manadaki reaktif bilişim güvenliği paradigmaları yavaş yavaş değişmektedir. Zira artık büyük organizasyonlar bilişim güvenliğini, kötü niyetli kişilere karşı sadece kendi perimetrelerini korumak olarak yorumlamanın yeterli olmadığını görmektedirler. Firewall benzeri çevresel güvenliğe ek olarak, anti-virüs ve anlık saldırı uyarı sistemleri(IDS) gibi sunucu bazlı koruma mekanizmaları, güvenliğin vazgeçilmezleri olmuştur. Ancak kötü niyetli kişiler hedeflerine organizasyonların en kritik varlıkları olan “veri” yi koydukları için perimetre ve sunucu koruması da yeterli olmamaktadır. İşte tam burada kablosuz cihazların da, cep telefonlarının da, işletim sistemlerinin de, sunucuların da, kişisel bilgisayarların da ortak noktası olan “yazılım” ve yazılım güvenliği devreye girmektedir.

Yazılım güvenliğinin önemi hakkında gittikçe kuvvetlenen bir konsensüs olmasına rağmen, bunun nasıl başarılacağı konusunda hala üzerinde uzlaşma sağlanmış kesin standartlar bulunmamaktadır. Bu problemin temel kaynağı bilişim güvenliğinin farklı insanlara farklı şeyler çağrıştırmasıdır. Ağ yöneticileri, firewall yöneticileri gibi güvenlik sorumlularının yazılım süreçleri ve standartları konusunda bilgi eksiklikleri öne çıkarken, yazılım üreten insanların güvenlik konusundaki yetersizlikleri bu probleme zemin hazırlamaktadır.

NEDİR?

Her şeyden önce anlamamız gereken güvenli yazılımın, hiçbir hata içermeyen veya muzır niyetli kişilere karşı %100 emin yazılım demek olmadığıdır. Güvenlik açısından bu durum ideal resmi tarif etse de, aynı zamanda hiçbir zaman ulaşılamayacak bir ütopyadır. Çalıştırılmayan ve ulaşılamaz pozisyondaki yazılımlar dışında %100 güvenli yazılım diye bir şey yoktur.

Güvenli yazılım, en basite indirgenmiş tarifi ile güvenliği göz ardı etmeden tasarlanmış, güvenlik kontrolleri ile geliştirilmiş ve güvenli bir durumda kullanıma sunulmuş yazılım demektir. Güvenli yazılım ile saldırı riski hala bulunsa da, bu durumdan ötürü ortaya çıkacak problemlerin büyük oranda önüne geçilmiş olunur. Diğer bir ifade ile güvenli yazılım programı, yazılımların açıklığından doğan risklerin kontrol edilmesi ve en aza indirilmesi için uygulanır.

OLAĞAN ŞÜPHELİLER

Güvenli yazılım nasıl yapılır sorusuna cevap aramadan önce, yazılımlarda güvenlik açıklarına sebep olabilecek temel hatalara göz atmakta fayda vardır. Bu hataları iki başlık altında toparlamaya çalıştık:

Kodlama hataları:

* Arabellek Taşması
1. “String” formatındaki taşma açıklıkları
2. One-stage saldırıları

* Race açıklığı – Yazılım çıktısının, kontrol dışı girdilerin zamanlamasına bağlı olduğu durumlarda ortaya çıkan açıklık
* Güvenli olmayan çevre değişkenleri
* Güvenli olmayan sistem çağrıları – System() gibi
* Güvenilmez girdi problemler

Mimari hatalar

* Kriptografinin doğru kullanılmaması
* Tasarım problemlerinin bölümlendirilmemesi
* Öncelikli fonksiyonların güvenliğinin sağlanaması
* Yetersiz denetim
* Kırık veya mantıksız erişim kontrolleri
* Metodların over-riding problemleri
* Çok fazla ve çeşitli kod imzalama

Yazılım tarafında yukarıda örneğini verdiğimiz şeylerin dışında daha birçok problem ortaya çıkabilir. Biz bir de saldırgan profiline ve saldırıyı gerçekleştirmek için kullandıkları tekniklere göz atalım.

Her şeyden önce, genel geçer bir kural olarak yıkmanın yapmaktan çok daha kolay olduğu aşikârdır. Yukarıda da ifade ettiğimiz gibi tam anlamıyla güvenli bir yazılım geliştirmek mümkün değildir. Ancak saldırganları ve saldırı metotları tanınırsa bunlara karşı önlem almak kolaylaşacaktır.

Yazılım güvenliği programında saldırganlarla alakalı her zaman akılda tutulması gereken şey, saldırganların yazılımdaki bugları da, eksiklikleri de, mantık hatalarını da eşit etkinlikte kullanabilecekleridir. Saldırganlar yazılımlara çok hâkimdirler; yazılımları kırmak için yazılım geliştirirler. Bunun karşısında savunmadaki insanlar, özellikle network tarafındaki güvenlik profesyonellerinin bu konuda eksik kalmaktadırlar.

Saldırganların kullandığı birçok alet ve metot vardır. Bunlar kısaca:,

* "Disassembler”lar ve “decompiler”lar

1. Saldırı için kaynak kodu gerekli değildir
2. İkili kod, kaynak kodu kadar kolay anlaşılabilir
3. Tersine mühendislik yaygındır. Anlaşılması gerekir(Yasaklamak değil)

* Kontrol akışı ve bunu ortaya çıkartan aletler

1. Girdinin yazılım içindeki akışını incelemek mükemmel bir saldırı metodudur
2 .Versiyonlar arasındaki farklar açıklık nedenidir

* APISPY32
* Breakpoint belirleyicileri ve izleme araçları
* Arabellek taşırma

1. Statik analizle açıklıklar ve hedefler tespit edilir
2. Yazılım kontrol akışı, heap saldırıları, stack kırma ve ark enjekte metotlarıyla değiştirilmesi

* Shell kodu

1. Arabellek taşırma için payload sokuşturma
2. XOR güvenlik açıklıklarını kullanma
3. Nerdeyse tüm genel mimariler için payload’lar mevcuttur(X86, RISC..)

Rootkitler

1. Rootkit saldırıların gelebileceği en son nokta olarak özetlenebilir. Yazılımdan yola çıkılarak tüm sistem ele geçirilebilir
2. Çekirdek seviyesinde çalışır
3. İşleme tablolarına girişi kontrol ederek dosya ve dizinleri saklayabilir
4. Network üzerinden erişim ve kontrol sağlayabilir

BİZE DÜŞEN

Güvenli yazılım üretmek, güvenli yazılım yaşam döngüsü ile alakalı olan tüm partilerin sorumluluğu altında olmalıdır. Bu sorumlular aşağıdaki figür 1’de de görüleceği üzere çok geniş bir spektrumu kapsamaktadırlar:


Figür 1: Güvenli yazılım hayat döngüsü paydaşları – Kaynak: Mano Paul ISC White Paper

Güvenli yazılım için yapılması gerekenleri, anlaşılmasını kolaylaştırma adına, rollere göre iki başlık altında toplamak istiyoruz:

Yönetim tarafı

Yöneticiler(proje yöneticileri, sistem yöneticileri, denetçiler vs.), herhangi bir işin altına girmeden önce güvenli tasarım konusunda eğitim ve farkındalığı oluşturmak zorundadırlar. Bu vazifeyi 3 aşamada inceleyebiliriz:

Temel Seviye

* Güvenliğin teknik boyutu hususunda farkındalık yaratmak:

1. Bunun için yazılım geliştirme ekibinin tamamını temel güvenlik doneleri konusunda eğitmek ve güvenliğin yazılım geliştirmenin her anında akılların bir köşesinde yer tutmasını sağlamak gereklidir.

* Prosedürlerin ve standartların hazırlanması

1 .Güvenliğin teknik boyutunda takip edilmesi gereken prosedürler yazılımcılara sağlanmalı ve yöneticiler bu prosedürlerin anlaşılıp uygulandığını kontrol etmelidirler.

Orta Seviye

* Rol-bazlı uygulama güvenliği

1. Yöneticiler, geliştirmenin tüm evrelerinde roller ve erişim kontrollerin nasıl dağıtılacağı hususunda yazılımcılara metodoloji ve yol haritası oluşturmalıdırlar

* Yazılımcı takımları içindeki güvenlik sorumluları

1. Her proje için ana vazifesi güvenlik olan sorumlular belirlenmeleri. Bunlara dikkat etmeleri gereken hususlarda yol haritaları verilmeli. Bu sorumlulara check-listler vererek işleri kolaylaştırılmalı.

İleri Seviye

* Güvenlik destek portali
* Rol-bazlı denetim ve sertifikasyon işlemleri

Yukarıda bahsi geçen eğitim ve farkındalığı sağlamak için(ve elbette sonrasında güvenli yazılım geliştirmek için) sıfırdan ortaya prosedür ve standart koymak boşuna efor ve zaman kaybı olacaktır. Bunun için şu anda endüstri standardı olan güvenli yazılım yaşam döngüsü(GYYD) çerçevelerini kullanmakta fayda vardır.

Elbette bu konuda birçok değişik ürün olsa da şu anda yazgın olarak kullanılan üç tane GYYD’nden bahsetmek mümkündür. Bunlar:

* OWASP’ın belirlediği Comprehensive Lightweight Application Security Process(CLASP)

1. Yaygın olarak kullanılan açık kaynaklı bir çerçevedir. 2008’de ASVS(Application Security Verification Standard) isimli bir standart yayınlamışlardır. Özellikle web uygulamalarında kullanılır. Bir diğer açık kaynaklı çerçeve OPENSAMM(open software assurance maturity model)’dir.

* Microsoft Security Development Life Cycle(SDL)

1. Microsoft’un belirlediği ve özellikle kendi yazılımlarında kullandığı çerçevedir. İddialarına göre kendi bu çerçeveyi kullanarak MS Vista, 7 ve 8 işletim sistemlerinde büyük oranda güvenliği oluşturmuşlardır. Ancak kullanımı zor bir çerçeve olarak öne çıkar. Güvenlik uzmanlarından şu alıntıyı yaparak konuyu özetleyebiliriz: “SDL uygulanmayan yazılım güvensizidir, ancak SDL’i Microsofttan başka uygulamayı becerebilen olmadığı için tüm yazılımlar güvensiz diyebiliriz.”

* Cigital BSIMM(Build security in maturity model)

1. Cigital ve Fortify(Daha yeni HP satın aldı bu firmayı) tarafından en son 4. Sürümü 2012 çıkartılmış GYDD’dir.

Yukarıda saydığımız tüm GYDDler değişik metotlar izleseler de ortak amaçları yazılımın en baştan en sona(End to end) güvenli bir biçimde yaratılmasını sağlamaktır. Bu süreci aşağıdaki figür ikide özetlemeye çalıştık:


Figure 2: Güvenli Yazılım Yaşam Döngüsü ortak süreci (Kaynak: OWASP TR)

Yazılımcı tarafı

Yazılımcıların spesifik olarak dikkat etmeleri gereken konuları süreç içindeki aşamalara göre inceleyecek olursak:

Dizayn:

* Tehdit modelleme ve risk analizi sonuçlarını yazılım tasarımda dikkate almak
* Proje takımı içinde güvenli tasarım konusunda beyin fırtınası yapmak
* Güvenli kripto ve protokol kütüphanelerini önceden belirlemek

Geliştirme

* Güvensiz fonksiyon kullanımını minimize etme
1 .Mesela: strcpy, strcat, scanf, sprint, gets aileleri

* Son sürüm derleyiciler kullanma
1. Versiyon farkları açıklı nedenidir!

* Statik ve dinamik analiz aletleri kullanma
1. Saldırganlarında bunları kullandığı unutulmamalı

* Elden(manuel) kod incelemesi
1. Özellikle kritik girdi-çıktı noktalarında

* Girdi ve çıktıların denetlenmesi
* Anti-XSS kütüphanelerin kullanılması
* Standart veri formatlarının kullanılması
* Dinamik SQL için String bitiştirmedin kaçınılması
* Zayıf kriptonun elenmesi

1. Örneğin gömülü şifreler ve anahtarlar, MD4, MD5, SHA1, 128 bitten düşük simetrik anahtarlar, RC4 ve ARC gibi stream şifreleme metotlar, ECB gibi blok şifreler

* Loglama ve takip sistemleri kullanılması

Yukarıda GYYD kısmında da ifade edildiği gibi Testler güvenli yazılım geliştirmenin çok önemli bir parçasıdır. Endüstride yeni yeni standart olmaya başlamış olsa da FUZZ testi ihmal edilmemelidir.

Güvenli yazılım programı dâhilinde yukarıda ifade edilen yol haritası içselleştirdikten sonra, bu sistemin ülkemiz faydası adına nasıl genele yayılabileceği ve standart haline getirilebileceği konusunda yapılacak çalışmaları şu şekilde gruplayabiliriz:

* Güvenli Yazılım Yaşam Döngüsünü, kullanılan IEEE 12207 standartları içerisinde tanımlayıp hakemli ve standart namzedi Türkçe doküman oluşturmak.

* Yukarıdaki dokümanı oluşturma aşamasında endüstri de bu konuda çalışan özel firmalardan fikir almak. İleride konu hakkında toplantılar tertip etmek.

* Hazırlanan doküman üzerinden kontrol listesi ve yol haritası oluşturmak.

* Doküman onaylandıktan sonra öncelikle kamu için ama genelde tüm kritik projeler için bu standarda uyumu zorunlu hala getirmek.

* Güvenli yazılım hakkında ülke geneli konferans tertip edip farkındalığı artırmak

* Oluşturulan bu yol haritasını temel alarak eğitim dokümanları hazırlamak ve kurumsal eğitimler vermek.

* Eğitim verecek kapasitede insan gücü yetiştirmek. Bu uzmanların yetenek ve başarılarını ölçücü kıstaslar koymak ve sertifikalandırmak.

* Kamunun güvenli yazılım projelerine danışmanlık

0 yorum :

Yorum Gönder