Journal of the Faculty of Engineering and Architecture of Gazi University 34:4 (2019) 1695-1704
A novel approach for analyzing buffer overflow vulnerabilities in binary executables by
using machine learning techniques
Gürsoy Durmuş1*
, İbrahim Soğukpınar2
HAVELSAN Naval Warfare Management Systems Technology Center., İstanbul, 34890, Turkey
Department of Computer Engineering, Gebze Technical University, Kocaeli, 41400, Turkey
1
2
Highlights:
A new method for
analysis
of
buffer
overflow vulnerability in
binary executables
The use of machine
learning techniques in
buffer
overflow
vulnerability analysis
High performance values
Graphical/Tabular Abstract
Keywords:
Software security
Software vulnerability
Machine learning
Buffer overflow
Figure A. System architecture
Article Info:
Research Article
Received: 29.12.2017
Accepted: 21.12.2018
DOI:
10.17341/gazimmfd.571485
Correspondence:
Author: Gürsoy Durmuş
e-mail:
gdurmus@yahoo.com
phone: +90 532 478 9458
Purpose:
While evaluating whether a software is secure or vulnerable with traditional methods; examination of security
requirements, source code analysis and software security testing activities can be performed. In many cases,
these activities cannot be performed by the end user due to not exist documentation of security related
requirements, absence of source codes and need to expert security testing teams. When the software is in binary
executable file format, we need expert systems, which accept just only binary executables as inputs to enable
security analysis on end-user side.
Theory and Methods:
In this study, we present a new method and its success, which is developed by using machine learning
techniques to be used in the buffer overflow vulnerability analysis of binary executable formatted software
applications. The main theory of the study as follows:
H-1: In binary executable file format software with buffer overflow vulnerabilities, there are similarities
between the distributions and sequences of binary operation codes used for branching, looping, register value
update, memory value update, stack operations, and system calls.
Results:
Experimental results on existing data sets indicate that PE formatted executables can be classified as vulnerable
or secure by machine learning techniques based on opcode sequences and distributions. In particular, the high
performance rates (95% TPR) obtained by KNN, Naïve Bayes, Hoeffding Tree, K-Star and Random Tree
algorithms indicate that these algorithms are appropriate classification algorithms for vulnerability analysis.
Conclusion:
The study shows that the machine learning approach can be used to perform buffer overflow vulnerability
analysis in binary executable files.
Journal of the Faculty of Engineering and Architecture of Gazi University 34:4 (2019) 1695-1704
Makine öğrenmesi teknikleri ile ikili yürütülebilir dosyalarda arabellek taşması zayıflığı
analizi için yeni bir yaklaşım
Gürsoy Durmuş1*
, İbrahim Soğukpınar2
HAVELSAN Deniz Savaş Yönetim Teknolojileri Merkezi, P.K.: 11 34890, Pendik, İstanbul, Türkiye
2
Gebze Teknik Üniversitesi, Bilgisayar Mühendisliği Bölümü, 41400, Gebze, Kocaeli, Türkiye
1
Ö N E Ç I K A N L A R
İkili yürütülebilir dosyalarda arabellek taşması zayıflığı analizi için yeni bir yöntem
Arabellek taşması zayıflığı analizinde makine öğrenmesi tekniklerinin kullanımı
Yüksek başarım değerleri
Makale Bilgileri
Araştırma Makalesi
Geliş: 29.12.2017
Kabul: 21.12.2018
DOI:
10.17341/gazimmfd.571485
Anahtar Kelimeler:
Yazılım güvenliği,
yazılım güvenliği zayıflığı,
makine öğrenmesi,
arabellek taşması
ÖZET
Bir yazılım öğesinin güvenlik zayıflığı içerip içermediğinin analizi yazılımın güvenli olup olamadığına karar
vermede belirleyici bir unsurdur. Geleneksel yöntemler ile bir yazılımın güvenli olup olmadığı
değerlendirilirken; yazılıma ait güvenlik gereksinimlerinin incelenmesi, kaynak kod analizi ve yazılım
güvenlik test faaliyetleri icra edilebilir. Bu faaliyetler sırası ile yazılım ile ilgili gereksinimlerin
belgelendirilmiş olması, yazılım kaynak kodlarının mevcut olması ve yazılım güvenliği konusunda uzman
test ekiplerine olan bağımlılıkları nedeni ile çoğu zaman son kullanıcı tarafından tekrarlanamayan
faaliyetlerdir. Söz konusu yazılım ikili yürütülebilir dosya formatında olduğunda, son kullanıcı tarafında
güvenlik analizlerinin yapılabilmesi için sadece ikili yürütülebilir dosyanın girdi olarak kullanılabileceği
sistemlere ihtiyaç duyulmaktadır. Bu çalışmada, ikili yürütülebilir dosya formatlı yazılımların arabellek
taşması güvenlik zayıflığı analizinde kullanılmak üzere makine öğrenmesi teknikleri kullanılarak geliştirilen
yeni bir yöntem ve başarımı sunulmuştur
A novel approach for analyzing buffer overflow vulnerabilities in binary executables by
using machine learning techniques
H I G H L I G H T S
A new method for analysis of buffer overflow vulnerability in binary executables
The use of machine learning techniques in buffer overflow vulnerability analysis
High performance values
Article Info
Research Article
Received: 29.12.2017
Accepted: 21.12.2018
DOI:
10.17341/gazimmfd.571485
Keywords:
Software security,
software vulnerability,
machine learning,
buffer overflow
ABSTRACT
While evaluating whether a software is secure or vulnerable with traditional methods; examination of
security requirements, source code analysis and software security testing activities can be performed. In
many cases, these activities cannot be performed by the end user due to not exist documentation of security
related requirements, absence of source codes and need to expert security testing teams. When the software
is in binary executable file format, we need expert systems, which accept just only binary executables as
inputs to enable end-user side security analysis. In this study, we present a new method and its success, which
is developed by using machine learning techniques to be used in the buffer overflow vulnerability analysis
of binary executable formatted software applications.
Sorumlu Yazar/Corresponding Author: gdurmus@havelsan.com.tr, ispinar@bilmuh.gyte.edu.tr / Tel: +90 216 494 3314
*
1696
Durmuş ve Soğukpınar / Journal of the Faculty of Engineering and Architecture of Gazi University 34:4 (2019) 1695-1704
1. GİRİŞ (INTRODUCTION)
Siber saldırıların her geçen gün daha da yoğun yaşandığı
günümüzde,
yazılımlar
birer
silah–hedef
olarak
kullanılmaya başlandı. Farklı kazanımlar peşinde olan
bireysel, ekip veya kurumsal profilli saldırganlar öncelikle
hedef yazılımlardaki zayıflıkları tespit etmeğe ardından da
ilgili zayıflıkları sömürerek amaçlarına ulaşmaya çalışırlar.
Siber saldırılar en masum hali ile eğlence amaçlı
gerçekleştirilmiş olsa da sonuçları itibari ile bireysel,
kurumsal ve hatta ulusal maddi zararlarla ve itibar
kayıplarına neden olmaktadır. Yazılımlardaki zayıflıkların
erken tespiti, hem siber saldırıların başarım oranını
düşürecek hem de doğacak zararların azalmasını
sağlayacaktır.
Yazılım zayıflık analizi için geleneksel yöntemlerden;
yazılıma ait güvenlik gereksinimlerinin incelenmesi, kaynak
kod analizi ve yazılım güvenlik test faaliyetleri tercih
edilebilir. Ancak yöntemlerin uygulanabilmesi için gerekli
ön koşullar çoğu kez sağlanmamaktadır. Örneğin; analiz
edilecek yazılıma ait güvenlik gereksinimlerine, yazılım
kaynak kodlarına ve uzman güvenlik test ekiplerine olan
bağımlılıklar nedeni birçok yazılım için güvenlik analizleri
üstünkörü yapılmaktadır. Yaygın kullanılan yazılımlar için,
zayıflık veri tabanları ilgili bilişim güvenliği uzmanları
tarafından taranmakta ve yayınlanan yamalarla güvenlik
sağlanmaya çalışılmaktadır. Bu şekilde yürütülen bilgi
güvenliği faaliyetleri sıfır gün saldırıları bir yana, ilgili
yamalar uygulanıncaya kadar sömürülmeye açık halde bilgi
güvenliğini riske etmektedir. (Şekil 1)
Gerek kamu gerekse kurumsal yazılım temininde, ilgili
yazılımlar için güvenlik analizlerinin yapılması ve yazılım
türüne özgü en çok bilinen ve sömürülen güvenlik
zayıflıkları analiz edilmelidir. Söz konusu yazılım ikili
yürütülebilir dosya formatında olduğunda, sadece ikili
yürütülebilir dosya girdisi ile güvenlik analizlerini
yapabilecek uzman sistemlere ihtiyaç duyulmaktadır.
İkili yürütülebilir dosya formatlı yazılımlarda en sık
sömürülen güvenlik zayıflıkları:
Yığın arabellek taşma zayıflığı,
Çalışma esnasında kötücül komut enjeksiyon zayıflığı ve
Yürütülebilir yetkiye sahip veri alanı zayıflığı olarak
sıralanabilir.
İkili yürütülebilir dosya formatlı yazılımlar işletim sistemi
mimarisine bağlı olarak farklı yapılara sahiptirler. Windows
tabanlı işletim sistemleri “Taşınabilir-Yürütülebilir” (PE:
Portable Executable) formatını desteklerken, Unix/Linux
türevi işletim sistemleri “Yürütülebilir ve Bağlanabilir
Biçimli” (ELF: Executable and Linkable Format) formatlı
yazılımları desteklemekte ve çalıştırabilmektedirler.
Bu çalışmada; PE formatlı yazılımların “yığın arabellek
taşma” zayıflığına karşı güvenli veya zayıf olarak
sınıflandırılması için makine öğrenmesi tekniklerine dayalı
yeni bir yöntem ve başarımı sunulmuştur.
Makalenin geri kalan kısmı şu şekilde düzenlenmiştir:
Bölüm 2’de mevcut çalışmalar özetlenmiştir. Bölüm 3’te
önerilen yöntem açıklanmıştır. Bölüm 4’te yöntemin
gerçeklemesi ve başarım değerlendirmesi yapılmıştır. Bölüm
5’te sonuçlar ve öneriler paylaşılmıştır.
2. İLGİLİ ÇALIŞMALAR (RELATED WORKS)
Yazılım güvenliği için farklı tanımlar yapılmış olmasına
karşın, en genel anlamda; “yazılımın saldırılara ve art niyetli
kullanımlara karşı korunaklı/dirençli olması için sahip
olması gereken gereksinimler bütünü” olarak tanımlamak
mümkündür [1]. Yazılım güvenliği; yazılım geliştirme süreç
başlangıcı diyebileceğimiz gereksinimlerin belirlenmesi
safhasından itibaren göz önüne alınması gereken ve yazılım
geliştirme yaşam döngüsünün her bir safhasında korunması
gereken bir özellik olarak karşımıza çıkmaktadır.
Hiç kuşkusuz geliştirilen her yazılımda fark edilmiş ya da
fark edilmemiş/edilememiş birçok yazılım hatası olabilir. Bu
hatalara neden olan birinci unsur tasarım yanlışlıkları, ikinci
unsur ise hatalı kodlamalardır. Bir yazılım hatası, bilgi
güvenliği esaslarının ihlaline sebebiyet vermesi durumunda
(sunulan hizmeti engelleme, yetkisiz erişim sağlama veya
veri bütünlüğünü bozma) güvenlik zayıflığı olarak
nitelendirilebilir [2]. Bunların dışında, yazılıma dışarıdan
müdahale ile içeriğinde zayıflığa neden olacak
güncellemeler de zayıflık kaynağı olarak gösterilebilir. Bu
tür zayıflıklar kötücül yazılım tespit yöntemleri ile analiz
edilmektedir.
Yazılımlarda en sık rastlanan, güvenlik zayıflığına neden
olan hatalar sınıflandırılmış [1, 2] ve her biri için çözüm
yolları önerilmiştir. Genel olarak, güvenlik zayıflığı yaratan
yazılım hataları:
Arabellek taşmaları,
Girdi verilerinin denetlenmemesi,
Veri yarışları olarak karşımıza çıkmaktadır.
CVE (Common Vulnerabilities and Exposures) ve NVD
(National
Vulnerability
Database)
zayıflık
veri
tabanlarındaki zayıflıklar ve zayıflıkların önem derecesine
göre dağılımları incelenmiş, arabellek taşmalarının çok
yaygın olduğu ve önemli derecede yazılım güvenliği
zayıflıkları doğurduğu bildirilmiştir [3].
Arabellek taşmaları, başta programın istemsiz bir şekilde
sonlandırılmasına neden olmakla birlikte program akışının
değiştirilmesine,
hatalı
işlem
yapmasına
neden
olabilmektedir. Ayrıca, kod enjeksiyon zayıflığı da arabellek
taşmaları nedeni ile ortaya çıkan önemli bir zayıflıktır.
Özellikte veri sekmesinde yürütme yetkisi olan bir
yazılımda, saldırgan arabellek taşma zayıflığını tespit
ettikten sonra enjekte ettiği makine kodu komutları ile
1697
Durmuş ve Soğukpınar / Journal of the Faculty of Engineering and Architecture of Gazi University 34:4 (2019) 1695-1704
program akışını değiştirebilmekte ve yazılımın yetkileri ile
işlem yapabilmektedir [4]. 2001 yılında “Code Red”, 2003
yılında “Zotob” ve 2004 yılında etkili olan “Sasser”
solucanları arabellek taşma zayıflıklarını sömürerek hızla
yayılmış ve ciddi zararlar vermişlerdir. Arabellek
taşmalarının engellenmesi için kaynak kodun analiz
edilmesi, programlama diline özgü zayıflık yaratacak işaretçi
aritmetiği
kullanan
fonksiyonların
kullanımından
kaçınılması önerilmektedir [5].
Şekil 1. Yazılım güvenlik zayıflıkları dağılımı (Software
vulnerability distribution)
Veri yarışları, çok iş parçacıklı (multithreaded) yazılımların
servis hizmetinin aksamasına ve veri bütünlüğünün
bozulmasına neden olabilmektedir. Bu tip hatalardan
kaçınmak için kaynak kod analizlerinin yapılması,
yazılımının kaynak kod üzerinden kontrollü çalıştırılması
önerilmektedir. Olası veri yarışlarının çok ciddi sorunlara
neden olacağı değerlendiriliyorsa çalışma anında kontrol
altına
alınmaya
çalışılması
ve/veya
kaçınılması
önerilmektedir [6, 7].
Yazılım geliştirme yaşam döngüsü sürecinin en önemli
safhalarından biri olan “kodlama” aşamasında kaynak
kodlarının “statik kod analiz” araçları ile incelenmesi
yazılım güvenliğini artırıcı yöntemlerden biridir. Yapılan
çalışmalar, kaynak kod satır sayısının artmasına paralel
olarak güvenlik zayıflıklarının da arttığını göstermektedir [8,
9]. Kaynak kod denetiminin, kod gözden geçirme aktivitesi
olarak gözlemsel olarak yapılması hem proje süresini uzatma
hem de gözden kaçırma risklerini beraberinde getirmektedir.
Bu nedenle, kod analizinin otomatik yapılabilmesi için gerek
ticari gerekse açık kaynak kodlu birçok ürün geliştirilmiş ve
kullanıma sunulmuştur. Kaliteli bir statik kod analiz aracı,
yazılımdaki güvenlik zayıflıklarının ortaya çıkarılmasında
ve giderilmesinde kolaylık sağlamaktadır [10]. Statik kod
analizleri aynı zamanda kod kalitesini iyileştirme faaliyetleri
içinde çıktı üretmektedir. Yapılan çalışmalar, tasarım ve kod
kalitesi kötü olan yazılımlarda güvenlik açığının kod kalitesi
iyi olan yazılımlara oranla çok daha yüksek olduğunu ortaya
koymaktadır [11]. Kaynak koduna erişim sağlanamayan PE
formatlı yazılımların analizinde statik ve dinamik analiz
yöntemleri kullanılabilir. Statik analiz yönteminde, yazılım
bileşenleri yapısal incelenerek olası zayıflık ve anomali
tespitleri yapılmaya çalışılır. Dinamik analiz yöntemleri ile
1698
uygulama gerçek veya sembolik çalıştırılarak olası çalışma
yolları çıkarılır ve hafıza erişimleri gözlemlenir. Dinamik
analizler, uygulama davranışlarının gözlemlenmesi için izole
bir ortamda uygulamanın yürütülmesini gerektirmektedir
[12].
Tevis vd. [13, 14] yaptıkları çalışmada, PE formatlı
yazılımların statik analizlerini yaparak PE dosyalarında;
tablo büyüklüklerindeki tutarsızlıkları, sıfır ile doldurulmuş
geniş alanları, hem yürütülebilir hem de yazılabilir
bölümlerin tespitini ve arabellek taşmalarına neden olacak
C/C++ kütüphane fonksiyonlarının kullanımlarının tespitini
sağlayacak yöntem geliştirmişlerdir. FindSSV yazılım
aracını geliştirerek yöntemlerini 2700’den fazla 6 farklı
kategorideki (kurulum dosyaları, yazılım geliştirme
dosyaları, Windows XP işletim sistemi dosyaları, Microsoft
uygulama dosyaları, güvenlik uygulamaları) PE yazılım
bileşeni üzerinde sınamışlardır. Çalışmalarında PE
dosyasında yer alan her bir bölümün ve öğenin (DOS header,
MS-DOS stub, file header, optional header, section table,
symbol table, string table, import table) güvenlik zayıflığı ve
anomali
tespitinde
kullanılıp
kullanılamayacağını
değerlendirmişlerdir. Du Varney vd. [15], ELF formatlı
yazılımların güvenlik analizlerini kolaylaştıracak yeni
alanların ELF formatına eklenmesini önermişlerdir. Kaynak
kodun DEBUG kipinde derlenmesi durumunda güvenlik
analizlerine yardımcı bilgiler (veri tipleri, veri büyüklükleri,
fonksiyonların adresleri gibi) ELF dosyası içerisine
yazılmaktadır. Ancak, yazılımlar dağıtılırken RELEASE
kipinde derlenmekte ve bu bilgiler ELF dosyalarına
aktarılmamaktadır. Güvenlik analizlerinde özellikle verilerin
tipleri, büyüklükleri gibi bilgiler analiz süreçlerini
kolaylaştırdıklarından bu bilgilerin belli bir formatta
RELEASE
kipinde
derlenmiş
ELF
dosyalarına
yazılmalarının faydalı olacağı belirtilmiştir. Bunun için
derleyiciler üzerinde değişiklik yapılması gerekliliği
vurgulanmıştır. Analizcilerin işine yarayacak bu bilgilerin
saldırganlara
dayeni
fırsatlar
sunacağını
değerlendirmekteyiz. Ayrıca derleyicilerin bu yönteme göre
güncellenmesi gerekliliği teorinin pratiğe yansıtılmasında
bir engel olarak karşımıza çıkmaktadır.
Cova vd. [16] yaptıkları çalışmada, x86 işlemci mimarisinde
ELF formatlı ikili yürütülebilir dosyalarda zayıflık
analizlerini hem statik hem de sembolik çalıştırma
yöntemlerini uygulayarak tespit etmeğe çalışmışlardır. Cova
ve arkadaşları, “gördüğün (kod), çalıştırdığın değildir” [17]
prensibinden yola çıkarak kaynak kod ile birlikte ikili
yürütülebilir dosyaların da güvenlik zayıflığı analizlerinin
yapılması gerektiğini vurgulamışlardır. Çalışmalarında
C/C++ da güvenlik zayıflığına neden olan “system()” ve
“popen()” fonksiyonlarının kullanımının tespit etmeği
amaçlamışlardır. Yöntemlerini, geliştirdikleri yazılım aracı
ile gerçekleştirerek kullanıma sunmuşlardır. Ancak,
geliştirilen yöntem yüksek yanlış-pozitif sonuçlar
vermektedir. Carnegie Melon Üniversitesinden araştırmacı
Cha vd. [18], içerisinde DEBUG bilgisi bulunmayan ikili
yürütülebilir dosyalarda güvenlik zayıflığı ve bu zayıflığı
ortaya çıkaracak olan girdilerin belirlenmesi için yeni bir
Durmuş ve Soğukpınar / Journal of the Faculty of Engineering and Architecture of Gazi University 34:4 (2019) 1695-1704
yöntem geliştirmişlerdir. Yöntem, PE ve ELF formatlı
yazılımlar üzerinde sınanmış ve 29 adet zayıflık tespit
edilmiştir. Bu zayıflıklardan 2 tanesi daha önceden ifşa
edilmemiş zayıflıklardır. Yöntemde, kullanıcı girişlerine
bağlı hafıza işlemlerinin (load ve store) yapıldığı çalışma
yollarının tespit edilmesi ve zayıflığa neden olan girdinin
üretilmesi çözülmeye çalışılmıştır. Çalışma kapsamında
daha önce geliştirilen sembolik çalıştırma motorları (CUTE,
KLEE, SAGE, Mc Veto, AEG ve S2E) tasarım kararları
doğrultusunda değerlendirilmiş ve ihtiyaçlar belirlenmiştir.
Özellikle performans açısından etkili olan “daha önce
yapılan işlerin sonraki işlerde tekrar edilmemesi, tekrar
kullanılabilir olması” tasarım kararını hiçbir sembolik
çalıştırma motorunun sağlamadığı; yine birçok sembolik
çalıştırma motorunun da sembolik hafıza yönetimi
konusunda yetersiz olduğu ifade edilmiştir. Çevrimiçi (olası
bütün yürütme yolları kullanılarak) ve çevrimdışı (sadece bir
yürütme yolu üzerinden) sembolik çalıştırma yöntemlerinin
güçlü yanları esas alınarak hibrit bir sembolik çalıştırma
yöntemi benimsenmiştir. Yöntemde çevrimiçi ve çevrimdışı
sembolik çalıştırma yöntemleri durumsal değerlendirilip
geçiş yapıldığı için yürütme yollarının belirlenmesinde
yaşanan hafıza tüketme sorunu giderilmeye çalışılmıştır.
Araştırmacıların daha önceki çalışmalarını baz alarak
geliştirmiş oldukları yöntem hem zayıflık tespiti hem de
zayıflığa neden olabilecek girdinin üretilmesi açısından
oldukça başarılı bir çalışmadır.
Yapılan çalışmalar genel olarak değerlendirildiğinde,
önerilen yöntemlerde sınırlılıkların fazla olduğunu
görmekteyiz. Programlama dili, derleme kipi, geliştirme ve
kurulum ortamı, kullanılan çerçeveler, ağ protokolleri gibi
yazılımın karakteristiğini belirleyen her unsur, yazılım
güvenliği zayıflık analizinin yapılmasını zorlaştırmakta ve
karmaşıklığını üstel olarak artırmaktadır. Bu karmaşıklıktan
kurtulmak
için
çalışmalar
belirli
kısıtlamalarla
yürütülmüştür. Çalışmalardaki kısıtlamalar geliştirilen
yöntemlerin
diğer
durumlarda
uygulanabilirliğini
azaltmaktadır.
3. ÖNERİLEN YÖNTEM (PROPOSED METHOD)
3.1.Yöntemin Kurgulanması (Construction of The Method)
Bu çalışmada, ikili yürütülebilir dosya formatlı yazılımlarda
ikili işlem kod dağılımları ve dizilimleri makine öğrenmesi
teknikleri ile analiz edilerek yazılımın güvenli veya zayıf
olarak sınıflandırılması için yeni bir statik analiz yöntemi
geliştirilmiştir. Yöntem, aşağıda önerilen H-1 hipotezi
üzerine geliştirilmiştir. H-1: Güvenlik zayıflığı içeren ikili
yürütülebilir dosya formatındaki yazılımlarda dallanma,
döngü, yazmaç değer güncelleme, hafıza değer güncelleme,
yığın işlemleri ve sistem çağrıları için kullanılan ikili işlem
kodların dağılımları ve dizilimleri arasında benzerlikler
vardır.
H-1 hipotezinin sınanması için kurgulanan yöntem ve
yöntemin uygulandığı prototip sisteme ait süreçler ve sistem
mimarisi şekil 2’de sunulmuştur.
3.2. Yöntemin Matematiksel Modeli
(Mathematical Model of The Method)
İşlemci mimarisinin desteklediği ikili işlem kodları Eş. 1 ile
ifade edilir.
C={c1, c2, c3, …, cc}
(1)
Güvenlik zayıflığı içeren zayıf yazılım veri seti Eş. 2 ile ifade
edilsin.
V={v1, v2, v3, …, vv}
(2)
Güvenlik zayıflığı içermeyen güvenli yazılım veri seti Eş. 3
ile ifade edilsin.
S={s1, s2, s3, …, ss}
(3)
Veri setinin tamamı, Eş. 1 ve Eş. 2’nin bileşkesi olarak Eş. 4
ile ifade edilebilir.
VS=V ∪ S
(4)
E = A[ci]
(5)
∀E∈ VS ve ∀ ci∈ C olmak üzere; Eş. 5ile bir yazılım öğesinin
ikili işlem kod dizilimlerinden oluştuğunu ifade edebiliriz.
∀ Ci∈ C olmak üzere; Eş. 6 ile ikili işlem kodlarının olası
tüm n-gramlık dizilimlerini içerdiğini belirtebiliriz.
Cn= C1 X C2 X …. X Cn
(6)
g(E, n): E→Cn, yazılımın n-gramlık ikili işlem kod
dizilimlerini üreten fonksiyon olmak üzere; P(E):E→[0-1]
olasılık fonksiyonu, verilen bir yazılımın n-gramlık ikili
işlem kod dizilimlerini kullanarak arabellek taşması
zayıflığını içerme olasılığını makine öğrenmesi algoritmaları
ile tahmin etsin.
Veri setinde güvenli ve zayıf olarak sınıflandırılmış yazılım
birimleri, geliştirilen yöntemin sınanmasında hem eğitim
hem de test verisi olarak kullanılarak yöntemin başarımı
hesaplanır. Yöntemde kullanılacak olan öğreticili makine
öğrenmesi algoritmaları ayrık veya birlikte koşturularak
yazılım biriminin güvenli-zayıf sınıflandırması yapılır.
4. GERÇEKLEME VE BAŞARIM SONUÇLARI
(IMPLEMENTATION AND ACHIEVEMENTRESULTS)
4.1.Yöntemin Süreçleri (Processes of The Method)
Yöntemde izlenen süreçler aşağıda sıralanmıştır:
Veri setinin hazırlanması
NVD (National Vulnerability Database), CVE(Common
Vulnerabilities and Exposures) ve OSVDB (Open Source
Vulnerability Database) gibi yazılım zayıflık veri
1699
Durmuş ve Soğukpınar / Journal of the Faculty of Engineering and Architecture of Gazi University 34:4 (2019) 1695-1704
tabanlarında zayıflıklar tanımlı olmasına karşın veri seti
olarak kullanılacak yazılım bileşenlerinin paylaşılmamış
olması nedeni ile veri seti kendi çalışmalarımızla
oluşturulmuştur.
Veri setindeki yazılımlar, statik kod analiz araçlarının
karşılaştırılması için NIST tarafından üretilen “yığın
arabellek taşma zayıflığı” içeren test senaryoları [19] esas
alınarak hazırlanmıştır. Veri setindeki her bir yazılım
öğesinin güvenli ve zayıf sürümleri “Code: Blok” yazılım
geliştirme ortamında, C/C++ programlama dilinde
geliştirilmiştir. Veri setimiz, 15 adet yığın arabellek
taşması zayıflığı içeren zayıf yazılım bileşeni ve bu
zayıflıkların giderildiği 15 adet güvenli yazılım bileşeni
olmak üzere toplam 30 yazılım bileşeninden oluşmaktadır.
Veri setinin sınıflandırılması:
Veri setindeki yazılımlar güvenli ve zayıf olarak
sınıflandırılarak veri setinde işaretlenmiştir.
Veri setinde zayıf veya güvenli olarak sınıflandırılmış her
bir yazılım öğesi kara kutu test yöntemleri ile yığın
arabellek taşması zayıflığını ortaya çıkarma amaçlı
sınanarak zayıf veya güvenli olduğu doğrulanmıştır.
İkili işlem kod dizilimlerinin üretilmesi:
Veri setindeki her bir yazılım öğesinin ikili işlem kod
dizilimleri Python programlama dilinde Distorm
disassembler kütüphanesi kullanılarak üretilmiştir.
N-gramlık ikili işlem kod dizilimlerinin üretilmesi:
Geliştirilen yardımcı yazılımlar ile ikili işlem kod
dizilimlerinden n-gramlık ikili işlem kod dizilimleri
üretilmiştir. Tablo 1 ile örnek bir yazılım bileşeninden
türetilen n-gramlık ikili işlem kod dizilimleri
gösterilmiştir.
WEKA nitelik-ilişki dosyasının üretilmesi:
n-gramlık ikili işlem kod dizilimlerinin WEKA [20] aracı
ile analiz edilebilmesi için ARFF (Attribute-Relation File
Format) dosyaları üretilmiştir.
WEKA
ile
yazılımların
sınıflandırılması:
Tablo 1.N-gram ikili işlem kod dizilimleri(n-gram binary opcode sequences)
1700
2-gram
dec pop
pop nop
nop add
add inc
inc mov
mov int
int push
push jb
jb ins
olarak
Veri temizliği: ARFF dosyasında özellik olarak yer alan
ancak veri analizi sırasında öznitelik olarak
kullanılmayacak olan özellikler temizlenmiştir.
Şekil 2. Sistem mimarisi (System architecture)
İkili işlem kodları
dec
pop
nop
add
inc
mov
int
push
jb
ins
güvenli/zayıf
3-gram
dec pop nop
pop nop add
nop add inc
add inc mov
inc mov int
mov int push
int push jb
push jb ins
4-gram
dec pop nop add
pop nop add inc
nop add inc mov
add inc mov int
inc mov int push
mov int push jb
int push jb ins
Durmuş ve Soğukpınar / Journal of the Faculty of Engineering and Architecture of Gazi University 34:4 (2019) 1695-1704
Veri dönüştürme: ARFF dosyasında özellik olarak yer alan
n-gramlık ikili işlem kod dizilimleri kelime vektörlerine
dönüştürülerek veri setindeki bütün n-gramlık ikili işlem
kod dizilimleri öznitelik olarak belirlenmiştir.
Sınıflandırma algoritmalarının belirlenmesi: Sınıflandırma
algoritması olarak; KNN (K En Yakın Komşu), Naïve
Bayes, Destek Vektör Makinesi, Bayes Multinomial,
Hoeffding Tree, J48, K-Star, Random Forest, Random
Tree, Decision Table ve ZeroR algoritmaları
kullanılmıştır.
Eğitim ve test modelinin belirlenmesi: Eğitim ve test
modeli olarak WEKA`nın çapraz doğrulama yöntemi
kullanılmıştır. Katlama değeri varsayılan değer 10 olarak
kullanılmıştır.
Modelin eğitimi ve sınanması: Veri setindeki veriler 10
gruba bölünerek 9 grup ile model eğitilmiş ve 1 grup ile
sınanmıştır. Bu işlem 10 kez tekrar edilerek, çapraz
doğrulama yönteminin kuralı olan veri setindeki her bir
öğenin hem eğitim hem de test verisi olarak kullanılması
sağlanmıştır.
Yöntemin otomatikleştirilmesi:
Yöntemin tekrarlanabilirliğini sağlamak ve analiz
süreçlerini kısaltmak için WEKA`nın bilgi-akış yeteneği
kullanılmıştır. Hazırlanan bilgi-akış diyagramı ile üretilen
ARFF dosyalarının analizi otomatikleştirilmiştir.
Yöntemin başarım oranı (TPR) yazılımın güvenlik zayıflığı
içerme olasılığı ile ilişkilendirilmiştir. Örneğin; %90 TPR
oranı ile uygulamalar sınıflandırıldığında, bir yazılım
bileşeni “zayıf” olarak sınıflandırılmışsa o yazılımın zayıflık
içerme olasılığını %90 olarak kabul edebiliriz.
4.2.Yöntemin Sınanması ve Değerlendirilmesi
(Testing and Evaluation of The Method)
Yöntemin sınanmasında kullanılan donanım konfigürasyonu
aşağıda verilmiştir:
İşlemci: Intel Core i5
Sistem belleği: 8 GB
İşletim sistemi: Windows 7 Professional
Geliştirilen yöntem başarımının değerlendirilmesi için
kullanılan karışıklık matrisi aşağıdaki gibi oluşturulmuştur.
Tablo 2. Karışıklık matrisi (Confusion matrix)
Mevcut
Durum
Zayıf
Güvenli
Tespit
Zayıf
TP Doğru-Pozitif
(True Positive)
FP Yanlış-Pozitif
(False Positive)
Güvenli
FN Yanlış- Negatif
(False Negative)
TN Doğru-Negatif
(True Negative)
Karışıklık matrisi, veri setindeki mevcut durumun ve
sınıflandırma sonuçlarının Doğru-Pozitif (TP), YanlışPozitif (FP), Doğru-Negatif (TN) ve Yanlış-Negatif (FN)
değerleri ile ifade edilmesinde yardımcı olur. Sınıflandırma
yöntemlerinin başarımları; Doğru-Pozitif Oranı(TPR: TP
Rate), Yanlış-Pozitif Oranı (FPR: FPRate) ve Kesinlik (P:
Precision) performans değerleri ile kıyaslanmıştır.
TPR, zayıf yazılımların ne oranda doğru tespit edildiğini
yüzdesel olarak ifade eder.
TPR
∗ 100
(7)
FPR
∗ 100
(8)
FPR, güvenli yazılımların ne oranda yanlışlıkla zayıf olarak
sınıflandırıldığını yüzdesel olarak ifade eder.
Kesinlik (P), zayıf olarak sınıflandırılan yazılımların ne
oranda doğru sınıflandırıldığını yüzdesel olarak ifade eder.
P
∗ 100
(9)
Yöntem, n-gramlık ikili işlem kod dizilimlerini belirlemede
kullanılan “n” parametresi ile geliştirilen prototip sistem
kullanılarak sınanmıştır. “n” parametresi [1,200] aralığında
ardışık olarak sisteme girilmiş ve başarım değerleri TPR (Eş.
7), FPR (Eş. 8) ve P (Eş. 9) denklemleri ile hesaplanmıştır.
Elde edilen başarım değerleri Tablo 3 ve Şekil 3’te
sunulmuştur.
4.3. Diğer Yöntemler İle Karşılaştırma
(Comparison With The Other Methods)
Geliştirilen yöntemin diğer yöntemlerden ayırt edici en
belirgin özelliği, H-1 hipotezi ile sunulan ikili işlem kod
dizilimlerinin yazılım güvenliği zayıflık analizinde
kullanılabileceğini göstermesidir. Ayrıca, makine öğrenmesi
tekniklerinin yazılım güvenliği analizinde kullanımı ve
yönteme ait gerek yazılım kaynak kodlarının gerekse veri
setinin paylaşılmış olması çalışmayı mevcut çalışmalardan
farklı kılmaktadır.
Geliştirilen yöntemin diğer yöntemlerle olan karşılaştırması
Tablo 4’te sunulmuştur. Mevcut yöntemler, bilinen bir
zayıflığı ortaya çıkarmaya yönelik çözümler üretmekte ve
başarım sonuçlarını TPR, FPR değerleri ile değil zayıflığın
yakalanması ile ifade etmektedirler. Geliştirilen yöntemin
başarım oranı TPR, FPR ve P değerleri ile ölçülmüştür.
Diğer yöntemlerde olduğu gibi geliştirilen yöntem de
problem karmaşıklığını azaltmak için belirli kısıtlamalar
(veri setindeki yazılımların formatı, işlemci mimarisi,
derleme kipi gibi) altında geliştirilmiştir.
Mevcut
çalışmalarda
kullanılan
veri
setleri
paylaşılmadığından dolayı geliştirilen yöntemin başarımı
diğer yöntemlerde kullanılan veri setleri ile sınanamamıştır.
Ancak başarımın karşılaştırılabilmesi için, diğer
araştırmacılar ile iletişime geçilerek kendi veri setimizin
diğer yöntemler ile analiz edilmesi talep edilmiştir. Tevis
[13, 14] veri setimizi kendi yöntemleri ve geliştirdikleri
1701
Durmuş ve Soğukpınar / Journal of the Faculty of Engineering and Architecture of Gazi University 34:4 (2019) 1695-1704
Tablo 3. Sınıflandırma yöntemlerinin başarım sonuçları (Performance results of classification methods)
Algoritma
KNN (K=1)
KNN (K=3)
KNN (K=5)
KNN (K=7)
Naïve Bayes
SVM
ZeroR
Bayes Multinomial
Hoeffding Tree
J48
K-Star
Random Forest
Random Tree
Decision Table
n
[25,32]
[15,100]
[33,100]
[7,9]
[13,17]
[6,100]
[1,200]
[6,100]
[13,18]
[18,100]
[25,32]
[6,100]
[24,27]
[6,100]
TPR (%)
95,00
90,00
90,00
90,00
95,00
90,00
50,00
90,00
95,00
90,00
95,00
90,00
95,00
90,00
FPR (%)
5,00
10,00
10,00
10,00
5,00
10,00
50,00
10,00
5,00
10,00
5,00
10,00
5,00
10,00
P (%)
95,50
91,70
91,70
91,70
95,50
91,70
25,00
91,70
95,50
91,70
95,50
91,70
95,50
91,70
Şekil 3. Sınıflandırma yöntemlerinin başarım oranları (Performance results of classification methods)
FindSSV yazılımı ile analiz ederek sonuçları paylaşmıştır.
FindSSV sonuç raporlarına göre;
Veri setinde yer alan 15 adet güvenli uygulamadan 12
tanesi, “strncpy” C/C++ kütüphane fonksiyonunu
kullandığı gerekçesi ile “düşük riskli” yazılım olarak
değerlendirmiştir. Geriye kalan 3 adet uygulamanın
analizinde FindSSV uygulaması beklenmedik şekilde
sonlanarak analizi tamamlayamamıştır. Düşük riskli
olarak değerlendirilen yazılımları güvenli kabul edebiliriz.
Veri setinde yer alan ve arabellek taşması zayıflığı içeren
15 adet uygulamadan 10 tanesi, “strcpy” ve “gets” C/C++
kütüphane fonksiyonlarını kullandığı için “çok yüksek
riskli” yazılım olarak değerlendirmiştir. Geriye kalan 5
adet uygulamanın analizinde FindSSV uygulaması
beklenmedik
şekilde
sonlanarak
analizi
tamamlayamamıştır.
1702
Geliştirilen yöntemin başarımı Tevis vd. [13, 14] ile
karşılaştırıldığında; veri setinde yer alan güvenli ve zayıf
uygulamaların çoğunlukla her 2 yöntemde de doğru
sınıflandırıldığını görmekteyiz. Bu durum, geliştirilen veri
setindeki yazılım bileşenlerinin doğru sınıflandırıldıklarını
ve diğer yöntemler tarafından da kullanılabilir olduğunu
göstermektedir.
FindSSV
tarafından
analizi
tamamlanamayan uygulamaların güvenli veya zayıf olarak
sınıflandırması yapılamadığından yöntemin başarımı TPR,
FPR ve P değerleri ile verilememiştir. Sezgisel olarak
analizi tamamlanamayan yazılımları güvenli kabul
ettiğimizde başarımı (TPR: %66,66; FPR: %0 ve P:
%100), zayıf kabul ettiğimizde başarımı (TPR: %100;
FPR: %20 ve P: %83,33) ve ortalama başarımı (TPR:
%83,33; FPR: %10; P: %91,66) hesaplanabilir (*).
Geliştirilen yöntemde elde edilen yüksek başarım (TPR:
%95; FPR:%5 ve P: %95,5) değerleri yöntemin başarısını
ve uygulanabilirliğini göstermektedir.
Durmuş ve Soğukpınar / Journal of the Faculty of Engineering and Architecture of Gazi University 34:4 (2019) 1695-1704
Tablo 4.Diğer yöntemler ile karşılaştırma(Comparison with the other methods)
Analiz yöntemi
Yöntemler
Önerilen
yöntem
Statik
Uygulanan
metodoloji
Makine
öğrenmesi
Dosya
formatı
analizi
Derleyici ve dosya
formatı
güncellemesi
Girdi türü
Kaynak kod
gereksinimi var
mı?
Kaynak kod ve
veri seti
paylaşımı var mı?
PE
PE
ELF
Cova vd.
[16]
Statik
PE ve
kaynak
kodun
birlikte
analizi
ELF
Hayır
Hayır
Evet
Evet
Hayır
Evet
Hayır
Hayır
Hayır
Hayır
TPR: %95
FPR: %5
P:%95,5
TPR: %83,33
FPR: %10
P:%91,66 (*)
-
-
Kriterler
Başarım
Tevis vd.
[13, 14]
Statik
Du Varney vd.
[15]
Statik
Geliştirilen yöntemi diğer çalışmalardan ayırt edici
özellikleri şöyle sıralanabilir:
Yüksek başarım sonuçları (TPR: %95; FPR:%5 ve P:
%95,5),
Makine öğrenmesi tekniklerinin yığın arabellek taşması
zayıflık analizinde kullanılması,
Veri setinin ve prototip sistem kaynak kodlarının
paylaşılması,
Açık kaynak kodlu mimari üzerine geliştirilmesi.
5. SİMGELER (SYMBOLS)
FP
FPR
P
TP
TPR
: Yanlış-Pozitif (False-Positive)
: Yanlış-Pozitif Oranı (False-Positive Rate)
: Kesinlik (Precision)
: Doğru-Pozitif (True-Positive)
: Doğru-Pozitif Oranı (True-Positive Rate)
6. SONUÇLAR (CONCLUSIONS)
Tablo 3ve Şekil 3’te verilen yüksek başarım değerleri, H-1
hipotezinde önerildiği gibi PE formatlı yazılımların ikili
işlem kod dizilimleri ve dağılımları kullanılarak zayıf veya
güvenli olarak sınıflandırılabileceğini göstermektedir.
Özellikle KNN, Naïve Bayes, Hoeffding Tree, K-Star ve
Random Treealgoritmaları ile elde edilen yüksek başarım
oranları bu algoritmaların zayıflık analizi için uygun
sınıflandırma algoritmaları olduğunu göstermektedir. Aynı
zamanda çoğunluk sınıflandırıcı olarak da bilinen ZeroR
algoritması diğer sınıflandırıcıların performansını ölçmek
için temel sınıflandırıcı olarak kullanılmıştır [21]. ZeroR
algoritması, sınıflandırmada eğitim verisindeki örneklerin
sayılarını esas aldığından doğru-pozitif oranı olarak %50
başarım değerini vererek veri setinde kullanılan zayıf ve
güvenli yazılım sayısının eşit olduğunu göstermiştir. KNN
algoritması kullanıldığında K komşu sayısı değeri arttıkça
başarımın düştüğü gözlemlenmiştir. Yöntemin doğru-pozitif
Cha vd. [18]
Dinamik
Sembolik
çalıştırma ve
akış kontrol
denetimi
PE, ELF
oranı (TPR) başarım değeri ile yazılımın güvenlik zayıflığı
içerme olasılığının ilişkilendirilebileceği gözlemlenmiştir.
Yöntemin gerçeklendiği prototip sistem ile gerek yazılım
geliştirme safhasında gerekse son kullanıcı tarafında
arabellek taşması zayıflık analizlerinin yapılabileceği
değerlendirilmektedir.
Yapılan çalışmada ikili yürütülebilir dosya formatlı
yazılımların güvenlik zayıflığı analizi için temel teşkil
edecek veri seti oluşturulmuştur. Veri setinin
genişletilmesine yönelik yapılacak çalışmalar ile yazılım
güvenliği zayıflık analizinde kullanılmak üzere zayıflık veri
tabanı oluşturulabilir. ImageNet benzeri oluşturulacak veri
tabanına zayıflık türüne göre sınıflandırılmış yazılım
bileşenlerinin kaynak kodları, ikili yürütülebilir sürümleri ve
zayıflığı ortaya çıkaran girdileri ile eklenmesi bu alanda
yapılacak çalışmalar için çok büyük fayda ve ivme
sağlayacaktır.
Geliştirilen yöntem ve prototip sisteme ait kaynak kodlar ve
veri seti GitHub [22] platformu üzerinden ilgili akademisyen
ve araştırmacılar ile paylaşılmıştır. Yöntem başarımının
artırılması için sınıflandırmada belirleyici olan n-gramlık
ikili işlem kod dizilimlerinin tespitine ve geliştirilen prototip
sistemin
kullanılabilirliğinin
artırılmasına
yönelik
çalışmalarımız devam etmektedir. Ayrıca, veri setini gerek
kendi geliştireceğimiz gerekse diğer çalışmalardan temin
edebileceğimiz
yazılımlar
ile
genişletmek
için
çalışmalarımızı sürdürmekteyiz.
KAYNAKLAR (REFERENCES)
1.
2.
McGraw, G., Software Security, IEEE Security
&Privacy, 2 (2), 80-83, 2004.
Baca, D.,Developing Secure Software in an Agile
Process, Doctoral Dissertation in Computer Science,
Blekinge Institute of Technology, 2012.
1703
Durmuş ve Soğukpınar / Journal of the Faculty of Engineering and Architecture of Gazi University 34:4 (2019) 1695-1704
3.
Younan, Y., 25 Years of Vulnerabilities: 1988-2012,
Research Report, Sourcefire Crop, 2013.
4. Younan, Y., Joosen, W., Piessens F., Code Injection in
C and C++ : A Survey of Vulnerabilities and
Countermeasures, Report CW386, July 2004.
5. Akgün, F., Buluş, E., Buluş, H.N., Yazılım
Mühendisliği Açısından Uygulamalardaki Ara Bellek
Taşması Zafiyetinin İncelenmesi, Elektrik-ElektronikBilgisayar Mühendisliği 11. Ulusal Kongresi ve Fuarı,
İstanbul-TÜRKİYE, 2005.
6. Sidiroglou, S., Locasto, M.E., Boyd, S.W., Keromytis,
A. D., Building a Reactive Immune System for Software
Services, USENIX Annual Technical Conference, 2005.
7. Wang, Y., Kelly, T., Kudlur, M., Lafortune, S., Mahlke,
S.A., Gadara: Dynamic Deadlock Avoidance for
Multithreaded Programs, USENIX Symposium on
Operating Systems Design and Implementation, 2008.
8. Alhazmi, O.H., Malaiya, Y.K., Ray I., Measuring,
Analyzing and Predicting Security Vulnerabilities in
Software Systems, Computers & Security (2006),
doi:10.1016/j.cose.2006.10.002, 2006.
9. Ozment, A., Schechter, S.E., Milk or Wine: Does
Software Security Improve with Age?, In the
proceedings of The Fifteenth Usenix Security
Symposium, July 31 - August 4 2006: Vancouver, BC,
Canada, 2004.
10. Chess, B., McGraw, G., Static Analysis for Security,
IEEE Security &, Privacy, 2 (6), 76-79., 2004.
11. Halkidis, S.T., Tsantalis, N., Chatzigeorgiou, A.,
Stephanides, G., Architectural Risk Analysis of
Software Systems Based on Security Patterns, IEEE
Transactions on Dependable and Secure Computing, 5,
3, 2008.
12. Utku A., Doğru İ.A., Permission based detection system
for android malware, Journal of the Faculty of
Engineering and Architecture of Gazi University, 32 (4),
1015-1024, 2017.
1704
13. Jay-Evan J. Tevis, Automatic Detection of Software
Security Vulnerabilities in Executable Program Files,
Doctoral Dissertation in Computer Science, Auburn
University, 2005.
14. Tevis, Jay-Evan J. et al., Static Analysis of Anomalies
and Security Vulnerabilities in Executable Files, ACM
SE'06, Mar. 10-12, 2006.
15. D.C. DuVarney, V.N. Venkatakrishnan and S. Bhatkar,
SELF: A Transparent Security Extension for ELF
Binaries, Proc. New Security Paradigms Workshop,
2003.
16. Cova, M., Felmetsger, V., Banks, G., Vigna, G., Static
Detection of Vulnerabilities in x86 Executables, Annual
Computer Security Applications Conference (ACSAC),
Miami, FL, December, 2006.
17. Balakrishnan, G.,WYSINWYX: What You See Is Not
What You eXecute, PhD Thesis, Computer Science
Department, University of Wisconsin at Madison,
August 2007.
18. Cha, S. K., Avgerinos, T., Rebert A., Brumley, D.,
Unleashing MAYHEM on Binary Code, Proceedings of
the 2012 IEEE Symposium on Security and Privacy,
p.380-394, May 20-25, 2012.
19. NIST Software Assurance Reference Dataset,
https://samate.nist.gov/SRD/testsuite.php, Erişim tarihi:
11/12/2017.
20. Weka 3 - Data Mining with Open Source Machine
Learning
Software
in
Java,
https://www.cs.waikato.ac.nz/ml/weka, Erişim tarihi:
11/12/2017.
21. Aydın F., Aslan Z., Diagnosis of neuro degenerative
diseases using machine learning methods and wavelet
transform, Journal of the Faculty of Engineering and
Architecture of Gazi University, 32 (3), 749-766, 2017.
22. Durmus, G., Çalışma Kaynak Kod ve Sonuçları,
http://github.com/gdurmus/, Son Erişim Tarihi:
05/04/2018.