EN
EN

KAYNAK KOD GÜVENLİĞİ


Günümüzde gelişen teknolojiler sayesinde güvenlik donanımların verimliliği artmış ve siber suçluların dikkatini farklı yönlere çekmiştir. Son yıllarda yapılan araştırmalara göre siber saldırıların yüzde 91’i uygulamalar ve bilgisayar programları üzerinden gerçekleştiği tespit edilmiştir. OWASP şirketinin yaptığı araştırmaya göre en önemli ve en çok kullanılan 10 saldırı tekniği web uygulamalar üzerine yapılan ataklardır (SQL Injection,Cross-Site Scripting, Code Injection, Parameter Tampering v.b.). Uygulamaların yüzde 75’ini finans/bankacılık uygulamaları, devlet kurumlarının uygulamaları gibi kritik düzeyde insanları etkileyecek uygulamalar oluşturuyor. Bu nedenle uygulamaların güvenliği son derece önemli bir hal almıştır.

Uygulamaların geliştirilmesi sırasında yazılan kodlar zaman zaman eklenip çıkarılarak ya da değiştirilerek kaynak kod hatalarının oluşmasına sebebiyet verir. Saldırganlar bu hatalar sayesinde açık bulup sistemlere saldırmaktadırlar. Bu doğrultuda güvenliği en üst seviyeye çıkarmak için, yazılımda oluşan hataların ortaya çıkarılması ve giderilmesi gerekmektedir. Geliştiriciler bu süreçte çeşitli teknikler uygulayarak uygulamanın güvenliğini arttırmaya çalışmaktadır. Kaynak kodu analizi; uluslararası tabiriyle “Software Development Lifecycle (SDL)” yani “Yazılım Geliştirme Yaşam Döngüsü” uygulamanın güvenliğini sağlama konusunda önemli yapı taşlarından biridir. Kaynak kodu analizi teknikleri arasında kod gözden geçirmeleri, otomatikleştirilmiş statik kod analizi gibi yazılımın çalışmasını gerektirmeyen statik yöntemler ile birim testleri, yazılım testleri, sistem entegrasyon testleri ve sistem testleri gibi dinamik yöntemler yer almaktadır.

Statik analiz kullanırken yazılımı çalıştırmadan analiz edebilir, analiz sonuçlarına göre gerekli önlemler alınmaktadır. Otomatik kod analiz araçları belirli bir olgunluğa ulaşmasıyla, zaman ve ekonomik maliyetler açısından daha uygun olduğu için, statik analiz (görüntüleyerek de gerçekleştirilebilir) artık otomatikleştirilmiştir. Bu analizler sadece olası hataları tespit etmekle sınırlı kalmayıp aynı zamanda kalite göstergeleri, mimari yapısı ve kodlama standartlarına uygunluğu gibi önemli işlevlerini de ortaya çıkarır.

Statik kod analizi, yazılım geliştirme sürecinin her aşamasında kolaylıkla gerçekleştirilebilir çünkü yazılımın çalıştırılmasını ve belirli test ayarlarının yapılmasını gerektirmez. Bu nedenle, statik kod analiz araçları, yazılımdaki hataları erken bir aşamada tespit etmek için kullanılabilir. Geliştirilen yazılımlarda hata tespit ve düzeltme faaliyetlerinin maliyetinin yazılım yaşam döngüsünün ileri aşamasına doğru hızla arttığı düşünüldüğünde, statik kod analizinin yazılım geliştirme sürecinin erken aşamalarından itibaren benimsenmesinin önemi ortaya çıkmaktadır. Özellikle, günümüz yazılımlarının artan karmaşıklığı ve teslimat süresinin kısalması, yazılım düzeltme faaliyetlerinin mümkün olduğunca erken, düşük maliyetli ve etkili bir şekilde gerçekleştirilmesini gerektirmektedir. Otomatik statik kod analizi sayesinde yazılımdaki hatalar erken ve düşük maliyetle tespit edilerek fonksiyonel testleri daha etkin hale getirir. Sonuç olarak, daha kaliteli ve güvenilir yazılım ürünleri ortaya çıkmaktadır.

Statik Kod Analizi

