Güvenlik açığı önceliklendirmesi, güvenlik açıklarının göreceli risklerinin ve giderilme sırasının en yüksekten en düşüğe doğru değerlendirildiği kritik bir aşamadır. Önceki yazımda, ele almıştım. Bu yazımda ise, iyileştirme önceliğini değerlendirmeye yönelik özel yaklaşımım konusunda size rehberlik edecek ve bu işlevselliği Budibase platformuna nasıl entegre ettiğimi göstereceğim. Budibase kullanarak güvenlik açıklarının nasıl yönetilebileceğini İyileştirme sürecinde sıklıkla çeşitli zorluklar ortaya çıkar: Farklı varlıklarda değişen risk seviyelerine sahip yüksek hacimli güvenlik açıkları bulunmaktadır. Önceliği belirlemek için yalnızca CVSS risk puanlarına güvenmek her zaman etkili değildir; bunu penetrasyon testleri sıklıkla ortaya koyar. Bazı güvenlik açıkları, kötü tasarlanmış uygulama geliştirme süreçleri veya bazı durumlarda satıcı desteğinin eksikliği nedeniyle hızlı bir şekilde giderilemez. Teori ve Öncelik Ölçütleri Güvenlik açıklarını taradıktan sonra, sonuçları analiz etmek ve düzeltme önceliklerini belirlemek çok önemlidir. Düzenli olarak yama uygulamak, çoğu güvenlik açığını minimum çabayla çözebilir. Ancak, belirli güvenlik açıklarını yakından incelemenin ve ilgili riskleri değerlendirmenin gerekli olduğu durumlar vardır. Hemen düzeltme yapmak mümkün değilse, telafi edici kontroller uygulamayı düşünün. Örneğin, bir web uygulamasında hızlı bir şekilde yamalanamayan bir SQL enjeksiyonu güvenlik açığı tespit ederseniz, bu güvenlik açığı için ilgili bir imzaya sahip bir telafi edici kontrol olarak bir Web Uygulama Güvenlik Duvarı (WAF) kullanabilirsiniz. Değerlendirme amacıyla, Budibase'de öncelikli güvenlik açıklarını nicel olarak değerlendirmeme ve meslektaşlarımız için .csv formatında bir listeyi dışarı aktarmama olanak tanıyan bir arayüz oluşturdum. Filtrelerimi oluştururken kullandığım temel metrikleri özetleyeceğim: : Bir güvenlik açığı ne kadar uzun süre yamalanmadan kalırsa, gelecekte bir istismarın ortaya çıkma olasılığı o kadar artar. Ancak, zaman geçtikçe, genellikle daha telafi edici denetimler ve yamalar kullanıma sunulur. Tersine, bir güvenlik açığı yakın zamanda açıklanmışsa, ekibinizden anında yama beklemek gerçekçi değildir. Bu nedenle, X günden daha eski güvenlik açıklarını hariç tutmak için bir filtre ekledim. Güvenlik Açığının Açıklanmasından Bu Yana Geçen Süre : Bu ölçüm, bir varlığın tehlikeye girmesi durumunda ne kadar önemli olduğunu değerlendirir. Varlık Kritikliği : Bu faktör, varlığın kontrolsüz ağ segmentlerine ne kadar maruz kaldığını ve yerleşimine bağlı olarak hangi telafi edici kontrollerin geçerli olduğunu belirlemeye yardımcı olur. Bu ölçütü kritiklik ile birleştirdim; çevrede bulunan varlıklar yüksek öncelikli olarak işaretlendi. Varlık Konumu : Bu, güvenlik açığının şu anda istismar edilip edilmediğini gösterir. Bir satıcı veya tehdit istihbarat sağlayıcısı bir trend puanı sunuyorsa, bu parametre filtrede kullanılabilir. Güvenlik Açığı Trendi : Bu, yerel ve uzak istismar edilebilirlik gibi CVSS ölçümlerinden türetilir. Exploit Vektörü : Bu, güvenlik açığı için halihazırda çalışan bir exploit'in mevcut olup olmadığını gösterir. Exploit Kullanılabilirliği : Bu, standart CVSS metriklerine göre temel kritiklik derecesini yansıtır. CVSS Önem Derecesi : Bu, satıcının güvenlik açığını gidermek için düzeltmeler veya güncellemeler sunup sunmadığını gösterir. Yama Kullanılabilirliği Bu ölçümler toplu olarak, potansiyel etkilerine ve müdahale stratejilerinin verimliliğine göre güvenlik açıklarının önceliklendirilmesine yardımcı olur. Budibase'de Önceliklendirme Filtrelerinin Uygulanması Bu uygulamanın temel amacı, herhangi bir filtre parametresi değiştiğinde panoların ve ilgili verilerin otomatik olarak güncellenmesini sağlamaktır. Bu sayede, yama uygulamasından sorumlu çalışanlar en alakalı sonuçları dışa aktarabilir. Budibase'de filtreleme, kullanıcı arayüzü filtre öğeleri aracılığıyla yapılır. Seçilen değer, bağlamalar kullanılarak SQL sorgusuna değişken olarak aktarılır. Bu değişkenler, grafik öğesinin ayarlarında yapılandırılır. Bağlamalar, örnekte gösterildiği gibi, aşağıdaki görselin ortasında görüntülenir. SQL sorgusunda, değişkenler uygun yerlere çift süslü parantez {{ var }} kullanılarak eklenir. Bu, tam işlevli bir SQL sorgusu sağlar. SQL sorgusu veritabanı bağlantısı bölümünün altındaki Veri sekmesinde oluşturulur. Ayrıca SQL sorgusu için bağlamaları tanımladığınız ve filtre boşsa veya hiçbir şey seçilmemişse varsayılan değerleri ayarladığınız yer burasıdır. Pano Oluşturma İçin Önceliklendirmeli SQL Sorgularına Örnekler Her biri önceliklendirme filtreleri içeren panolar oluşturmak için kullanılabilecek SQL sorgularına dair birkaç örnek aşağıda verilmiştir. Gösterge Paneli 1: En Savunmasız 10 Varlık SELECT COUNT(hostname) AS total, hostname FROM mat_allassets WHERE osname ILIKE '%windows 20%' AND status = 'new' AND VulnerabilityIssueTime < CURRENT_DATE - {{days}}::interval AND ( CASE WHEN {{ sev }}::text IS NULL THEN TRUE ELSE severity = {{ sev }}::text END ) AND ( CASE WHEN {{expltbl}}::bool IS NULL THEN TRUE ELSE metrics ILIKE 'Exploitable: {{expltbl}}%'::text END ) AND ( CASE WHEN {{netvector}}::bool IS NULL THEN TRUE ELSE metrics ILIKE '%HasNetworkAttackVector: {{netvector}}%'::text END ) AND ( CASE WHEN {{remedy}}::bool IS NULL THEN TRUE ELSE metrics ILIKE '%HasFix: {{remedy}}%'::text END ) AND ( CASE WHEN {{vulntrend}}::bool IS NULL THEN TRUE ELSE VulnerIsTrend = '{{vulntrend}}'::text END ) AND ( CASE WHEN {{hostimport}}::text IS NULL THEN TRUE ELSE HostImportance = '{{hostimport}}'::text END ) GROUP BY hostname ORDER BY total DESC LIMIT 10; Pano 2: En Çok Güvenlik Açığı Yaşayan 10 Hizmet SELECT COUNT(hostname) AS total, hostname FROM mat_allassets WHERE osname ILIKE '%windows 20%' AND status = 'new' AND VulnerabilityIssueTime < CURRENT_DATE - {{days}}::interval AND ( CASE WHEN {{ sev }}::text IS NULL THEN TRUE ELSE severity = {{ sev }}::text END ) AND ( CASE WHEN {{expltbl}}::bool IS NULL THEN TRUE ELSE metrics ILIKE 'Exploitable: {{expltbl}}%'::text END ) AND ( CASE WHEN {{netvector}}::bool IS NULL THEN TRUE ELSE metrics ILIKE '%HasNetworkAttackVector: {{netvector}}%'::text END ) AND ( CASE WHEN {{remedy}}::bool IS NULL THEN TRUE ELSE metrics ILIKE '%HasFix: {{remedy}}%'::text END ) AND ( CASE WHEN {{vulntrend}}::bool IS NULL THEN TRUE ELSE VulnerIsTrend = '{{vulntrend}}'::text END ) AND ( CASE WHEN {{hostimport}}::text IS NULL THEN TRUE ELSE HostImportance = '{{hostimport}}'::text END ) GROUP BY hostname ORDER BY total DESC LIMIT 10; SELECT COUNT(hostname) AS total, VulnerableEntity || ' ' || VulnerableEntityVersion AS VulnerableObject FROM mat_allassets WHERE osname ILIKE '%windows 20%' AND VulnerableEntity IS NOT NULL AND status = 'new' AND VulnerabilityIssueTime < CURRENT_DATE - {{days}}::interval AND ( CASE WHEN {{ sev }}::text IS NULL THEN TRUE ELSE severity = {{ sev }}::text END ) AND ( CASE WHEN {{expltbl}}::bool IS NULL THEN TRUE ELSE metrics ILIKE 'Exploitable: {{expltbl}}%'::text END ) AND ( CASE WHEN {{expltbl}}::bool IS NULL THEN TRUE ELSE metrics ILIKE 'Exploitable: {{expltbl}}%'::text END ) AND ( CASE WHEN {{netvector}}::bool IS NULL THEN TRUE ELSE metrics ILIKE '%HasNetworkAttackVector: {{netvector}}%'::text END ) AND ( CASE WHEN {{remedy}}::bool IS NULL THEN TRUE ELSE metrics ILIKE '%HasFix: {{remedy}}%'::text END ) AND ( CASE WHEN {{vulntrend}}::bool IS NULL THEN TRUE ELSE VulnerIsTrend = '{{vulntrend}}'::text END ) AND ( CASE WHEN {{hostimport}}::text IS NULL THEN TRUE ELSE HostImportance = '{{hostimport}}'::text END ) GROUP BY VulnerableObject ORDER BY total DESC LIMIT 10; Pano 3: En İyi 10 Aktif CVE SELECT COUNT(hostname) AS total, VulnerableEntity || ' ' || VulnerableEntityVersion AS VulnerableObject FROM mat_allassets WHERE osname ILIKE '%windows 20%' AND VulnerableEntity IS NOT NULL AND status = 'new' AND VulnerabilityIssueTime < CURRENT_DATE - {{days}}::interval AND ( CASE WHEN {{ sev }}::text IS NULL THEN TRUE ELSE severity = {{ sev }}::text END ) AND ( CASE WHEN {{expltbl}}::bool IS NULL THEN TRUE ELSE metrics ILIKE 'Exploitable: {{expltbl}}%'::text END ) AND ( CASE WHEN {{expltbl}}::bool IS NULL THEN TRUE ELSE metrics ILIKE 'Exploitable: {{expltbl}}%'::text END ) AND ( CASE WHEN {{netvector}}::bool IS NULL THEN TRUE ELSE metrics ILIKE '%HasNetworkAttackVector: {{netvector}}%'::text END ) AND ( CASE WHEN {{remedy}}::bool IS NULL THEN TRUE ELSE metrics ILIKE '%HasFix: {{remedy}}%'::text END ) AND ( CASE WHEN {{vulntrend}}::bool IS NULL THEN TRUE ELSE VulnerIsTrend = '{{vulntrend}}'::text END ) AND ( CASE WHEN {{hostimport}}::text IS NULL THEN TRUE ELSE HostImportance = '{{hostimport}}'::text END ) GROUP BY VulnerableObject ORDER BY total DESC LIMIT 10; Tüm Bunların Getirdiği SELECT COUNT(DISTINCT hostname) AS total, cve FROM mat_allassets WHERE osname ILIKE '%windows 20%' AND status = 'new' AND cve IS NOT NULL AND VulnerabilityIssueTime < CURRENT_DATE - {{ days }}::interval AND ( CASE WHEN {{ sev }}::text IS NULL THEN TRUE ELSE severity = {{ sev }}::text END ) AND ( CASE WHEN {{expltbl}}::bool IS NULL THEN TRUE ELSE metrics ILIKE 'Exploitable: {{expltbl}}%'::text END ) AND ( CASE WHEN {{netvector}}::bool IS NULL THEN TRUE ELSE metrics ILIKE '%HasNetworkAttackVector: {{netvector}}%'::text END ) AND ( CASE WHEN {{remedy}}::bool IS NULL THEN TRUE ELSE metrics ILIKE '%HasFix: {{remedy}}%'::text END ) AND ( CASE WHEN {{vulntrend}}::bool IS NULL THEN TRUE ELSE VulnerIsTrend = '{{vulntrend}}'::text END ) AND ( CASE WHEN {{hostimport}}::text IS NULL THEN TRUE ELSE HostImportance = '{{hostimport}}'::text END ) GROUP BY cve ORDER BY total DESC LIMIT 10; SELECT COUNT(DISTINCT hostname) AS total, cve FROM mat_allassets WHERE osname ILIKE '%windows 20%' AND status = 'new' AND cve IS NOT NULL AND VulnerabilityIssueTime < CURRENT_DATE - {{ days }}::interval AND ( CASE WHEN {{ sev }}::text IS NULL THEN TRUE ELSE severity = {{ sev }}::text END ) AND ( CASE WHEN {{expltbl}}::bool IS NULL THEN TRUE ELSE metrics ILIKE 'Exploitable: {{expltbl}}%'::text END ) AND ( CASE WHEN {{netvector}}::bool IS NULL THEN TRUE ELSE metrics ILIKE '%HasNetworkAttackVector: {{netvector}}%'::text END ) AND ( CASE WHEN {{remedy}}::bool IS NULL THEN TRUE ELSE metrics ILIKE '%HasFix: {{remedy}}%'::text END ) AND ( CASE WHEN {{vulntrend}}::bool IS NULL THEN TRUE ELSE VulnerIsTrend = '{{vulntrend}}'::text END ) AND ( CASE WHEN {{hostimport}}::text IS NULL THEN TRUE ELSE HostImportance = '{{hostimport}}'::text END ) GROUP BY cve ORDER BY total DESC LIMIT 10; Sonuç olarak, bu kurulum, en kritik güvenlik açıklarına dayanarak en sorunlu varlıkları ve hizmetleri vurgulamak için basit ama etkili bir araç haline geldi. Ayrıca, bu bilgilerin gerektiğinde kolayca dışa aktarılmasına da olanak tanıyor. Pahalı bir güvenlik açığı yönetimi (VM) platformu için bütçenizin olmaması, güvenlik açıklarını etkili bir şekilde önceliklendiremeyeceğiniz anlamına gelmez. Birçok ticari VM çözümü, belirli altyapıların gerektirdiği önceliklendirme esnekliğinden yoksun olabilir. Özet: Bir sonraki makalede inceleyeceğim, bunun Budibase'de nasıl uygulanacağını göstereceğim ve öncelikli güvenlik açıklarının listesini dışa aktarma işlevini ekleyeceğim. Exploit Tahmin Puanlama Sistemini (EPSS) Sizden haber almak isterim: Çalışmanızda zafiyet önceliklendirmesini kullanıyor musunuz? Kritik varlıkları nasıl takip ediyorsunuz?