Référence

Modules — cible en ligne (cyberlens scan)

passif actif navigateur auth requise
ModuleTypeContrôles
reconpassifEnregistrements DNS, IP résolue, bannière serveur
headerspassifPrésence CSP/HSTS/Permissions-Policy/COOP/COEP/CORP/X-Content-Type-Options, protection anti-clickjacking, flags de cookies (HttpOnly/Secure/SameSite), Cache-Control: no-store sur les réponses porteuses de session, mauvaise configuration CORS, X-Powered-By, X-XSS-Protection obsolète
tlspassifVersion du protocole, suite de chiffrement faible (best-effort), expiration du certificat, détection HTTP en clair
discoverypassifChemins sensibles courants (/docs, /swagger, /.env, /.git/config, /admin, source maps, lockfiles de dépendances, …), détection de listing de répertoire, analyse de schéma OpenAPI/Swagger, introspection GraphQL, méthode HTTP TRACE, méthodes dangereuses (PUT/DELETE/CONNECT) annoncées via OPTIONS, divulgation de chemins internes dans robots.txt
dns_hardeningpassifPrésence DNSSEC (enregistrement DNSKEY), exposition au transfert de zone AXFR sur chaque serveur de noms, énumération de sous-domaines courants
jwtpassifAcceptation de JWT alg:none / secret faible, sondage du rate-limit sur les endpoints d'authentification
secretspassifMotifs de secrets connus (Stripe/AWS/Google/GitHub/Firebase/Slack) fuités dans les réponses, traces de pile, divulgation de routes internes dans les messages d'erreur
websocketpassifHandshake Socket.IO sans authentification, wildcard CORS, divulgation de version du script client
storagepassif navigateurlocalStorage/sessionStorage contenant des jetons ou secrets, cookies de session lisibles via document.cookie, contenu mixte — nécessite Playwright
crawlernavigateurRestitue chaque page dans un vrai navigateur (Chromium headless), suit les liens de même origine (25 pages max, profondeur 3) pour découvrir pages et formulaires réels, comme un humain qui navigue — voit aussi le contenu rendu en JavaScript (SPA React/Vue) et observe les vraies requêtes GET XHR/fetch (alimente idor) ; re-parcourt automatiquement après une connexion --auth-username réussie
clickjackingnavigateurIntègre activement la cible dans une vraie iframe et confirme si elle s'affiche, plutôt que de vérifier uniquement la présence d'en-têtes — nécessite Playwright
xssactif navigateurInjecte une charge script dans chaque paramètre GET / champ de formulaire GET découvert et confirme l'exécution réelle dans un vrai navigateur (pas seulement une réflexion de chaîne) — nécessite Playwright
sqliactifInjection SQL basée sur l'erreur et aveugle booléenne (réponse différentielle) sur les entrées GET toujours, les champs de formulaire POST avec --active-forms
sstiactifInjection de template côté serveur (SSTI) — charges d'évaluation arithmétique (variantes Jinja2/Twig/Freemarker/ERB) sur les entrées GET toujours, formulaires POST avec --active-forms
command_injectionactifInjection de commande OS via des charges de métacaractères shell avec marqueurs de sortie détectables, entrées GET toujours, formulaires POST avec --active-forms
nosql_injectionactifInjection d'opérateur style MongoDB ($ne, $gt, …) — basée sur l'erreur et aveugle booléenne, entrées GET toujours, formulaires POST avec --active-forms
ldap_injectionactifInjection de filtre LDAP via charges de métacaractères et détection de signature d'erreur, entrées GET toujours, formulaires POST avec --active-forms
xxeactifInjection d'entité externe XML (XXE) contre les endpoints/formulaires acceptant du XML, via une charge de lecture de fichier local sûre (hors bande)
sripassifAttribut Subresource Integrity (integrity) manquant sur les balises <script>/<link rel=stylesheet> hébergées en externe, sur les pages découvertes par le crawler
csrfpassifSignale les formulaires POST découverts sans champ ressemblant à un jeton anti-CSRF — passif, ne soumet jamais rien
email_securitypassifEnregistrement SPF présent/pas trop permissif (+all), DMARC présent et appliqué (pas p=none), vérification DKIM best-effort sur des noms de sélecteur courants
wafpassifDétecte un WAF/CDN devant la cible via des signatures d'en-têtes/cookies (Cloudflare, Akamai, Sucuri, Imperva, Fastly, …) plus une sonde active — informationnel, pas une vulnérabilité en soi
infra_exposureactifServices d'infrastructure/admin exposés couramment accessibles depuis l'hôte cible (Elasticsearch, Kibana, Grafana, Prometheus, RabbitMQ, Docker API, Kubernetes Dashboard, MinIO, Jenkins), plus de vraies tentatives d'authentification par identifiants par défaut contre Redis, MySQL et PostgreSQL
param_fuzzingactifTests de validation d'entrée aux limites (CWE-20) : valeurs vides, 5000 caractères, négatives, dépassement d'entier, octet nul, unicode/contrôle sur chaque paramètre GET/champ de formulaire découvert
account_creationactif navigateurTente une seule vraie inscription via un formulaire d'inscription découvert, en remplissant réellement les champs et en cliquant sur le contrôle de soumission dans un vrai navigateur — nécessite --active-forms ; l'email soumis utilise toujours le domaine example.com (RFC 2606, ne délivre jamais de vrai courrier)
idoractif auth requiseNouveau. Contrôle d'accès défaillant / IDOR : pour chaque endpoint API observé avec un identifiant numérique (via de vraies requêtes GET XHR/fetch capturées pendant le crawl authentifié — pas les URL de page elles-mêmes, souvent inutiles à tester directement sur une SPA), vérifie si substituer un identifiant voisin retourne une réponse distincte et valide avec la même session authentifiée (CWE-639), et si le même endpoint est accessible sans aucune session (CWE-306) — nécessite --auth-username ; uniquement GET, ne nécessite donc pas --active-forms

