Posted on February 1st, 2012

Üretilen yazılımların yeni-nesil tehditlere maruz kalması sebebiyle ortaya çıkan sorunlar kişileri/kurumları kesin çözümler aramak zorunda bırakmıştır. Kod analizi de bu süreçte büyük bir pay sahibidir.

Nedir bu kod analizi(Statik kod analizi)?

Bir yazılımı çalıştırmadan hatalarını bulmak ve kodlama kurallarına uygunluğunu test etmek için kullanılan yöntemlerdir.

ikiye ayrılır:

  1. El yordamı ile(manuel)
  2. Otomatize araçlar ile

Manuel tekniklerle statik kod analizi nasıl yapılır?

Manuel SKA’i için php web programlama dilini tercih ettim. Bu tercihimin sebebi php kodlarının(spagetti) büyük bir bölümünün Top10 açıklarını(sql injection, xss vb gibi..) içermesidir.

Dilin yapısını iki ana başlık altında inceleyeceğiz:

  • lexical
  • syntactic/semantic

    Lexical Analiz

Kodu alt parçalara ayırma işlemine lexical analiz denir. Php web programlama dilinde lexical analiz yaparken kullanacağımız 2 fonksiyon olacak:

  • token_get_all
  • token_name

token_get_all fonksiyonu: Kodu alt parçalara ayırmamızı sağlayacak.

Kullanımı:

array token_get_all( string $source)

şeklindedir.

 

 

 

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

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 bize dizi olarak geri dönüyor. Dizinin parçalarını incelemek için token_name fonksiyonunu kullanacağız.

Kullanımı:

string token_name(int $token)

şeklindedir.


token_name fonksiyonunun döndürdüğü anahtarların karşılıklarına bakalım:

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

T_ECHO ==> echo

T_WHITESPACE ==> \t \r\n

T_CLOSE_TAG ==> ?> or %>

Diğer anahtarlara Php manuel’den ulaşabilirsiniz.

http://www.php.net/manual/en/tokens.php

 

Syntactic/Syntax analiz(sözdizimsel/anlambilimsel analiz)

 

Dili, anlam bütünsel olarak çözümlemek için kullanılan yöntemlerdir.

Bunun için php lint-mode özelliğini kullanacağız. İlk olarak Linux’da uçbirim ekranını açıyoruz.

(not: syntax error almak için kodu yanlış yazdım.)

“php -l test.php” komutunu kullanarak hangi satırda syntax hatası aldığımızı görebilirsiniz.

 

Dilin yapısını incelememize yardımcı olacak diğer komut ise “grep” tir. İstediğimiz bir kod parçasını, dosyanın içinde bulmamıza yarar.

İlk olarak zaafiyet barındıran basit bir php kodu yazalım ve uçbirim ekranını açalım.

 

 $_GET global değişkenine hiçbir filtre uygulamadan olduğu gibi yazdık ve  XSS açığı oluşturduk. “cat” komutuyla test.php’nin içeriğini görüntüledik.

Daha sonra, grep komutuyla test.php içinde “$_GET” değişkenini arattık. Açık olma ihtimali olan kod parçalarını kırmızı renkte ekrana bastı. -Kodun satır sayısına göre kırmızı alanlar artabilir-

 

Otomatize araçlarla statik kod analizi nasıl yapılır?

 

Denemelerimize rips 0.51 – Çok yakın bir tarihte yenilendi – web tabanlı otomatize statik kod aracı ile devam ediyoruz.

Arayüzü oldukça başarılı bir uygulama; ayrıca Html5 ile desteklenmiş özellikleri de var. Şuan sadece spagetti kod analizi yapıyor; fakat geliştiricisinin söylediği kadarıyla yakın zamanda oop desteği de eklenecekmiş. Kullanımından biraz bahsedecek olursak:

  1. Dosya yolunu belirtin.
  2. Verbosity level’i seçin -önerilen 1. seçenek-
  3. Vuln type ‘ı belirleyin.
  4. Scan tuşuna basın.

 

Karşınıza şöyle bir ekran gelecek:

 

 

Rips 2 farklı açık tespit etti.

Sql injection vs Cross-site Scripting

 

 

 

Get help ikonuna tıklayarak açık hakkında ayrıntılı bilgiye ulaşabilirsiniz.

 

“Generate exploit” ikonunu tıklayarak açığın istismar kodunu(exploit) oluşturabilirsiniz.

 

Aşağıdaki bağlantıdan rips 0.51’in dosyalarına ulaşabilirsiniz:

http://sourceforge.net/projects/rips-scanner/files/

 

 

Güvenli Günler…

Evren Yalçın – SignalSEC


One Comment

Reply