Kod Analizi

İnternetin ve mobil cihazların kullanımının yaygınlaşması ile geliştirilen yazılımlar artmıştır. Bu nedenle günümüzde yazılım güvenliğinin önemi giderek artmaktadır. Bilişim güvenliği ihlalleri genellikle yazılım üzerinden olmaktadır. 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 nedenle geliştirilen yazılımların istenilen gereksinimleri yapmasının yanında güvenli olması da gerekmektedir. Yazılımın güvenli olması demek ise; yazılımın uygun güvenlik özelliklerine sahip olması ve yazılım geliştirme sürecinin sağladığı güvencenin beklenen seviyede olması demektir.

Bir yazılım uygulamasının güvenlik analizini yapmak için otomatik tarama, manuel ve otomatik güvenlik testleri, statik analiz ve manuel kod inceleme gibi teknikler vardır. Tabii ki, bu tekniklerin kör noktaları, güçlü ve zayıf yönleri vardır. Her yazılım uygulaması farklıdır. Bu nedenle uygulamada güvenliği sağlamak için en uygun maliyet tekniklerini kullanarak “birleşik”yaklaşımı uygulamak doğru bir tercih olacaktır.

Bu çalışmada da güvenli yazılım geliştirme sürecinde yer alması gereken kaynak kod analizinden bahsedilecektir.

Kaynak Kod Analizi

Bir yazılımı çalıştırmadan yazılımın kaynak kodunda yer alan olası hataları bulmak ve yazılımın kodlama kurallarına uygunluğunutest etmek için kullanılan yöntemler statik kod analizi olarak adlandırılır. Kaynak kod analiziyle yazılım geliştirme sürecinde kodun yazılım açısından uygunluğuna ve mantıksal açıdan doğruluğuna bakılmaktadır. Ayrıca kaynak kod analiziyle yazılım bileşenleri güvenli yazılım geliştirme kuralları açısından da incelenmekte ve yazılım için zafiyet oluşturacak içerikler temizlenmektedir. Statik kod analiz biçimi, yapısı, içeriği veya belgelerine dayalı bir sistem veya bileşen değerlendirilmesi sürecidir.

Güvenli bir kod incelemesi yedi güvenlik mekanizmasına veya alana odaklanmaktadır. Güvenli bir kod incelemesi bu alanların her birinde kaynak kodunun sağlamlığı konusunda yazılım geliştiricileri bilgilendirmelidir:

  • Doğrulama

  • Yetkilendirme

  • Oturum yönetimi

  • Veri doğrulama

  • Hata işleme

  • Loglama

  • Şifreleme

Kaynak kod analizi iki yöntemle uygulanmaktadır.

  1. Göz ile tarayarak
  2. Otomatik araçlar

Göz ile Tarayarak Statik Kod Analizi

Kaynak kodun doğrudan göz ile taranması yolu ile analiz edilmesidir. Bu analiz türünde analizi yapan kişinin yazılım konusunda tecrübeli olması ve analiz ettiği yazılım dilini iyi bilmesi gerekmektedir. Kod analizi zafiyete neden olabilecek kod açısından bakılır. Ayrıca kaynak kodun içinde saldırganın işine yarayacak bilgilerin bulunup bulunmadığı konusunda analiz yapılır. Örneğin veri tabanına bağlanma parolasına kod içerisinden ulaşılamaması gerekmektedir. Statik kaynak kod analiziyle verinin izlediği yol boyunca ne tür kontrollerden geçirildiği, güvenlik açısından sakıncalı bulunan işlevlerin kullanılıp kullanılmadığı gibi birçok açıdan incelenmektedir.

Otomatik Araçlarla Statik Kod Analizi

Otomatik araçlarla yapılan statik kod analizi ise bir araç yardımı ile aracın doğrudan kod üzerinde çalışarak güvenlik açısından riskli gördüğü kodları göstermesidir. Bu araçların bir kısmı açık kaynak kodlu ücretsiz bir kısmı ise firmalar tarafından geliştirilen ücretli ürünlerdir.

Modern statik analiz araçları; daha çabuk, güvenilir ve düşük bir maliyetle uygulamanın zafiyetlerini ortaya çıkarmasından dolayı göz ile tarayarak yapılan statik analizlerine göre daha çok tercih edilmektedir. Kod içerisindeki zafiyetlerin tespiti erken olacağı için düzeltmesi de erken olacaktır. Kritik zafiyetler için yamalar oluşturmak hem hızlı hem de ucuza mal olacaktır. Şekil- 1görüldüğü gibi zaman ve kaynak açısından büyük miktarda tasarruf sağlayacaktır.

resim-1.png

Şekil- 1: Tespit edilme sürecine göre hata giderme maliyeti

Statik Kaynak Kodu Analiz Teknikleri

Statik kaynak kodu analiz için çeşitli teknikler vardır. Bu teknikler, çoğu zaman derleyici teknolojilerinden türetilmiştir.

Veri Akış Analizi (Data Flow Analysis)