Statik kod analizi, bir yazılımın içerdiği hataların herhangi bir araç çalıştırılmadan tespit edilmesi ve sahip olduğu çeşitli özelliklerin elde edilmesini amaçlayan çalışmalardır.

Yazılımların statik olarak analiz edilmeleri çıplak gözle kontrol etmek suretiyle yapılabileceği gibi statik kod analiz araçlarının kullanıma alınmasıyla otomatik şekilde de yapılabilmektedir. Her iki yöntemin de avantaj ve dezavantajları bulunur. Araştırmalar gözden geçirmelerin otomatik analizlere kıyasla daha etkili olduğunu göstermektedir. Statik analiz araçları daha çok atama ve denetim gibi programlama hatalarını tespit ederken, gözden geçirmeler fonksiyonel hataları da ortaya çıkarabilmektedir. Bununla beraber, gözden geçirmelerde insan faktörüne bağlı şekilde zamanla oluşan dikkat dağılması, hataların gözden kaçırılmasına neden olabilmektedir. Gözden geçirmeler zaman ve kaliteli iş gücü gerektirdiği için maliyet bakımından da olumsuz karşılanmaktadır. Ayrıca incelenecek kaynak kodun boyutuyla orantılı olarak harcanacak çaba da artacağından ölçeklenebilir değildir.

Otomatik statik kod analizinde ise yazılımda bulunan problemler çok hızlı bir şekilde tespit edilebilmektedir. Araç kullanımı sayesinde farklı boyutlara sahip kaynak kodlardaki hatalar benzer maliyetlerle tespit edilebilmektedir. Ayrıca bu araçlar sayesinde yazılım hakkında bir çok bilgi ve analiz sonuçları metinsel ve grafiksel olarak raporlanabilmektedir. Bununla beraber kaynak kodların otomatik şekilde analiz edilmesi, yazılım bağlamına tam olarak hâkim olunmamasına neden olabilmektedir. Büyük yazılımlarda yazılım bağlamına tam hâkimiyet beklenmediğinden bu durum bir dezavantaj olarak görülmemektedir. Sonuç olarak, otomatikleştirilmiş statik kod analizinin ölçeklenebilir olması, tutarlı yapısı ve maliyet bakımından uygun olması nedeniyle kaynak kod gözden geçirme yöntemine göre bir adım öne çıkmaktadır.

Statik kod analizinde incelenen konular şu şekildedir :

-Hata ve Güvenlik Açıkları
-Kaynak Kod Metrikleri
-Mimari Analiz
-Kodlama Standartları
-Tersine Mühendislik

Yazılım kaynak kodlarının statik analizleri için araç kullanımının maliyet bakımından önemi ortadadır. Analiz sırasında kaynak kod metriklerinde belirtilen konulardan bir ya da birkaçını inceleyen açık kaynak kodlu ve ticari çok sayıda araç mevcuttur. Etraflı bir analiz için kapsamı en geniş olan aracı tercih etmekte fayda vardır. Bununla beraber birbirini tamamlayan araçlar da kullanılabilir. Statik olarak incelenebilecek konuların çok çeşitli olması nedeniyle, bazı firmalar tek bir araç yerine bir araç seti sunmaktadır. Bu araç setinde bulunan ilgili araç kullanılarak istenen analiz yapılabilmektedir. Mevcut statik kod analizi araçlarının bir bölümü yazılımın kaynak kodunu metinsel olarak incelemekte ve ekstra bir bilgiye ihtiyaç duymamaktadır. Daha ayrıntılı analiz yapan araçlar ise kullanılacak olan platform ve derleyici bilgilerine ihtiyaç duymaktadır. Kaynak kodun derlenerek analiz edilmesi daha güvenli ve detaylı sonuçların alınmasına imkân sağlamaktadır.

