Findings détaillés
Chaque vulnérabilité est documentée avec sa preuve, son score CVSS v3.1 et sa correction.
VULN-01 — Documentation API exposée sans authentification
| Champ | Valeur |
|---|---|
| Criticité | Moyenne |
| CVSS v3.1 | 5.3 |
| Vecteur | CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:N/A:N |
| OWASP | A05 — Security Misconfiguration |
Description
L'interface Swagger (/docs) et la spécification OpenAPI (/openapi.json) sont accessibles sans authentification sur le port 8000. La racine / divulgue également les chemins internes.
Preuve
curl -sk -o /dev/null -w "%{http_code}\n" http://10.0.20.10:8000/docs # 200
curl -sk -o /dev/null -w "%{http_code}\n" http://10.0.20.10:8000/openapi.json # 200
curl -sk http://10.0.20.10:8000/
# {"service":"SuperSOC API","docs":"/docs","health":"/health"}
Impact
Un attaquant obtient la cartographie complète de l'API (tous les endpoints, schémas, paramètres) sans authentification, ce qui facilite la préparation d'attaques ciblées.
Recommandation
Désactiver la documentation en production. Dans api/app/main.py, conditionner selon l'environnement :
docs_url="/docs" if settings.ENV == "dev" else None,
openapi_url="/openapi.json" if settings.ENV == "dev" else None,
VULN-02 — En-têtes de sécurité HTTP absents
| Champ | Valeur |
|---|---|
| Criticité | Moyenne |
| CVSS v3.1 | 4.3 |
| Vecteur | CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:U/C:L/I:N/A:N |
| OWASP | A05 — Security Misconfiguration |
Description
Les réponses HTTP du front ne comportent pas les en-têtes de sécurité X-Frame-Options ni X-Content-Type-Options (confirmé par nikto et curl).
Preuve
curl -skI http://10.0.20.10/
# Aucun X-Frame-Options, X-Content-Type-Options, Content-Security-Policy
Impact
Absence de X-Frame-Options → risque de clickjacking. Absence de X-Content-Type-Options → risque de MIME-sniffing.
Recommandation
Ajouter les en-têtes dans front/nginx.conf :
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-Content-Type-Options "nosniff" always;
add_header Content-Security-Policy "default-src 'self'" always;
add_header Referrer-Policy "no-referrer-when-downgrade" always;
VULN-03 — Front servi en HTTP en clair
| Champ | Valeur |
|---|---|
| Criticité | Faible |
| CVSS v3.1 | 3.7 |
| Vecteur | CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:L/I:N/A:N |
| OWASP | A02 — Cryptographic Failures |
Description
Le front est servi en HTTP (port 80) sans redirection vers HTTPS, exposant le trafic à une interception sur le réseau.
Preuve
curl -skI http://10.0.20.10/ # HTTP/1.1 200 OK — pas de redirection 301 vers https
Impact
Le trafic (dont potentiellement des tokens d'authentification) transite en clair. Sur un réseau segmenté et interne, le risque est réduit mais réel (attaquant ayant pris pied).
Recommandation
Forcer la redirection HTTPS dans nginx :
server {
listen 80;
return 301 https://$host$request_uri;
}
Ajouter également l'en-tête HSTS sur le vhost HTTPS.
VULN-04 — Version du serveur exposée
| Champ | Valeur |
|---|---|
| Criticité | Faible |
| CVSS v3.1 | 3.1 |
| Vecteur | CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:L/I:N/A:N |
| OWASP | A05 — Security Misconfiguration |
Description
L'en-tête Server: nginx/1.31.2 divulgue la version exacte du serveur web, information utile à un attaquant pour cibler des CVE connues.
Preuve
curl -skI http://10.0.20.10/ | grep Server # Server: nginx/1.31.2
Recommandation
Masquer la version dans front/nginx.conf :
server_tokens off;
VULN-05 — Configuration CORS permissive
| Champ | Valeur |
|---|---|
| Criticité | Faible |
| CVSS v3.1 | 3.1 |
| Vecteur | CVSS:3.1/AV:N/AC:H/PR:N/UI:R/S:U/C:L/I:N/A:N |
| OWASP | A05 — Security Misconfiguration |
Description
Le middleware CORS de l'API autorise toutes les méthodes et tous les en-têtes (allow_methods=["*"], allow_headers=["*"]). Les origines sont en revanche restreintes (bon point).
Preuve
Extrait de api/app/main.py :
app.add_middleware(
CORSMiddleware,
allow_origins=settings.CORS_ORIGINS, # restreint — bien
allow_methods=["*"], # trop permissif
allow_headers=["*"], # trop permissif
)
Impact
Surface d'exposition élargie si une origine venait à être compromise. Impact limité car les origines restent contrôlées.
Recommandation
Restreindre aux méthodes réellement utilisées :
allow_methods=["GET", "POST", "PUT", "DELETE"],
allow_headers=["Authorization", "Content-Type"],
Note méthodologique — faux positifs nikto
Le scan nikto a remonté ~150 « backup/cert files » (.pem, .jks, .war...). Tous sont des faux positifs : le front étant une SPA, nginx renvoie index.html (HTTP 200) pour toute URL. Vérification :
curl -sk -o /dev/null -w "%{http_code} taille=%{size_download}\n" http://10.0.20.10/database.pem
# 200 taille=404
curl -sk -o /dev/null -w "%{http_code} taille=%{size_download}\n" http://10.0.20.10/nimportequoi_xyz.pem
# 200 taille=404 (fichier inexistant → même réponse : preuve du wildcard)
Ces findings ont été écartés après vérification manuelle. Seuls les 2 en-têtes manquants (VULN-02) constituent de vrais findings issus de nikto.