Paper Files / AppSec
TITRE : Architecture formelle et évolutive pour Application Security (AppSec) basée sur une analyse hybride orientée graphes et une priorisation quantitative du risque
TITRE : Architecture formelle et évolutive pour Application Security (AppSec) basée sur une analyse hybride orientée graphes et une priorisation quantitative du risque RÉSUMÉ : La complexité croissante des applications distribuées, fondées sur des microservices et intégrées à de vastes chaînes de dépendances open source, a considérablement élargi la surface d’attaque et la fréquence des vulnérabilités exploitables. Des incidents récents associés à des failles telles que Log4Shell (CVE-2021-44228) et des vulnérabilités de désérialisation non sécurisée mettent en évidence l’inadéquation des approches traditionnelles de Application Security (AppSec) centrées exclusivement sur des analyses statiques ou dynamiques isolées. Dans ce travail, nous proposons une architecture formelle et évolutive d’AppSec basée sur une analyse hybride orientée graphes, combinant l’analyse statique (SAST), l’analyse dynamique (DAST), la composition logicielle (SCA) et la modélisation des menaces automatisée au moyen de graphes de dépendance sémantique et de flux de données interprocéduraux. Nous introduisons un modèle mathématique de priorisation quantitative du risque qui intègre des métriques CVSS, une probabilité d’exploitation estimée par apprentissage statistique et la centralité structurelle dans le graphe d’appels. Nous avons implémenté un prototype distribué capable d’analyser des applications de plus de 5 millions de lignes de code, en traitant 1,2 million de nœuds de graphe avec une latence moyenne de 38 minutes par pipeline CI/CD. Nous avons évalué le système sur 42 projets open source critiques (dont Apache Struts, Spring PetClinic et NodeGoat), totalisant 9 317 vulnérabilités connues. Notre approche a réduit les faux positifs de 37,4 % par rapport aux outils SAST traditionnels et a augmenté la détection de flux exploitables réels de 28,9 %. Le mécanisme de priorisation a accru de 41 % le taux de correction des vulnérabilités critiques dans des environnements de test contrôlés, au cours de cycles de sprint de deux semaines. Les résultats démontrent que l’intégration formelle de techniques multiples sous un modèle unifié orienté graphes offre des gains substantiels en précision, évolutivité et pertinence opérationnelle, contribuant à l’évolution de l’état de l’art en AppSec et à l’intégration effective de la sécurité dans le cycle DevSecOps.
- Introduction
La sécurité des applications (Application Security – AppSec) constitue aujourd’hui l’un des principaux vecteurs de risque cybernétique dans les organisations publiques et privées. La transition vers des architectures basées sur des microservices, des API RESTful, l’infrastructure as code et des pipelines CI/CD hautement automatisés a radicalement modifié le modèle de menace traditionnel. Contrairement aux systèmes monolithiques isolés, les applications modernes intègrent des centaines, voire des milliers, de dépendances tierces, dont beaucoup évoluent de manière indépendante, introduisant des vulnérabilités latentes.
Des incidents récents illustrent l’ampleur du problème. La vulnérabilité Log4Shell (CVE-2021-44228) a permis l’exécution de code à distance via une injection JNDI, touchant des millions de systèmes à l’échelle mondiale. L’exploitation d’Apache Struts (CVE-2017-5638), associée à l’attaque contre Equifax, a mis en évidence des défaillances persistantes dans la gestion des correctifs et la validation des entrées. Dans le contexte de MITRE ATT&CK, des techniques telles que T1190 (Exploit Public-Facing Application) et T1059 (Command and Scripting Interpreter) demeurent parmi les plus prévalentes dans les rapports de Mandiant et du Verizon DBIR.
Malgré les progrès des outils SAST (Static Application Security Testing), DAST (Dynamic Application Security Testing) et SCA (Software Composition Analysis), on observe un taux élevé de faux positifs, une absence de contextualisation de l’exploitabilité et des difficultés de priorisation. Dans les environnements d’entreprise, il est courant que des milliers d’alertes soient générées par pipeline, avec une capacité de triage limitée. L’absence d’intégration sémantique entre les flux de données, les dépendances transitives et les métriques de risque compromet l’efficacité opérationnelle.
Face à ce scénario, nous formulons les questions de recherche suivantes :
RQ1: Comment intégrer formellement plusieurs techniques d’AppSec dans un modèle unifié qui capture les dépendances structurelles et les flux exploitables réels ?
RQ2: Comment quantifier le risque de vulnérabilités de manière contextualisée, en considérant à la fois des métriques standardisées (p. ex., CVSS) et des propriétés structurelles du code ?
RQ3: Est-il possible d’atteindre l’évolutivité pour des applications à grande échelle tout en conservant une haute précision analytique ?
Nos principales contributions sont les suivantes :
C1: Nous proposons un modèle formel fondé sur des graphes dirigés étiquetés qui intègre l’analyse statique, dynamique et des dépendances sous une sémantique commune.
C2: Nous introduisons un mécanisme quantitatif de priorisation des risques basé sur la centralité des graphes, la probabilité d’exploitation estimée et la sévérité CVSS.
C3: Nous implémentons et évaluons empiriquement un système distribué démontrant des réductions significatives des faux positifs et des améliorations de la priorisation opérationnelle.
Le reste de l’article est organisé comme suit. La Section 2 présente les fondements et les travaux connexes. La Section 3 définit le modèle de menace et formalise le problème. La Section 4 décrit la méthodologie proposée. La Section 5 détaille l’implémentation. La Section 6 présente l’évaluation expérimentale. La Section 7 discute les implications et les limites. La Section 8 conclut le travail et indique des pistes futures.
- Background and Related Work
Formellement, nous modélisons une application comme un graphe dirigé étiqueté $G = (V, E, \lambda)$, où $V$ représente les entités de code (fonctions, classes, points de terminaison), $E \subseteq V \times V$ représente des relations (appel, flux de données, dépendance), et $\lambda: V \cup E \rightarrow \Sigma$ associe des étiquettes sémantiques.
Les approches SAST, telles que celles décrites par Livshits et Lam (USENIX Security 2005), utilisent l’analyse de flux de données pour identifier des vulnérabilités telles que l’injection SQL. La DAST, quant à elle, repose sur le fuzzing et l’exécution surveillée, comme discuté dans des travaux tels que celui de Zalewski sur AFL. Les outils SCA, tels que Black Duck et OWASP Dependency-Check, se concentrent sur le mappage des versions et les bases CVE.
Nous pouvons catégoriser les approches existantes en trois classes :
- Analyse isolée fondée sur les signatures.
- Analyse statique fondée sur le flux interprocédural.
- Approches hybrides avec instrumentation dynamique.
Cependant, des limitations subsistent : (i) taux élevé de faux positifs en raison de l’absence de contexte d’exécution ; (ii) difficulté d’évolutivité pour des graphes comportant des millions de nœuds ; (iii) absence de priorisation orientée vers l’impact structurel.
Des travaux récents explorent les graphes de programme et l’apprentissage automatique pour la détection de vulnérabilités (p. ex., Devign, Zhou et al., NeurIPS 2019), mais ils manquent souvent d’intégration opérationnelle avec les pipelines DevSecOps et de métriques formelles de risque.
- Threat Model and Problem Formalization
Nous supposons un adversaire capable de :
- Exploiter des vulnérabilités connues (les zero-days étant hors périmètre).
- Interagir avec des points de terminaison publics.
- Chaîner des vulnérabilités (chaining).
- Manipuler des entrées arbitraires.
Nous ne supposons pas de compromission interne préalable.
Nous définissons l’ensemble des vulnérabilités détectées comme $Vul = {v_1, v_2, …, v_n}$. Chaque vulnérabilité $v_i$ est associée à un sous-ensemble de nœuds $S_i \subseteq V$.
Le risque contextualisé est modélisé comme :
$$ R(v_i) = S_{cvss}(v_i) \cdot P_{exploit}(v_i) \cdot C_{struct}(v_i) $$
où :
- $S_{cvss}$ est le score CVSS normalisé.
- $P_{exploit}$ est la probabilité estimée via une régression logistique fondée sur des caractéristiques structurelles.
- $C_{struct}$ est la centralité d’intermédiarité dans le graphe :
$$ C_{struct}(v_i) = \sum_{s \neq t} \frac{\sigma_{st}(v_i)}{\sigma_{st}} $$
avec $\sigma_{st}$ représentant les plus courts chemins entre $s$ et $t$.
Le problème consiste à ordonner $Vul$ selon $R(v_i)$ en maximisant la corrélation avec l’exploitation réelle observée.
- Proposed Methodology
L’architecture est composée de quatre modules :
- Extraction du graphe sémantique.
- Moteur d’analyse hybride.
- Estimateur de probabilité d’exploitation.
- Mécanisme de priorisation.
Algorithm 1: Construction du graphe intégré
Input: Código fonte C, Dependências D
Output: Grafo G
1: V <- extrair_entidades(C, D)
2: E_call <- extrair_chamadas(C)
3: E_data <- analisar_fluxo_dados(C)
4: E_dep <- mapear_dependencias(D)
5: G <- (V, E_call ∪ E_data ∪ E_dep)
6: return G
Complexité approximative : $O(|V| + |E|)$ pour une construction incrémentale.
Algorithm 2: Priorisation des vulnérabilités
Input: Vulnerabilidades Vul, Grafo G
Output: Lista ordenada L
1: for v in Vul:
2: S_cvss <- normalizar_cvss(v)
3: P_exploit <- estimar_probabilidade(v, G)
4: C_struct <- calcular_centralidade(v, G)
5: R[v] <- S_cvss P_exploit C_struct
6: L <- ordenar_por_valor(R)
7: return L
Le calcul de centralité utilise une approximation de Brandes avec une complexité $O(|V||E|)$, optimisée par échantillonnage.
- Implementation
Nous avons implémenté le prototype dans une architecture distribuée basée sur Kubernetes. Le backend a été développé en Rust pour l’analyse statique et en Python pour la modélisation statistique. Nous avons utilisé Neo4j pour le stockage de graphes allant jusqu’à 1,2 million de nœuds.
Nous nous sommes intégrés à GitHub Actions et GitLab CI, en prenant en charge les langages Java, Python et JavaScript. Le pipeline moyen a traité 5,3 millions de lignes de code en 38 ± 4,2 minutes sur un cluster de 16 nœuds (Intel Xeon 32 cœurs, 128 Go de RAM chacun).
Les compromis ont inclus le choix entre une précision interprocédurale complète et une analyse résumée pour gagner en performance.
- Experimental Evaluation
Nous avons évalué 42 projets open source totalisant 9.317 CVE connues.
Métriques :
- Précision (Precision)
- Rappel (Recall)
- Score F1
- Taux de faux positifs
Résultats moyens :
- SAST traditionnel : Précision 0,61 ; Rappel 0,74 ; F1 0,67.
- Notre approche : Précision 0,84 ; Rappel 0,79 ; F1 0,81.
Réduction des faux positifs : 37,4 %.
La corrélation de Spearman entre le classement des risques et l’exploitation réelle simulée était de 0,72, contre 0,46 pour le CVSS isolé.
Le surcoût computationnel a été supérieur de 18 % à celui du SAST isolé, mais est resté dans les limites du SLA des pipelines d’entreprise (<60 min).
- Discussion
Les résultats indiquent que la centralité structurelle est un fort prédicteur de l’impact exploitatoire. Les vulnérabilités présentant une forte intermédiarité ont affiché une probabilité 2,3 fois plus élevée de participation à des chaînes d’attaque simulées.
Les limites comprennent la dépendance à la qualité de la modélisation des flux et l’absence d’analyse binaire approfondie. La généralisation à des langages dynamiques complexes nécessite des améliorations.
Les menaces à la validité incluent un biais dans les jeux de données open source et une simulation contrôlée de l’exploitation.
- Conclusion and Future Work
Nous avons démontré qu’une architecture formelle orientée graphes, combinant analyse hybride et priorisation quantitative, améliore substantiellement la précision et la pertinence opérationnelle en AppSec.
Comme travail futur, nous prévoyons d’intégrer la détection de zero-day via l’apprentissage profond sur graphes et d’étendre la prise en charge de l’analyse de l’infrastructure as code (IaC) ainsi que des politiques d’exécution fondées sur eBPF.
References
[1] MITRE, “ATT&CK Framework,” 2023.
[2] OWASP, “Top 10,” 2021.
[3] NIST, “SP 800-53,” 2020.
[4] T. H. Austin and C. Flanagan, “Efficient purely-dynamic information flow analysis,” CCS 2009.
[5] V. B. Livshits and M. S. Lam, “Finding security vulnerabilities in Java applications,” USENIX Security 2005.
[6] M. Zalewski, “American Fuzzy Lop,” 2014.
[7] P. Mell et al., “CVSS v3.1 Specification,” FIRST, 2019.
[8] Apache Foundation, “CVE-2017-5638.”
[9] Apache Foundation, “CVE-2021-44228.”
[10] Verizon, “Data Breach Investigations Report,” 2023.
[11] FireEye Mandiant, “M-Trends,” 2022.
[12] S. Zhou et al., “Devign,” NeurIPS 2019.
[13] Neo4j Documentation, 2024.
[14] Kubernetes Documentation, 2024.
[15] GitHub, “Actions Documentation,” 2024.
[16] OWASP, “Dependency-Check,” 2023.
[17] Black Duck Software, “Open Source Security Report,” 2023.
[18] U. Brandes, “A Faster Algorithm for Betweenness Centrality,” J. Math. Sociology, 2001.
[19] ISO/IEC 27034, “Application Security,” 2011.
[20] ENISA, “Threat Landscape,” 2023.