Özel bir test ortamının kurulmasını gerektirmemesi sayesinde yazılım geliştirme sürecinin ambalajlama öncesi her adımında kolaylıkla uygulanabilir olan statik kod analizinin her işletmenin kendi geliştirme sürecine en çok uyum gösterecek şekilde entegre edilmesi azami faydayı sağlayacaktır. Statik kod analizinin benimsenmesi ve etkili olarak kullanılması yalnızca aracın elde edilmesine bağlı olmayıp, iyi bir stratejinin ve örgütsel yönlendirmelerin belirlenmesini gerektirmektedir. Bu sebeple statik kod analizinin yazılım geliştirme sürecine dâhil edilmesi aşamasında, statik kod analizi aracının kimler tarafından kullanılacağı, hangi süreç adımlarında kullanıma alınacağı ve sonuçlarının nasıl değerlendirileceği belirlenmelidir.

Statik kod analizinin yazılım geliştirme sürecinde yerini alması ile yazılımların daha hızlı, nitelikli ve güvenli geliştirilmesi sağlanabilmektedir. Bu durumu mümkün kılan kazanımlar alt başlıklar halinde sıralanmıştır.

-Gözden Geçirme Sürelerinin Azalması
-Test Maliyetlerinin Azalması
-Bakım Maliyetlerinin Azalması
-Yazılım Kalitesinin Yükselmesi    

Statik kod analizinin yazılımı gözden geçirmesi ve testler öncesinde uygulanmasının önemli faydalar sağladığı görülmüştür. Statik kod analiziyle gerekli yazılım iyileştirmelerinin yapılması erken safhalarda mümkün olurken, gözden geçirmelerde harcanan süre de azaltılmaktadır. Bu analiz ile olası hataların giderilmesine harcanan zaman ve maliyetin artmadan ortadan kaldırılabileceği görülmüştür. Bu sayede test maliyetlerinin azaldığı belirlenirken, testlerde karşılaşılmayan hataların giderilmesi ile bakım maliyetlerinin de önemli ölçüde azalacağı düşünülmektedir. Ayrıca statik kod analizi sonuçlarının yorumlanmasıyla yazılımın hata yoğunluğunun öngörülebileceği ve gerekli kalite düzeltme faaliyetlerinin geç kalınmadan uygulanabileceği değerlendirilmektedir. Yazılımın diğer kalite özelliklerinin de statil kod analizi ile çıkarılarak olumsuzlukların giderilebileceği görülmüştür. Belirtilen şekillerde yazılımın iyileştirilmesi ve hataların ortadan kaldırılması ile çok daha kaliteli yazılımlar geliştirilebilecektir. Testler öncesinde tamamlayıcı olarak uygulanacak statik kod analizi ile daha güvenilir ve kaliteli yazılımların dağıtılacağı değerlendirilmektedir. Ayrıca statik kod analizi araçlarının birbirini tamamlayıcı şekilde kullanılmasıyla daha etkili sonuçlar elde edileceği görülmektedir. Başlıca statik kod analizinde kullanılan araçlar şunlardır :

-Raxis
-RIPS Technologies
-PVS-Studio
-Kiuwan
-Embold
-Reshift
-CodeScene Behavioral Code Analysis
-Visual Expert
-Veracode
-Fortify Static Code Analyzer
-Parasoft
-Coverity
-CAST
-CodeSonar
-Understand
-Code Compare

Dinamik Kod Analizi

Dinamik kod analizi, yazılımın çalıştırılarak method, kod satırı gibi seviyelerde kontrol edilmesi işlemidir. Dinamik analiz öncelikle, çalışma esnasında oluşabilecek hataların tespitini hedeflemektedir. Yazılım üzerinde, bulunduğu donanımın göstereceği performansı ve belirli girdiler alması sonrasında oluşan güvenlik açıklarını yakalamayı amaçlar.

Dinamik analiz aktiviteleri, kodun geliştirilmesinin hemen sonrasında statik analiz kontrollerinin yapılması ve derlenmesi ardından gerçekleştirilmelidir. Statik analizler ile dinamik analizde tespit edilebilecek sorunların daha basit bir şekilde çözülmesi mümkün olabilir.

