Siber güvenlik dünyasındaki herkes CVE’nin ne olduğunu bilmektedir. CVE (Common Vulnerabilities and Exposures – Yaygın Zafiyetler ve Maruziyetler), bilgisayar sistemlerinde bulunmuş güvenlik açıklıklarının bir kataloğudur. Kurumlar bir zafiyet duyurulduğunda eğer sistemleri bu zafiyeti içeren bir komponente sahipse, hemen aksiyon alırlar. CVE’nin, kendisi kadar popüler olmayan ama bir o kadar önemli olan bir kardeşi vardır: CWE.
CWE (Common Weakness Enumeration – Yaygın Zayıflık Sınıflandırması) MITRE tarafından desteklenen, yazılım ve donanımlarda zafiyetlere yol açabilecek zayıflıkların bir sınıflandırmasıdır. Zayıflık ve zafiyet birbirinden farklı kavramlardır. Zayıflık; bir yazılımın mimari, tasarım, kod veya implementasyonunda yapılan hatalardır. Zafiyet ise bu zayıflıklar sebebiyle ortaya çıkan, saldırganlar tarafından sömürülebilen güvenlik açıklıklarını ifade eder. Bu sebeple, CWE listesi güvenlikçileri ilgilendirdiği gibi yazılım geliştiricileri de ilgilendirir.
CWE Resmi Web Sitesi adresine baktığımızda CWE’lerin sınıflandırılmasında birden fazla kavramın bulunduğunu görürürüz. Category ve Türkçeye görünüm olarak çevirebileceğimiz View kavramlarıyla başlayalım. Kavramların tanımına geçmeden önce kategori ve görünümlerin, birer zayıflık olmasalar da zayıflıklar gibi CWE ID’sine sahip olduklarını belirtmekte fayda vardır. Bu tür yapısal CWE’ler zayıflıklar gibi zafiyetlerle eşleştirilmezler, zayıflıkları farklı amaçlara göre sınıflandırmaya yaramaktadırlar.
Kategoriler, ortak karakteristik özellikler gösteren CWE’leri bir arada göstermek için oluşturulmuştur. Bir kategorinin altındaki zayıflıklar aynı konuyla/sorunla ilişkilidir. Örnek verecek olursak CWE-310: Cryptographic Issues kategorisi, kriptografiyle ilgili zayıflıkları içerir. Buna karşılık görünümler, zayıflıkları daha farklı perspektif/amaçlara göre sınıflandırabilir. Bir görünüm altındaki CWE’ler aynı sorunla alakalı olmak zorunda değildir. CWE-658: Weaknesses in Software Written in C görünümünde göreceğimiz üzere, görünümler zayıflıkları kullanılan dil gibi daha farklı perspektiflere göre sınıflandırabilmektedir. Genelde görünümlerin altında kategoriler ve birazdan bahsedeceğimiz Pillar tipindeki zayıflıklar olur ve ağaç yapısı gibi dallanıp budaklanır.
Bahsetmemiz gereken bir diğer konu, zayıflık soyutlamasıdır. Temelde 4 adet zayıflık tipi vardır: Pillar (Türkçeye dayanak olarak çevirebiliriz), Class (sınıf), Base (baz) ve Variant (varyant). Dayanak tipindeki zayıflıklardan varyant tipindekilere gittikçe davranış, karakteristik, etkilenen kaynak, kullanılan dil ve teknoloji açısından verilen bilgiler artmaktadır. Dayanak tipindeki zayıflıklar çok soyut oldukları için kategorilere oldukça benzemektedirler ancak var olma amaçları sınıflandırmak değil, bir hatayı tanımlamaktır. Bu yüzden zayıflık olarak değerlendirilmişlerdir.
Daha önceden kategori ve görünümlerin zafiyetlerle eşleştirilemediğini söylemiştik, bunun yanı sıra her zayıflık da eşleştirilemez. Genelde zafiyet eşleştirmesinde baz veya varyant tipindeki zayıflıklar kullanılır. Eğer zafiyetle alakalı baz yahut varyant zayıflığı yoksa, sınıf tipindeki zayıflıklar da kullanılabilmektedir. Her CWE’nin bilgi sayfasında zafiyetle eşleştirilebilirliğiyle ilgili bir ibare vardır.
CWE sınıflandırmasıyla ilgili temel kavramları incelediğimize göre bir CWE’nin bilgi sayfasına girip göz atabiliriz. Örnek olarak, baz tipindeki bir zayıflık olan CWE-250: Execution with Unnecessary Privileges zayıflığını ele alalım. Zayıflığın sayfasına girdiğimizde, başlıkları filtreleyerek yalnızca ihtiyaç duyduğumuz bilgilere ulaşabildiğimizi görüyoruz. Zayıflığın pratikteki örnekleri ve nasıl giderilebileceğiyle ilgilendiğimiz için hazır Operational filtresi ile devam edebiliriz.
En başta zayıflık ile ilgili genel bir bilgi veriliyor. Ele aldığımız zayıflık, gereğinden fazla yetki kullanımıyla ilgilidir. Yazılım geliştirirken bazı güvenlik mekanizmalarını devre dışı bırakıp işimizi kolaylaştırdığı için, başka bir yolu varken gereğinden fazla yetkiyle işlemler yapabiliriz. Ya da gerçekten yetki yükseltmemiz gerekir, ancak bu yetkinin gerekli işlem yapıldıktan sonra hemen, doğru bir şekilde bırakılması gerekir. Aksi halde bu durum güvenlik açıklarına sebep olabilir. Zayıflığın bilgi sayfasında bu soruna yazılım geliştirme yaşam döngüsünün hangi noktasında nasıl yaklaşacağımızı söyleyen Potential Mitigations bölümü bulunmaktadır. Bu bölümde tasarım aşamasından, implementasyon aşamasına kadar bilgiler verilmektedir. Sonrasında Demonstrative Examples bölümünde örneklerle pekiştirmektedir (İçerik zenginliği zayıflıktan zayıflığa göre değişmektedir).
Yukarıdaki örnekte os.mkdir() işleminden önce yetki yükseltilmekte ve sonrasında bırakılmaktadır. Ancak os.mkdir() adımında bir hata fırlatılması durumunda yetki düşürme işlemi gerçekleşmeyecektir. Uygulama yüksek yetkiyle çalışmaya devam edecek ve başka zayıflıkların sömürülmesine sebep olacak, ya da etkisini artıracaktır.
Bir diğer örnekte, bir yetkinin gereksiz kullanımı ele alınmıştır. Konum bilgisine, örnekte olduğu gibi eyaleti saptamak için ihtiyaç olduğunda ACCESS_FINE_LOCATION yetkisine ihtiyaç yoktur. Bunun için ACCESS_COARSE_LOCATION kullanılabilir. Burada gereğinden fazla bir yetkiye erişim söz konusudur.
Bu iki bölüm dışında zayıflığın dil/teknoloji özelinde olup olmadığı hakkında bilgi veren, eşleştirildiği zafiyetleri listeleyen, zayıflığın hangi kategoriye girdiği ya da görünümlerle (ve diğer zayıflıklarla) ilişkisini gösteren bölümler mevcuttur. Sohbet ederken konu konuyu açar da zaman geçip gider ya, ilişkili zayıflıklara bakarken bilgisayar başında uzun ve keyifli saatler geçirebilirsiniz. Bunun yanısıra şahsi görüşüm, CWE sınıflandırmasının biraz karmaşık olduğu şeklinde. Sebebinin mevzubahis içeriğin oldukça kapsamlı olması ve yıllar içinde ihtiyace binaen yapısal değişiklikler gerçekleştirilmesi. Bu yüzden sunum kısmında neler yapabilirizi düşündüğümüz, CWE veritabanını kullanarak oluşturacağımız bir uygulamamız bulunmakta. Erken geliştirme aşamasında olan bu uygulamanın mevcut halinden bir kesit aşağıdadır.