Programların veri-akış analizi gerçekleştirmek için basit bir kontrol akış diyagramıdır. Her düğüm için veri-akış denklemleri kurmak ve tüm sistemi dengelemek için tekrar tekrar her düğüm için girdi çıktı hesaplayarak sistemi dolaşmasıdır. Veri akışı analizi bir işlemin her noktasında özel bilgi elde etmek için çalışır. Genellikle, temel blok noktalarında bilgileri hesaplamak daha kolay olduğu için, temel blok sınırları bu bilgiyi elde etmek için yeterlidir.

Temel Blok (Basic block): Ardışık talimatlar dizisi kontrolüdür. Bir blok başında girer, kontrolü bir blok sonunda bırakır. Bloku durdurmak olmaz.

PHP temel blok örneği:

1. $a = 0;

2. $b = 1;

3.

4. if ($a == $b)

5. { # blok başlangıcı

6.   echo “a ve b aynı”;

7. } # blok bitişi

8. else

9. { # blok başlangıcı

10. echo “a ve b farklı”;

11.} # blok bitişi

Kusur Analizi (Taint Analysis)

Kusur analizi de Kullanıcı Girişi Bağımlılık Denetleme olarak bilinir. Perl ve Ruby gibi bazı programlama dillerinin kendi yerleşik kusur denetimi vardır. Kusur analizinin ardındaki ana fikir, kullanıcı tarafından (doğrudan veya dolaylı) değiştirilebilir herhangi bir değişkenin bir güvenlik açığı oluşturup oluşturmayacağına bakmaktadır. Kullanıcı kontrol girişi ile ‘kusurlu’ olan hassas fonksiyonlar izler. Kusurlu değişken ilk dezenfekte geçemezse bir güvenlik açığı olarak işaretlenir. Çünkü farklı işlemler yoluyla kusurlu bir değişken bir güvenlik ihlali oluşturabilir. Tehlikeli komutları çalıştırmak için kullanılabilir. Kusur analizi dinamik ve statik kusur analizi olmak üzere ikiye ayrılır.

Sözcük Analizi (Lexical Analysis)

Sözcük Analizi kaynak kodu soyut kaynak kodunu daha kolay işlemek için simge halinden bilgiye dönüştürür. Kodu alt parçalara ayırma işlemidir. Örneğin Php web programlama dilinde sözcük (lexical) analizi yapılırken iki fonksiyon kullanılır:

  • token_get_all

  • token_name

token_get_all foksiyonu kodu alt parçalara ayırmamızı sağlar.

array token_get_all(string $source) şeklinde kullanılır.

Kodu çalıştırdığımız da şöyle bir çıktı alınır.

Array ( [0] => Array ( [0] => 368 [1] => 1 )   [1] => Array ( [0] => 316 [1] => echo [2] => 1 )   [2] => ; [3] => Array ( [0] => 371 [1] => [2] => 1 )   [4] => Array ( [0] => 370 [1] => ?> [2] => 1 )   )

Fonksiyon bir dizi olarak geri dönüyor.

Dizinin parçalarını incelemek için token_name fonksiyonunu kullanılır.

string token_name(int $token) şeklinde kullanılır.

token_name fonksiyonu aşağıdaki gibi sonuç döndürür:

T_OPEN_TAG ==> <?php, <? or <%

T_ECHO ==> echo

T_WHITESPACE ==> \t \r\n

T_CLOSE_TAG ==> ?> or %>

Kaynak Kod Analizinin Yazılım Güvenliğine Etkisi

Kaynak kod analizi süreci uzun ve zorlu bir süreçtir. Özellikle göz ile taranarak yapılan kaynak kod analizi proje büyük ve iş akış süreci karmaşık ise süreci daha da zorlaştırmaktadır. Fakat klasik güvenlik kontrolleri ile ortaya çıkarılması zor olan güvenlik zafiyetleri kaynak kodların detaylı bir şekilde incelenmesi ile bulunabilmektedir.

Kaynak kod analizi yazılımın herhangi bir aşamasında yapılabilir. Fakat yaygınlaştırma (deployment) aşmasından önce yapılması güvenlik açıklarını ve kalite kusurlarını tespit etmek ve düzeltmek için yararlı olacaktır. Bu işlem maliyet ve zaman açısından da tasarruf sağlayacaktır. Ayrıca Waterfall Sistem Geliştirme Yaşam Döngüsüne göre yazılım geliştirmenin son aşamasında güvenlik kod analizinin yapılması gerektiği belirtilmektedir. Çevik Güvenlik Metodolojisine göre ise yayınlanma (deployment) yani uygulama kullanılmaya başlanacağı zaman güvenlik kod analizinin yapılması gerekmektedir.

Statik kod analizi sürecinde yazılımcının geliştirdiği kaynak kodundaki zafiyetleri görmesi ve bu zafiyetleri düzeltmesi ile birlikte yazılımcı tecrübe kazanmış olmaktadır. Bu şekilde yazılımcı eksiklerini görmüş ve bunları giderme konusunda eğitilmiş olacaktır. Kaynak kod analizinde ister göz ile taranarak yapılsın ister otomatik araçlarla yapılsın risk sıfır düzeyine indirilememektedir. Mantıksal zafiyetler ve uygulamanın yaygınlaştırıldığı ortamlardaki zafiyetlerin tespiti için karakutu ve sızma testleri toplam güvenliğin sağlanması açısından gözardı edilmemelidir.