Dinamik kod analizinde kodun veri tabanları ile ilişkisi, sunucular ve hizmetlerle etkileşimi incelediğinden, özellikle bu tip hatalar veya güvenlik açıklarını yakalamak için etkilidir. Ancak, dinamik analiz bazı önemli soru işaretlerini de barındırır. Örneğin, dinamik kod analizi tüm kod tabanını incelemez, yalnızca “on an” yürütülmekte olan kodun çalışmasındaki hataları bulabilir. Öte yandan, statik analiz ile bulunmayan bazı hatalar da dinamik bir testte, özellikle de kaynak kodun dışındaki servislere dayanan bölümlerle ilgili muhtemel oluşan hatalar yakalanabilmektedir. Siber güvenlik açısından doğru olan, mümkün olan en yüksek düzeyde test kapsamı elde etmek için bu iki yöntemin de birlikte kullanılmasıdır.

Örneğin, yazılmış yüksek karmaşıklığa sahip bir kod bloğu çalıştırılmadan önce olası performans problemleri tespit edilerek çözümlenebilir. Özetle, çalıştırıldıktan sonra yapılacak, görece olarak daha zorlu profiling/load generation işlemlerine gerek kalmadan hatalar ortadan kaldırılabilir. Ancak bu durum, tüm hataların statik analiz ile tespit edilmesinin mümkün olabildiği anlamına gelmemektedir. Bu aşamada dinamik analiz ile beraber kullanımı oldukça faydalı olduğu gözlemlenmiştir.

Dinamik analiz ile farklı problemlerin “kök sebep” analizi yapılabilir. Bunlardan en sık gerçekleştirilenlerinden biri ise “Dinamik Performans Analizi”dir.

Yazılımlar, performans açısından analiz edilmek için Profiling adı verilen işleme tabi tutulurlar. Profiling, farklı seviye ve şekilde yapılabildiği üzere, esas olarak kodu enstrumante edilerek, oldukça düşük seviyede (method veya kod satırı gibi) analiz edilmesi çalışmasıdır.

