Predicting software vulnerabilities and vulnerability inducing code changes using deep neural networks
Derin sinir ağlarını kullanarak yazılım güvenlik açıklarını ve güvenlik açığına sebep olan kod değişikliklerini tahmin etme
- Tez No: 637694
- Danışmanlar: DR. ÖĞR. ÜYESİ AYŞE TOSUN
- Tez Türü: Yüksek Lisans
- Konular: Bilgisayar Mühendisliği Bilimleri-Bilgisayar ve Kontrol, Computer Engineering and Computer Science and Control
- Anahtar Kelimeler: Belirtilmemiş.
- Yıl: 2020
- Dil: İngilizce
- Üniversite: İstanbul Teknik Üniversitesi
- Enstitü: Fen Bilimleri Enstitüsü
- Ana Bilim Dalı: Bilgisayar Mühendisliği Ana Bilim Dalı
- Bilim Dalı: Bilgisayar Mühendisliği Bilim Dalı
- Sayfa Sayısı: 89
Özet
Yazılım ürünleri arasında tercih yaparken, kalite önemli bir etkendir. Güvenlik ve güvenilirlik bir yazılımın kalitesini belirleyen etkenlere örnek olarak gösterilebilir. Yazılım güvenlik açıkları, bir yazılımdaki kötüye kullanılabilecek güvenlik ve güvenilirlik zayıflıkları olarak tanımlanabilir. Bu zayıflıklar veri sızması, yanlış işleyiş, kontrolsüz kaynak tüketimi gibi birçok ciddi probleme sebep olabilir. Dolayısıyla bu durum yazılım güvenlik açıklarının saptanması, hızlı bir aksiyon alınması ve tekrar ortaya çıkmasının önlenmesi gibi gereksinimlere sebep olmaktadır. Yazılım güvenlik açıkları yazılım geliştirme yaşam döngüsü içinde farklı aşamalarda meydana gelse de, en sık kodlama aşamasında güvenlik açığı ortaya çıkmaktadır. Bu durumun önüne geçebilmek için, kaynak kodundaki örüntüleri kullanan bir algılama yöntemi kullanılarak kaynak kodundan meydana gelen yazılım güvenlik açıkları saptanabilir. Yazılım güvenlik açıkları hakkındaki bir diğer husus ise bu açıkların ne kadar önemli olduğudur. CVSS, yazılım güvenlik açıklarının etkilerine göre onlara birer önem skoru hesaplar. Bu tez çalışması yazılım güvenlik açıkları, önem dereceleri ve güvenlik açığına sebep olan kod değişiklikleri üzerine kapsamlı bir analiz içerir. Bu bağlamda, yazılım güvenlik açıklarının önem derecelerinin tahmini için bir yaklaşım ve kaynak kodunun güvenlik açığına sebep olup olmadığını tahmin etmek için başka bir yaklaşım geliştirilmiştir. Çalışma boyunca CVE veritabanı, CVSS skorları ve açık kaynak bir yazılım olan Wireshark analiz edilmiştir. Yazılım güvenlik açığı tahmininde geçmiş çalışmalarda yazılım metrikleri ya da kaynak kod metnine dayalı özellikler gibi çeşitli veri kaynakları kullanılmıştır. Ayrıca, bu alandaki geçmiş çalışmalar sürüm, dosya, fonksiyon gibi farklı seviyelerde güvenlik açığı tahmini yapmaya odaklanmıştır. Bunun yanı sıra, yazılım güvenlik açıklarının önemini ölçme üzerine de çalışmalar mevcuttur. Yazılım güvenlik açığı tahmininde geçmiş çalışmaların sürüm ya da dosya gibi yüksek seviyeden tahmin modeli kurma, belirli versiyonların o anki durumuna bağımlı olma, kaynak kodun yapısal özelliklerini tam olarak yansıtmayan metrikler kullanma ve veri setinde güvenlik açığına sahip dosyaları manuel işaretlemeye gereksinim duyma gibi birtakım kısıtlamaları vardır. Bu tez çalışmasında iki ana amaca odaklanmaktadır. Bunlardan ilki yazılım güvenlik açıklarının önem derecelerini açıklama metinlerini kullanarak otomatik olarak tahmin etmek iken ikinicisi de yazılım güvenlik açığı meydana getiren kod değişikliklerini tahmin etmektir. İkinci amacı gerçekleştirmek için önerilen metod, otomatikleştirilmiş bir şekilde mevcut ve geçmişteki güvenlik açıklarının kaynak kod üzerinde tespit edilmesi ve kaynak kodundan çıkarılan özellikler ile tahmin modelinin kurulmasıdır. Kaynak kodunun yapısal özelliklerini daha iyi yansıtabilmek için Soyut Sentaks Ağaçları kullanılmış ve bu ağaçlardan çıkarılan özellikler üzerine tahmin modeli kurulmuştur. Ayrıca, daha detaylı bir seviyeden tahmin yapabilmek için tahmin modeli fonksiyon seviyesinde kurulmuştur. İlk amaç olan yazılım güvenlik açıklarının tahmini için ihtiyaç duyulan CVE kayıtlarının açıklama metinleri ve CVSS skorları NVD veritabanından toplanmıştır. Toplamda, önem derece skorları 0 ile 10 arasında değişen 107.085 güvenlik açığı açıklama metni üzerinde analiz yapılmıştır. İkinci amaç olan kod değişikliklerinden dolayı meydana gelen güvenlik açıklarının tahmin edilebilmesi için kapsamlı bir veri toplama ve hazırlama süreci yürütülmüştür. Bu model için ihtiyaç duyulan veri, güvenlik açıkları ile kaynak kodu arasındaki ilişkidir. Bu ilişkiyi kurmak için, bu çalışmada incelenen Wireshark projesinin hata raporlama sistemi ve versiyon kontrol sistemindeki C programlama diline ait kaynak kod dosyaları veri kaynağı olarak kullanılmıştır. Bu bağlamda, Wireshark projesinin yayınladığı güvenlik tavsiyeleri aracılığı ile güvenlik açıklarını temsil eden hata raporlarına ulaşılmıştır. Hata raporlarının tanımlayıcıları anahtar kelimeler ile versiyon kontrol sistemindeki commit mesajları arasında aranmış ve bu sayede versiyon kontrol sistemi ile güvenlik açıkları eşleştirilmiştir. Ancak, bu eşleşmedeki commit'ler, güvenlik açıklarını düzelten kod değişiklerini içermektedir. Tahmin modeli ise güvenlik açığına sebep olan kod değişikliklerine ihtiyaç duymaktadır. Bu ihtiyacı karşılamak için SZZ algoritması yardımı ile güvenlik açıklarının kaynağı olan kod değişiklikleri bulunmuştur. SZZ algoritması, bir hatayı düzelten kod değişikliğinde değiştirilen satırların hataya sebep olduğu varsayımına dayanır. Bu satırların koda ilk eklendiği kod değişikliklerini versiyon kontrol sisteminde bulup o versiyonların güvenlik açığına sebep olduğunun işaretlenmesine olanak sağlar. Bu sayede, versiyon kontrol geçmişindeki bütün versiyonlarda hangi dosyaların hangi satırlarının güvenlik açığına sebep olduğu bilgisi elde edilmiştir. Fonksiyon seviyesinde çalışılacağından dolayı soyut sentaks ağaçları kullanılarak her bir C dosyasının içindeki fonksiyonlar çıkarılmıştır. Ardından, her fonksiyon için güvenlik açığına sebep olan versiyon ve güvenlik açığını düzelten versiyon arasındaki bütün versiyonlar“güvenlik açığına sebep olur”şeklinde işaretlenmiştir. Bu işlemlerden sonra elde edilen 124.585 fonksiyon versiyonunun yalnızca %0.9'u güvenlik açığına sebep olmaktadır. Yazılım güvenlik açıklarının önem derecelerinin tahmini için izlenen metodoloji, daha önceki bir çalışmanın bir benzeridir. Önceki çalışmadaki yaklaşıma ilave olarak güvenlik açıklarının önem skorlarının doğrudan tahmin edilmesi için de tahmin modelleri oluşturulmuştur. Başka bir deyişle, yazılım güvenlik açıklarının önem seviyeleri ve skorlarının tahmini için açıklama metinlerinden oluşturulan aynı veriyi girdi olarak alan farklı model grupları üzerinde çalışılmıştır. Güvenlik açıklarının açıklama metinlerini makine öğrenimi modellerine uygun hale getirmek için, öncelikle bu metinlerin sayısal özellikler şeklinde ifade edilebilmesi gerekir. Bunun için bir doğal dil işleme yöntemi olan Kelime Gömme yaklaşımı uygulanmıştır. Bu yaklaşım temelde her bir kelimenin sayılardan oluşan birer vektör olarak ifade edilmesine olanak sağlar. Her bir kelime için özellik vektörü elde etmek için Word2Vec modeli kullanılmıştır. Veri setinde en az iki kere kullanılan kelimelerin her biri için 300 elemanlı özellik vektör temsili öğrenilmiştir. Güvenlik açıklarının önem seviyelerinin tahmin edilmesi dört sınıflı bir sınıflandırma problemi olarak tasarlanırken, önem skorlarının tahmin edilmesi ise bir regresyon problemi olarak tasarlanmıştır. Her iki amaç için de Evrişimli Sinir Ağları, Uzun-kısa Vadeli Bellek ve Ekstrem Gradyan Artırma modelleri ortak kullanılmıştır. Sınıflandırma için taban model olarak Destek Vektör Makinası, regresyon için ise Lineer Regresyon seçilmiştir. Ekstrem Gradyan Artırma, Destek Vektör Makinası ve Lineer Regresyon için modellerin girdileri kelimeler için öğrenilmiş özellik vektörlerinin ortalamalarıdır. Evrişimli Sinir Ağları ve Uzun-kısa Vadeli Bellek modelleri için ise girdiler sırasıyla her satırı kelime vektörlerinin oluşturduğu matriksler ve kelime vektörlerinin dizisidir. Bir açıklama metni içindeki kelime sayısı değişken olabilir, ancak Evrişimli Sinir Ağları ve Uzun-kısa Vadeli Bellek modellerinin parçalar halinde eğitilmesi için tüm örneklerin aynı boyutta olması gerekir. Dolayısıyla, Evrişimli Sinir Ağları ve Uzun-kısa Vadeli Bellek model girdilerinin boyutları 1035 kelime olarak sabitlenmiştir. Daha az kelimeye sahip örnekler ise boş kelime şeklinde doldurulmuştur. Yazılım güvenlik açıklarının önem derecelerini tahmin eden modellerin performanslarının ölçümü için sınıflandırma ve regresyon modelleri için birden fazla metrik kullanılmıştır. Bunlardan ana değerlendirme kriterleri ise sınıflandırma için F1 skoru, regresyon için ise ortalama mutlak yüzde hatasıdır. Deneyler esnasında Evrişimli Sinir Ağları, Uzun-kısa Vadeli Bellek ve Ekstrem Gradyan Artırma için veri setinin %70'i eğitim, %10'u doğrulama, %20'si ise test için ayrılmıştır. Destek Vektör Makinası ve Lineer Regresyon modelleri için ise 5 katlı çapraz doğrulama kullanılmıştır. Sonuç olarak, güvenlik açığı önem seviyelerinin tahmini için en iyi sonuç veren model %75.6 F1-skoru ile Uzun-kısa Vadeli Bellektir. Aynı zamanda Evrişimli Sinir Ağları modeli de %75.2 F1-skoru ile Uzun-kısa Vadeli Bellek modeline oldukça yakın sonuç elde etmiştir gözlenmiştir. Güvenlik açığı önem skorlarının tahmini için ise en iyi sonuç veren model %16.14 ortalama mutlak yüzde hatası ile yine Uzun-kısa Vadeli Bellektir. Her iki deneyde de taban modellerin diğer 3 modelden daha kötü tahminde bulunduğu sonuçlarda görülmektedir. Ayrıca, iki deneyin de sonuçlarının model performans sıralaması bakımından paralel olması birbirlerinin sonucunu doğrulamaktadır. Yazılım güvenlik açığı meydana getiren kod değişikliklerini tahmin etmek için kurulan tahmin modeli 2 sınıflı bir sınıflandırma modelidir. Ayrıca, tahmin modeli Soyut Sentaks Ağaçları tabanlıdır. Her bir fonksiyon, bir ağaç yapısında temsil edilmiştir. Bu ağaç yapısındaki düğümler koddaki yapısal elemanları gösterirken düğümler arası bağlantılar bu yapıların birbirleri arasındaki ebeveyn-çocuk ilişkisini temsil etmektedir. Her bir düğüm, Soyut Sentaks Ağaçlarındaki düğüm çeşitleri ile temsil edilmiştir. Veri setinde toplamda 48 düğüm çeşidi bulunmaktadır. Ağaçları tahmin modeline uygun hale getirmek için, düğümlerin sahip olduğu çeşitlerin sayısal özellikler olarak ifade edilebilmesi gerekir. Dolayısıyla, çeşitlere birer özellik vektörü öğrenebilmek için bir yapay sinir ağları modeli tasarlanmıştır. Bu tasarımın ardındaki fikir, anlamsal olarak birbirine benzeyen çeşitlere birbirine yakın temsiller öğrenebilmektir. Bu yüzden, bu çeşitlerin ağaç yapısındaki komşuluk ilişkileri üzerinden bir ilişki kurulmuştur. Bu ilişki ile beraber model, bir düğümü tahmin etmek için ebeveyn düğümü ve bu düğümün ilk üç çocuğunu kullanmaktadır. Bu modelin eğitimi için 25.000 Soyut Sentaks Ağacı rastgele seçilmiştir. Eğitim işleminin sonunda her bir düğüm çeşidi için 50 elemanlı sayısal özellik vektör temsili öğrenilmiştir. Kaynak kodunun ağaç yapısını daha iyi temsil edebilmek için, tahmin modeli olarak 2 adet çizge yapay sinir ağları Çizgi Sinir Ağları kullanılmıştır. Bu 2 model sırasıyla GraphSAGE ve GraphConv modelleridir. Her ikisi de konvolüsyon tabanlıdır. Düğüm çeşitleri için öğrenilen özellik vektörleri, herhangi bir veri transformasyonuna uğramadan doğrudan ağaç yapısında gerekli yerlere yerleşmiştir. Bu sayede tahmin modelinde kaynak kodunun ağaç yapısı korunmuş olur. Çizgi Sinir Ağlarının ağaç yapısı üzerinde öğrendiği özellikler, tamamen bağlı yapay sinir ağı katmanları tarafından kullanılarak tahminler oluşturulmuştur. Bunun yanı sıra, güvenlik açığı tahmini konusunda önceki çalışmalarda kullanılan kaynak kodu metnine bağlı bir model de inşa edilmiştir. Bu model, kaynak kodundaki terimlerin sıklığı üzerinden çıkarılan özelliklerin Destek Vektör Makinası tarafından sınıflandırılmasına dayanır. Yazılım güvenlik açığı meydana getiren kod değişikliklerini tahmin eden modellerin performansı birden çok metrikle ölçülse de temel kriter güvenlik açığına neden olan sınıfın duyarlılığı daha önemli olmak üzere duyarlılık ve kesinlik değerleridir. Bunun sebebi, veri setinin dengesiz dağılmasıdır. Deneyler için veri setinin %80'i eğitim, %20'si test amaçlı kullanılmıştır. Hem kesinlik, hem de duyarlılık bazında güvenlik açığına sebep olan sınıf için sırasıyla %80.3 ve %68 ile en iyi performans gösteren model GraphSAGE modelidir. Taban model ise benzer kesinliğe sahip olsa da daha düşük bir duyarlılık değerine sahiptir. İkili sınıflandırma yapılırken, sınıflandırma limiti %50 olarak belirlenmiştir. Yani, bir örneğin güvenlik açığına sebep olan sınıfta olacak şekilde tahmin edilebilmesi için bu sınıfa ait olma olasılığının %50 ve üstü olması gerekmektedir. Bu sınır değeri değiştirildiğinde daha farklı duyarlılık ve kesinlik değerleri elde edilmektedir. Daha yüksek bir duyarlılık değeri için bu sınır değeri düşürülebilir, ancak bu kesinlik değerinde bir alçalmaya sebep olur. GraphSAGE modelinin elde ettiği duyarlılık ve kesinlik değerleri, modelin güvenlik açığına sebep olan örneklerin çoğunu kapsayacak bir şekilde tahmin yaparken, yanlış alarmlar üretmediğini göstermektedir. Sonuç olarak, bu tez çalışmasında iki ana araştırma sorusuna odaklanılmış ve bu soruları yanıtlamak için derin sinir ağları ile farklı tahmin modelleri kurulmuştur. Yazılım güvenlik açıklarının önem skorlarının tahmini için elde edilen sonuçlar bu yaklaşımın pratikte önem seviyelerine göre daha kullanışlı olabileceğini göstermektedir. Yazılım güvenlik açığı meydana getiren kod değişikliklerini tahmin etmek için önerilen yaklaşım, geçmiş çalışmalarda saptanan kısıtlamalar için birer çözüm niteliğindedir. Ayrıca, deney sonuçları kaynak kodunun yapısal özelliklerinin kaynak kodunu metin olarak kullanmaya göre daha iyi sonuçlar verdiğini göstermektedir.
Özet (Çeviri)
When choosing between software products, quality is an important factor. Security and reliability are among the factors that represent the quality of the software. Software vulnerabilities can be identified as vulnerabilities in security and reliability that can be exploited in the software. Although software vulnerabilities occur at different stages in the software development lifecycle, the most common vulnerabilities occur in the coding phase. Source code and patterns extracted from it could be used to early detect and fix vulnerabilities. Another issue about software vulnerabilities is to assess how severe their impacts are. This thesis reports a comprehensive analysis of software vulnerabilities, their severity levels, and code changes that induce vulnerabilities. Neural network based models are designed to estimate severity levels of vulnerabilities based on textual descriptions, and to predict vulnerability inducing code changes using their abstract syntax trees. This thesis study focuses focuses on two research question. The first of these is to predict the severity of software vulnerabilities using the vulnerability description sentences, and the second is to predict vulnerability inducing code changes. Throughout the study, CVE database, CVSS scores, and an open-source software project, namely Wireshark are used in the analyses. The proposed approach for predicting the severity of software vulnerabilities is based on learning feature representations from vulnerability descriptions using word2vec and then predicting both severity levels and severity scores. CNN, LSTM, and XGBoost are utilized as prediction models. On the other hand, the approach for predicting the vulnerability inducing code changes is an automated process of finding present and previous vulnerable source code parts and using the structural information of the source code in the prediction model through ASTs. To preserve the structural information extracted by ASTs, a neural network model is built to learn feature representation from ASTs. Furthermore, two GNN models are utilized as predictors. The experiments for the first research question result in 75.6% of F1 score on predicting the severity levels and 16.14% MAPE on predicting the severity scores. The experiments for the second research question, on the other hand, achieve 80.3% of precision and 68% of recall for predicting vulnerability inducing code changes. Our findings show that the severity prediction approach could help security experts in their assessments on the severity of software vulnerabilities and our approach on predicting vulnerability inducing code changes is promising.
Benzer Tezler
- A composed technical debt identification methodology to predict software vulnerabilities
Yazılım zafiyetlerini tahmin etmek için kapsamlı bir teknik borç tanımlama yöntemi
RUŞEN HALEPMOLLASI
Doktora
İngilizce
2024
Bilgisayar Mühendisliği Bilimleri-Bilgisayar ve Kontrolİstanbul Teknik ÜniversitesiBilgisayar Mühendisliği Ana Bilim Dalı
DOÇ. DR. AYŞE TOSUN KÜHN
- Profiling developers to predict vulnerable code changes
Güvenlik açığı kod değişikliklerini öngörmek için geliştiricilerin profilini oluşturma
TUĞÇE COŞKUN
Yüksek Lisans
İngilizce
2023
Bilgisayar Mühendisliği Bilimleri-Bilgisayar ve Kontrolİstanbul Teknik ÜniversitesiBilgisayar Mühendisliği Ana Bilim Dalı
DOÇ. DR. AYŞE TOSUN KÜHN
- Predicting software vulnerabilities using topic modeling with issues
Konu modelleme yöntemi ile yazılım güvenlik açıklarını tahmin etme
FATMA GÜL BULUT
Yüksek Lisans
İngilizce
2019
Bilgisayar Mühendisliği Bilimleri-Bilgisayar ve Kontrolİstanbul Teknik Üniversitesiİletişim Sistemleri Ana Bilim Dalı
DR. ÖĞR. ÜYESİ AYŞE TOSUN
- Ulusal yazılım açıklık veri tabanı oluşturulması kapsamında android açıklıklarının modellenmesi ve analiz edilmesi
Establishment of national software vulnerability's database
KEREM GENCER
Doktora
Türkçe
2021
Bilgisayar Mühendisliği Bilimleri-Bilgisayar ve KontrolSelçuk ÜniversitesiBilgisayar Mühendisliği Ana Bilim Dalı
PROF. DR. FATİH BAŞÇİFTÇİ
- İklimlendirme sistemleri üzerinde makine öğrenmesi ile anomali tespiti
Anomaly detection with machine learning on air conditioning systems
REFİK KİBAR
Yüksek Lisans
Türkçe
2023
Bilgisayar Mühendisliği Bilimleri-Bilgisayar ve KontrolSakarya ÜniversitesiBilgisayar Mühendisliği Ana Bilim Dalı
DR. ÖĞR. ÜYESİ MUHAMMED FATİH ADAK
DR. ÖĞR. ÜYESİ KEVSER OVAZ AKPINAR