Référence

Modules — projet local (cyberlens scan-local)

ModuleContrôles
local_secretsSecrets codés en dur dans les fichiers source, avec la même liste de motifs que secrets/storage
env_exposureUn fichier de type .env présent à la racine du projet mais non exclu par .gitignore
dangerous_jseval(), new Function(), affectation directe innerHTML, dangerouslySetInnerHTML, document.write(), et child_process.exec()/execSync() dans le code JS/TS/JSX/TSX/Vue
local_sriMême vérification SRI manquante que sri, mais sur des fichiers HTML locaux — aucun réseau
dependenciesAnalyse package-lock.json/requirements.txt/Pipfile.lock/composer.lock et vérifie chaque version de paquet contre la base de données publique d'avis OSV.dev — le seul trafic réseau envoyé par un scanner local, et uniquement des métadonnées publiques de paquets, jamais votre code

Référence

Comportements & limites

Test multi-navigateur

storage/clickjacking/xss exécutent leurs contrôles sur chaque moteur Playwright installé (Chromium/Firefox/WebKit), pas seulement un. Une protection appliquée par un seul moteur — clickjacking bloqué sur Chromium mais pas Firefox, par exemple — est un constat réel et distinct qu'un scan mono-moteur manquerait. Seul Chromium est requis ; les moteurs non installés sont ignorés.

Captures d'écran comme preuve

Quand un contrôle basé navigateur confirme un constat (exécution XSS, embarquement clickjacking réussi), une capture d'écran PNG est intégrée directement dans le rapport PDF/HTML comme preuve visuelle, en plus de la preuve textuelle habituelle.

Listing complet des endpoints/formulaires

La section « Endpoints découverts » du rapport liste chaque chemin/URL confirmé accessible et chaque formulaire trouvé (page, action, méthode, champs) dans son intégralité — pas un résumé tronqué.

Frontière de sécurité — GET toujours testé, POST nécessite --active-forms

Les requêtes GET sont conventionnellement sans effet de bord selon la sémantique HTTP, donc xss, sqli, ssti, command_injection, nosql_injection, ldap_injection, param_fuzzing et idor testent toujours les paramètres/entrées GET. Les formulaires POST découverts par le crawler sont listés (méthode, action, champs) mais jamais soumis sans --active-forms — cela pourrait déclencher de vraies actions (changements de compte, paiements, suppressions) sur une cible réelle. L'activer affiche un avertissement distinct et nécessite sa propre confirmation.

Hors périmètre pour l'instant

Sondage mass-assignment et injection aveugle basée sur le temps (SQLi/commande/LDAP) — volontairement omis car trop bruyants/lents pour un scan automatisé. Candidats naturels pour un futur module.

Référence

Options de la CLI

cyberlens scan TARGET

OptionDescription
-o, --outputChemin du rapport de sortie (défaut : report.pdf)
-f, --formatpdf, html ou json
-m, --modulesListe de modules séparés par des virgules (défaut : tous)
--fullTous les modules avec tests actifs sur formulaires activés (équivaut à omettre --modules et passer --active-forms)
--timeoutTimeout par requête en secondes (défaut : 10)
--confirm-authorizedConfirme l'autorisation sans invite interactive
--active-formsSoumet activement les formulaires POST découverts pour tester les injections
--confirm-active-formsConfirme les soumissions POST réelles sans invite interactive
--ai-summary / --no-ai-summaryActive/désactive le résumé exécutif généré par IA (actif par défaut)
-l, --languageLangue du rapport : en (défaut) ou fr
--auth-usernameSe connecte comme cet utilisateur avant le reste du scan (mot de passe via CYBERLENS_AUTH_PASSWORD ou invite masquée) — alimente aussi le module idor

cyberlens scan-local PATH

OptionDescription
-o, --outputChemin du rapport de sortie
-f, --formatpdf, html ou json
-m, --modulesListe de modules locaux séparés par des virgules
--ai-summary / --no-ai-summaryActive/désactive le résumé exécutif généré par IA
-l, --languageLangue du rapport

Autres commandes

CommandeDescription
cyberlens install-browsersTélécharge un ou plusieurs moteurs Playwright (Chromium/Firefox/WebKit)
cyberlens inspect URLRestitue une URL comme le crawler et enregistre HTML + capture d'écran — outil de débogage