Çeşitli programlama dillerinde yazılmış programlarda (C, C++, Java, C #, PHP, Python, Erlang v.b.) dinamik kaynak kod analizi gerçekleştirilebilir.

Dinamik analiz araçları, kontrol edilmekte olan programla etkileşim biçimleri bakımından farklılık gösterir.

-Kaynak kodu enstrümantasyonu : Hataları tespit etmek için derlemeden önce kaynak koduna özel bir kod eklenir.
-Nesne kodu enstrümantasyonu : Çalıştırılabilir dosyaya doğrudan özel bir kod eklenir.
-Derleme aşaması enstrümantasyonu : Özel derleyici anahtarları aracılığıyla bir kontrol kodu (bu mod, örneğin, GNU C / C ++ 4.x derleyicisi tarafından desteklenir.) eklenir.
-Araç kaynak kodunu değiştirmez; bunun yerine, özel yürütme aşaması kitaplıkları kullanır. Hataları algılamak için sistem kitaplıklarının özel hata ayıklama sürümleri kullanılır.

Dinamik analiz, kontrol edilen programın girişine bir dizi veri iletilerek gerçekleştirilir. Bu nedenle, analizin etkinliği doğrudan girdi test verilerinin kalitesine ve miktarına bağlıdır.

Dinamik test size aşağıdaki ölçümleri sağlayabilir :

-Tüketilen Kaynaklar : Programın tamamında veya modüllerinde ayrı ayrı çalıştırılma süresi, harici sorguların sayısı (örnek olarak veritabanına), kullanılan bellek sayısı ve diğer kaynaklar,
-Döngüsel karmaşıklık, testlerle kod kapsamının derecesi ve diğer program ölçümleri,
-Program hataları : Sıfıra bölme, boş işaretçi referans alma (null point exception), bellek sızıntıları,
-Programdaki güvenlik açıkları.

Dinamik kaynak kod analizi, program güvenilirliğinin, yanıt süresinin ve tüketilen kaynakların çok önemli olduğu alanlarda çok değerlidir. Örneğin, bir üretim alanını yöneten gerçek zamanlı bir sistem veya bir veritabanı sunucusunda meydana gelen herhangi bir hata işletme için kritik olabilir.      

Beyaz kutu ve kara kutu prensiplerinde dinamik testler yapılabilir. Tek farkları, "beyaz kutu" durumunda program kodu hakkında bilgi sahibi olmanız, "kara kutu" durumunda ise buna sahip olmamanızdır. Program yapısını bildiğinizde "gri kutu" olarak adlandırılan yöntem de vardır, ancak bu veriler testin kendisinde kullanılmaz.

Dinamik kaynak kod analizi, ürünün iyi çalıştığından emin olmayı veya programın çalışmadığını gösteren hataları ortaya çıkarmayı sağlar. Testin ikinci amacı, programın dezavantajlarını görmezden gelinmesine izin vermediği için kalite geliştirme açısından daha üretken bir hedeftir. Ancak test sırasında herhangi bir kusur ortaya çıkmazsa, bu kesinlikle hiç olmadığı ayrıca dinamik test mantık hatalarını ortaya çıkaramayacağından, testlerde yüzde yüz kod kapsamı bile kodda hata olmadığı anlamına gelmez. Bir diğer önemli husus, test araçlarının kendilerinin de hataları olup olmadığıdır. Girdi test verilerinin oluşturulması için ayrı bir görev üçüncü taraf yardımcı programları kullanılabilir. Bazı yardımcı programlar aşağıdaki yöntemi kullanır. Giriş verilerini işaretler ve program yürütülürken hareketlerini izlerler. Testin başlatılmasının bir sonraki yinelemesinde, yardımcı program yeni bir dizi girdi parametresi oluşturacak ve gerekli sonucu elde edene kadar çalışmaya devam edecektir.

Dinamik kaynak kodu testi gerçekleştirirken, enstrümantasyonun test edilen programın yürütülmesi üzerindeki etkisini de en aza indirilmesi gerekmektedir (geçici özellikler, tüketilen kaynaklar veya program hataları).

Dinamik kaynak kod analiz çeşitleri şu şekildedir :

-Kod Kapsamı
-Bellek Hata Keşfi
-Hata Yeri Tespiti
-Değişmez Çıkarım 
-Eşzamanlılık Hataları
-Program Dilimleme
-Performans Analizi

Performans amaçlı dinamik kod analizi için Java ekosisteminde kullanılabilecek, önde gelen araçlar aşağıdaki gibidir.

-Visual VM
-JProfiler
-Java Mission Control
-YourKit
-NetBeans Profiler
-JProbe
-XRebel

Bunlar arasından VisualVM ve JProfiler en sık kullanılan iki uygulama olarak öne çıkmaktadır.

VisualVM: Bir Java uygulamasını çalıştırıp, ayağa kaldırdıktan sonra projemiz Visual VM’de gözükmektedir. Monitör bölümünde anlık olarak değişen grafikler bulunmaktadır. CPU, Classes, Threads, Heap ve Metaspace gibi bilgilendirmeler verilmektedir.

Jprofiler: Bu analiz aracı da genel itibariyle Visual VM aracıyla benzerlik göstermektedir. Görselde de görüldüğü üzere Memory, Heap, CPU, Threads ve Databases gibi alanlarda kodları analiz edip, sonuçları göstermektedir

Dinamik kaynak kod analizinin avantajları ve dezavantajları şunlardır:

Avantajları

-Çoğu durumda, hata tespiti tam oluştuğu anda gerçekleştiğinden, false pozitive durumunun oluşması imkansızdır; bu nedenle, tespit edilen hata, program modelinin analizine dayalı bir tahmin değil, meydana geldiği gerçeğinin bir ifadesidir.
-Genellikle kaynak koduna ihtiyacınız yoktur; özel kodu test etmenize olanak tanır.

Dezavantajları

-Dinamik kaynak kodu analizi, yalnızca somut girdi verileriyle tanımlanan rotadaki hataları algılamakta, diğer kod parçaları hesaba katılmamaktadır.
-Kod işleminin doğruluğunu -kodun yapması gerekeni yapıp yapmadığını- kontrol edemez.
-Testi gerçekleştirmek için önemli hesaplama kaynakları gereklidir. (Çok fazla kaynak tüketimi.)
-Her bir analizde yalnızca bir çalıştırma yolu kontrol edilebilir, bu da mümkün olduğunca eksiksiz bir test için dinamik kaynak kodu analizini birçok kez çalıştırmanıza neden olur.
-Dinamik kaynak kodu analizini gerçek bir işlemci üzerinde çalıştırıldığında, yanlış kodun çalıştırılması öngörülemeyen sonuçlara yol açabilir.