Die Priorisierung von Schwachstellen ist eine entscheidende Phase, in der die relativen Risiken und die Reihenfolge ihrer Behebung bewertet und in der Reihenfolge von der höchsten bis zur niedrigsten Priorität eingestuft werden. In meinem vorherigen Artikel habe ich erläutert, . In diesem Artikel führe ich Sie durch meinen individuellen Ansatz zur Bewertung der Behebungspriorität und zeige, wie ich diese Funktionalität in die Budibase-Plattform integriert habe. wie Sie Sicherheitslücken mit Budibase beheben können Während des Sanierungsprozesses treten häufig mehrere Herausforderungen auf: Es gibt eine große Anzahl von Schwachstellen mit unterschiedlichen Risikostufen bei verschiedenen Vermögenswerten. Sich bei der Bestimmung der Priorität ausschließlich auf CVSS-Risikobewertungen zu verlassen, ist nicht immer effektiv, wie Penetrationstests häufig zeigen. Einige Schwachstellen können aufgrund schlecht konzipierter Anwendungsentwicklungsprozesse oder in manchen Fällen aufgrund mangelnder Unterstützung durch den Anbieter nicht schnell behoben werden. Theorie und Prioritätsmetriken Nach dem Scannen auf Schwachstellen ist es wichtig, die Ergebnisse zu analysieren und Prioritäten für die Behebung festzulegen. Durch regelmäßiges Einspielen von Patches lassen sich die meisten Schwachstellen mit minimalem Aufwand beheben. Es gibt jedoch Fälle, in denen es notwendig ist, bestimmte Schwachstellen genau zu untersuchen und die damit verbundenen Risiken zu bewerten. Ist eine sofortige Behebung nicht möglich, sollten Sie die Implementierung kompensierender Maßnahmen in Betracht ziehen. Wenn Sie beispielsweise eine SQL-Injection-Schwachstelle in einer Webanwendung identifizieren, die nicht schnell gepatcht werden kann, können Sie als kompensierende Maßnahme eine Web Application Firewall (WAF) mit einer relevanten Signatur für diese Schwachstelle einsetzen. Zu Auswertungszwecken habe ich in Budibase eine Schnittstelle erstellt, die es mir ermöglicht, vorrangige Schwachstellen quantitativ zu bewerten und eine Liste im CSV-Format für unsere Kollegen zu exportieren. Ich werde die wichtigsten Kennzahlen skizzieren, auf denen ich meine Filter aufgebaut habe: : Je länger eine Sicherheitslücke ungepatcht bleibt, desto größer ist die Wahrscheinlichkeit, dass sie in Zukunft ausgenutzt wird. Mit der Zeit werden jedoch in der Regel mehr kompensierende Kontrollen und Patches verfügbar. Umgekehrt ist es unrealistisch, von Ihrem Team eine sofortige Behebung einer Sicherheitslücke zu erwarten, wenn diese erst kürzlich bekannt wurde. Daher habe ich einen Filter hinzugefügt, um Sicherheitslücken auszuschließen, die jünger als X Tage sind. Zeit seit Bekanntwerden der Sicherheitslücke : Diese Metrik bewertet die Bedeutung eines Assets, wenn es kompromittiert würde. Asset-Kritikalität : Dieser Faktor hilft zu bestimmen, wie stark die Anlage unkontrollierten Netzwerksegmenten ausgesetzt ist und welche kompensierenden Kontrollen je nach Platzierung gelten. Ich habe diese Metrik mit der Kritikalität kombiniert; Anlagen am Perimeter werden als hohe Priorität gekennzeichnet. Standort der Anlage : Dieser Parameter gibt an, ob die Schwachstelle aktuell ausgenutzt wird. Bietet ein Anbieter oder Threat-Intelligence-Anbieter einen Trend-Score an, kann dieser Parameter im Filter verwendet werden. Schwachstellentrend : Dieser wird aus CVSS-Metriken abgeleitet, beispielsweise der lokalen im Vergleich zur Remote-Ausnutzbarkeit. Exploit-Vektor : Dies gibt an, ob für die Sicherheitslücke bereits ein funktionierender Exploit vorhanden ist. Exploit-Verfügbarkeit : Dies spiegelt die grundlegende Kritikalitätsbewertung gemäß den standardmäßigen CVSS-Metriken wider. CVSS-Schweregrad : Dies gibt an, ob Fixes oder Updates des Anbieters zur Behebung der Sicherheitslücke vorhanden sind. Patch-Verfügbarkeit Zusammengenommen helfen diese Kennzahlen dabei, Schwachstellen anhand ihrer potenziellen Auswirkungen und der Effizienz der Reaktionsstrategien zu priorisieren. Implementieren von Priorisierungsfiltern in Budibase Das Hauptziel dieser Implementierung besteht darin, sicherzustellen, dass die Dashboards und die zugehörigen Daten bei jeder Änderung von Filterparametern automatisch aktualisiert werden. So können die für das Patching zuständigen Kollegen die relevantesten Ergebnisse exportieren. In Budibase erfolgt die Filterung über UI-Filterelemente. Der ausgewählte Wert wird über Bindings als Variable an die SQL-Abfrage übergeben. Diese Variablen werden in den Einstellungen des Diagrammelements konfiguriert. Die Bindings werden, wie im Beispiel gezeigt, in der Mitte des Bildes unten angezeigt. In der SQL-Abfrage werden Variablen mit doppelten geschweiften Klammern {{ var }} an den entsprechenden Stellen eingefügt. Dadurch wird eine voll funktionsfähige SQL-Abfrage gewährleistet. Die SQL-Abfrage wird auf der Registerkarte „Daten“ im Abschnitt „Datenbankverbindung“ erstellt. Dort definieren Sie auch die Bindungen für die SQL-Abfrage und legen Standardwerte fest, falls der Filter leer ist oder nichts ausgewählt ist. Beispiele für SQL-Abfragen mit Priorisierung zur Dashboard-Erstellung Hier sind einige Beispiele für SQL-Abfragen, die zum Erstellen von Dashboards verwendet werden können, jeweils mit Priorisierungsfiltern. Dashboard 1: Die 10 anfälligsten Vermögenswerte 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; Dashboard 2: Die 10 am stärksten gefährdeten Dienste 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; Dashboard 3: Top 10 der aktiven CVEs 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; Was das alles bringt 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; Letztendlich entwickelte sich dieses Setup zu einem einfachen und dennoch effektiven Tool, um die problematischsten Assets und Dienste anhand der kritischsten Schwachstellen hervorzuheben. Darüber hinaus ermöglicht es den einfachen Export dieser Informationen bei Bedarf. Auch wenn Sie kein Budget für eine teure Vulnerability-Management-Plattform (VM) haben, bedeutet das nicht, dass Sie Schwachstellen nicht effektiv priorisieren können. Vielen kommerziellen VM-Lösungen fehlt möglicherweise die nötige Flexibilität bei der Priorisierung, die bestimmte Infrastrukturen erfordern. Fazit: Im nächsten Artikel werde ich das untersuchen, zeigen, wie es in Budibase implementiert wird, und eine Funktion zum Exportieren einer Liste priorisierter Schwachstellen hinzufügen. Exploit Prediction Scoring System (EPSS) Ich würde mich freuen, von Ihnen zu hören: Verwenden Sie bei Ihrer Arbeit die Priorisierung von Schwachstellen? Wie verfolgen Sie kritische Vermögenswerte?