La priorisation des vulnérabilités est une phase cruciale où les risques relatifs et l’ordre de correction des vulnérabilités sont évalués, classés de la priorité la plus élevée à la plus faible. Dans mon article précédent, j'ai expliqué . Dans cet article, je vous présenterai mon approche personnalisée pour évaluer la priorité de correction et vous montrerai comment j'ai intégré cette fonctionnalité à la plateforme Budibase. comment gérer les vulnérabilités de sécurité avec Budibase Plusieurs défis surviennent souvent au cours du processus de remédiation : Il existe un volume élevé de vulnérabilités avec des niveaux de risque variables selon les différents actifs. Se fier uniquement aux scores de risque CVSS pour déterminer la priorité n’est pas toujours efficace, comme le révèlent fréquemment les tests de pénétration. Certaines vulnérabilités ne peuvent pas être corrigées rapidement en raison de processus de développement d’applications mal conçus ou, dans certains cas, d’un manque de support du fournisseur. Théorie et mesures de priorité Après avoir analysé les vulnérabilités, il est essentiel d'analyser les résultats et de définir des priorités de correction. L'application régulière de correctifs permet de résoudre la plupart des vulnérabilités avec un minimum d'effort. Cependant, il existe des cas où il est nécessaire d'examiner attentivement des vulnérabilités spécifiques et d'évaluer les risques associés. Si une correction immédiate n'est pas envisageable, envisagez la mise en œuvre de contrôles compensatoires. Par exemple, si vous identifiez une vulnérabilité d'injection SQL dans une application web qui ne peut être corrigée rapidement, vous pouvez utiliser un pare-feu applicatif web (WAF) comme contrôle compensatoire, avec une signature adaptée à cette vulnérabilité. À des fins d'évaluation, j'ai créé une interface dans Budibase qui me permet d'évaluer quantitativement les vulnérabilités prioritaires et d'exporter une liste au format .csv pour nos collègues. Je vais décrire les principales métriques sur lesquelles j'ai construit mes filtres : : Plus une vulnérabilité reste non corrigée, plus le risque d'exploitation future est élevé. Cependant, avec le temps, des contrôles et des correctifs compensatoires sont généralement disponibles. À l'inverse, si une vulnérabilité a été divulguée récemment, il est irréaliste d'attendre une correction immédiate de la part de votre équipe. C'est pourquoi j'ai ajouté un filtre pour exclure les vulnérabilités datant de moins de X jours. Temps écoulé depuis la divulgation de la vulnérabilité : cette mesure évalue l’importance d’un actif s’il était compromis. Criticité des actifs : ce facteur permet de déterminer le degré d'exposition de l'actif aux segments de réseau non contrôlés et les contrôles compensatoires applicables en fonction de son emplacement. J'ai combiné cette mesure avec la criticité ; les actifs situés sur le périmètre sont signalés comme hautement prioritaires. Emplacement de l'actif : indique si la vulnérabilité est actuellement exploitée. Si un fournisseur ou un service de veille sur les menaces propose un score de tendance, ce paramètre peut être utilisé dans le filtre. Tendance de la vulnérabilité : il est dérivé des mesures CVSS, telles que l'exploitabilité locale ou distante. Vecteur d'exploitation : cela indique si un exploit fonctionnel existe déjà pour la vulnérabilité. Disponibilité de l'exploit : cela reflète la note de criticité de base selon les mesures CVSS standard. Gravité CVSS : cela indique si des correctifs ou des mises à jour du fournisseur existent pour corriger la vulnérabilité. Disponibilité des correctifs Ces mesures aident collectivement à hiérarchiser les vulnérabilités en fonction de leur impact potentiel et de l’efficacité des stratégies de réponse. Implémentation de filtres de priorisation dans Budibase L'objectif principal de cette implémentation est de garantir que chaque modification des paramètres de filtre entraîne la mise à jour automatique des tableaux de bord et des données associées. Cela permet aux équipes chargées des correctifs d'exporter les résultats les plus pertinents. Dans Budibase, le filtrage s'effectue via des éléments de filtre d'interface utilisateur. La valeur sélectionnée est transmise comme variable à la requête SQL via des liaisons. Ces variables sont configurées dans les paramètres de l'élément graphique. Les liaisons sont affichées au centre de l'image ci-dessous, comme illustré dans l'exemple. Dans la requête SQL, les variables sont insérées entre accolades {{var}} aux emplacements appropriés. Cela garantit une requête SQL pleinement fonctionnelle. La requête SQL est créée dans l’onglet Données sous la section de connexion à la base de données. C'est également là que vous définissez les liaisons pour la requête SQL et définissez les valeurs par défaut au cas où le filtre est vide ou si rien n'est sélectionné. Exemples de requêtes SQL avec priorisation pour la création de tableaux de bord Voici plusieurs exemples de requêtes SQL qui peuvent être utilisées pour créer des tableaux de bord, chacun comportant des filtres de priorisation. Tableau de bord 1 : Les 10 actifs les plus vulnérables 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; Tableau de bord 2 : Top 10 des services vulnérables 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; Tableau de bord 3 : Top 10 des CVE actifs 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; Ce que tout cela donne 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; Au final, cette configuration s'est avérée être un outil simple et efficace pour identifier les actifs et services les plus problématiques en fonction des vulnérabilités les plus critiques. Elle permet également d'exporter facilement ces informations selon les besoins. Ne pas disposer d'un budget pour une plateforme de gestion des vulnérabilités (VM) coûteuse ne signifie pas que vous ne pouvez pas prioriser efficacement les vulnérabilités. De nombreuses solutions de VM commerciales peuvent manquer de la flexibilité de priorisation requise par des infrastructures spécifiques. À retenir : Dans le prochain article, j'explorerai le , montrerai comment l'implémenter dans Budibase et ajouterai des fonctionnalités pour exporter une liste de vulnérabilités prioritaires. système de notation de prédiction d'exploit (EPSS) J'aimerais avoir de vos nouvelles : Utilisez-vous la priorisation des vulnérabilités dans votre travail ? Comment suivez-vous les actifs critiques ?