Module EASM (External Attack Surface Management)
Surveillance de la surface d'attaque externe — 22 outils orchestrés (Nmap, Nuclei, TestSSL, Subfinder, ffuf, Katana, etc.)
Module EASM — Surface d'attaque externe
Le module EASM (External Attack Surface Management) est le cœur de Scanyze. Il orchestre 22 outils open-source réputés pour cartographier votre exposition publique : sous-domaines, ports, services, certificats TLS, vulnérabilités connues, configuration DNS/email, fuzzing, DAST, etc.
Tous les outils s'exécutent dans des workers Kubernetes isolés, en filesystem read-only, sans accès aux données des autres tenants. Les résultats sont normalisés en findings avec scoring CVSS, déduplication et corrélation cross-tools.
Les 22 outils orchestrés
Source de vérité : secuscan-api/internal/scanner/tools/.
| Catégorie | Outil | Rôle |
|---|---|---|
| Découverte | Subfinder | Énumération passive de sous-domaines (Certificate Transparency, DNS, archives) |
| Découverte | AssetFinder | Énumération complémentaire via APIs publiques |
| Découverte | ASN cartography | Identification des ASN, blocs IP et organisations associées |
| Réseau | Nmap | Scan de ports TCP/UDP avec détection de versions et scripts NSE |
| Réseau | NSE Audit | Exécution sélective de scripts NSE de sécurité (vuln, brute, discovery) |
| TLS | TestSSL.sh | Audit TLS complet : protocoles, cipher suites, Heartbleed, vulnérabilités historiques |
| HTTP | HTTPx | Identification HTTP/HTTPS, technologies, codes de retour, titres |
| HTTP | Headers | Audit en-têtes de sécurité (CSP, HSTS, X-Frame, etc.) |
| HTTP | Robots/Sitemap | Parse de robots.txt et sitemap.xml, extraction des URL allow/disallow |
| HTTP | Web Crawler (Katana) | Crawl récursif des pages, extraction des paramètres et endpoints |
| HTTP | Web Screenshot | Capture d'écran des pages d'accueil découvertes |
| HTTP | WAF Detection | Détection passive de WAF (Cloudflare, Akamai, AWS WAF, ModSecurity, etc.) |
| HTTP | Dir Discovery (ffuf) | Brute-force de répertoires sur les services HTTP |
| HTTP | API Crawler | Identification des endpoints REST/GraphQL et de leur OpenAPI public |
| Vulnérabilités | Nuclei | ~6000 templates communautaires de vulnérabilités, CVE, misconfigurations |
| DAST | DAST Scanner | Tests d'injection, XSS, SSRF, IDOR sur les paramètres détectés |
| DAST | Fuzzer | Fuzzing actif sur paramètres avec payloads custom |
| DNS | DNS Audit | Vérification AAAA, MX, NS, SOA, glue records, DNSSEC |
| DNS | DNSBL Check | Vérification des blacklists IP (Spamhaus, SORBS, etc.) |
| Email Security | Audit SPF, DKIM, DMARC, BIMI | |
| DMARC | Vérification approfondie de la configuration DMARC (p, rua, ruf, sp) | |
| Identité | HIBP (HaveIBeenPwned) | Vérification d'emails du domaine dans les breaches connus |
| Identité | WHOIS Lookup | Récupération des données de propriété et expiration de domaine |
| Identité | Typosquat Check | Détection de domaines typosquattés similaires (homoglyphes, swaps, etc.) |
| Threat intel | Threat Intelligence | Cross-reference avec OTX, AbuseIPDB, Shodan |
Cycle de vie d'un scan EASM
[1] Création de la cible → models.Target créé, statut=active
↓
[2] Lancement du scan → POST /v1/scans, body { targetId, scanConfig }
↓
[3] Mise en file d'attente → Job Asynq dans Redis (queue scanner)
↓
[4] Worker prend le job → consumer dans cmd/worker/
↓
[5] Phase 1 : Découverte → Subfinder + AssetFinder + WHOIS + ASN
↓
[6] Phase 2 : Network → Nmap, services
↓
[7] Phase 3 : TLS / DNS / Email → TestSSL, DNS Audit, DMARC, SPF
↓
[8] Phase 4 : HTTP layer → HTTPx, Headers, Crawler, Screenshots, WAF
↓
[9] Phase 5 : Vulnérabilités → Nuclei, NSE scripts, Dir Discovery
↓
[10] Phase 6 : DAST + Fuzzer → seulement si activés
↓
[11] Phase 7 : Threat intel → seulement si activé
↓
[12] Post-scan → Déduplication, scoring, posture, alertes
↓
[13] Notifications → Email / Slack / webhook si new criticalChaque outil émet ses findings dans une table dédiée puis le post-scan service consolide tout dans findings avec déduplication par signature canonique (titre + cible + module).
Profils de scan
Les profils contrôlent uniquement le débit cumulé et la concurrence HTTP — pas le périmètre fonctionnel. Source : secuscan-api/internal/scanner/tools/rate_profile.go.
| Profil | Débit cumulé | Concurrence HTTP | Domaine vérifié requis |
|---|---|---|---|
| gentle (défaut Beta) | ~10-20 r/s | 3 connexions | Non |
| standard | ~50 r/s | 6 connexions | Oui |
| aggressive | ~150 r/s | 10 connexions | Oui |
Si vous demandez standard ou aggressive sans avoir vérifié le domaine, Scanyze rétrograde silencieusement en gentle et journalise l'événement (helper NormalizeScanProfileWithOwnership).
Configuration d'un scan
Côté API, le body POST /v1/scans reflète exactement la struct ScanConfig (source : secuscan-api/internal/domain/models/target.go) :
{
"targetId": "uuid",
"scanConfig": {
"scanProfile": "gentle",
"scanSubdomains": true,
"portScan": true,
"sslCheck": true,
"vulnScan": true,
"credentialCheck": true,
"dnsAudit": true,
"emailSecurity": true,
"whoisLookup": true,
"httpHeaders": true,
"wafDetection": true,
"robotsSitemap": true,
"dnsblCheck": true,
"serviceAudit": true,
"dirDiscovery": true,
"webScreenshot": true,
"webCrawler": true,
"typosquatCheck": false,
"threatIntel": false,
"dastScan": false,
"asnCartography": false,
"dmarcCheck": true,
"fuzzingEnabled": false,
"excludedPaths": ["/api/internal", "/admin"],
"customPorts": [8080, 9090, 9443]
}
}Tous les booléens sont à true par défaut sauf dastScan, asnCartography, typosquatCheck, threatIntel, fuzzingEnabled (modules avancés).
Lecture du rapport EASM
Liste des findings
Chaque finding contient :
| Champ | Description |
|---|---|
id | UUID unique |
title | Libellé court (ex. « TLS 1.0 enabled on port 443 ») |
description | Description longue avec contexte |
severity | critical / high / medium / low / info |
cvssScore | Score CVSS 3.1 (0-10) si applicable |
cwe | CWE associé (ex. CWE-326) |
cve | Liste des CVE pertinents |
module | Module qui a découvert le finding (nuclei, testssl, nmap, etc.) |
evidence | Preuve brute (réponse HTTP, output Nmap, etc.) |
recommendation | Recommandation par défaut |
status | open / confirmed / false_positive / accepted_risk / fixed / wont_fix |
aiAnalysis | (optionnel) Analyse IA contextuelle si l'utilisateur a déclenché une analyse |
Posture score par catégorie
Le rapport calcule une posture par grande catégorie (TLS, DNS, HTTP headers, Email auth, Vulnérabilités). Cela permet d'identifier les axes faibles : un score TLS de 45/100 vs un score Email auth de 92/100 indique une priorité claire.
Exploit Chains (Attack Paths)
Le sous-module Attack Path corrèle les findings pour identifier des chaînes d'exploitation réalistes :
[1] Sous-domaine `api-old.monentreprise.com` exposé
→ [2] Service Apache 2.4.49 détecté (CVE-2021-41773)
→ [3] LFI réussie sur /cgi-bin/.%2e/etc/passwd
→ [4] Fuite d'identifiants dans /home/.aws/credentialsDisponible à partir du plan Pro. Cliquez sur l'onglet Attack Paths sur la page d'un scan.
SBOM (Software Bill of Materials)
Détection automatique des stacks technologiques exposées (web servers, frameworks, CMS, librairies front-end). Export en CycloneDX 1.5 depuis Reports → Exporter.
Modules de monitoring continu (EASM Monitors)
Indépendamment des scans ponctuels, le sous-module EASM Monitors (/easm/monitors) surveille en continu :
- Apparition de nouveaux sous-domaines (Certificate Transparency log monitoring via crt.sh)
- Changement de propriétaire WHOIS
- Nouveaux certificats TLS émis
- Modification d'enregistrements DNS critiques (MX, NS, A)
- Apparition de la cible dans une DNSBL
À chaque détection, une notification est émise (email, Slack, webhook) et un finding info/low est créé pour traçabilité.
Quotas par plan
| Plan | Cibles max | Scans manuels/mois | Nightly auto | DAST | Threat intel |
|---|---|---|---|---|---|
| Essentiel | 2 | 0 | Oui | Non | Non |
| Starter | 5 | 10 | Oui | Non | Non |
| Pro | 25 | 100 | Oui | Oui | Oui |
| Business | 100 | 500 | Oui | Oui | Oui |
| Enterprise | -1 (illimité) | -1 | Oui | Oui | Oui |
Source : migrations 000027_v1_pricing.up.sql, 000126_fix_pricing_add_essential.up.sql, 000033_update_plan_limits.up.sql.
Scan des cibles partagées (responsible scanning)
Scanyze applique systématiquement les pratiques suivantes :
- User-Agent identifiable :
Scanyze/1.0 (https://scanyze.com/scan-info)— un opérateur peut bloquer Scanyze proactivement si nécessaire. - Rate limit cumulé : un sémaphore HTTP global empêche la saturation du serveur cible.
- Backoff exponentiel : en cas de réponse
429ou503, le scan ralentit automatiquement. - Timeout strict : 30 minutes max par scan complet ; aucun scan n'est laissé tourner indéfiniment.
- Filesystem isolé : aucun upload arbitraire — uniquement des requêtes HTTP/DNS conformes à RFC.
Sources de cette page
- Backend :
secuscan-api/internal/scanner/,secuscan-api/internal/services/scanner/,secuscan-api/internal/services/easm/ - Outils : 22 fichiers dans
secuscan-api/internal/scanner/tools/ - Modèle :
secuscan-api/internal/domain/models/target.go(ScanConfig)
À jour pour Scanyze v0.130.x.