Skip to main content

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​

ChampValeur
CriticitéMoyenne
CVSS v3.15.3
VecteurCVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:N/A:N
OWASPA05 — 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​

ChampValeur
CriticitéMoyenne
CVSS v3.14.3
VecteurCVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:U/C:L/I:N/A:N
OWASPA05 — 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​

ChampValeur
CriticitéFaible
CVSS v3.13.7
VecteurCVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:L/I:N/A:N
OWASPA02 — 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​

ChampValeur
CriticitéFaible
CVSS v3.13.1
VecteurCVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:L/I:N/A:N
OWASPA05 — 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​

ChampValeur
CriticitéFaible
CVSS v3.13.1
VecteurCVSS:3.1/AV:N/AC:H/PR:N/UI:R/S:U/C:L/I:N/A:N
OWASPA05 — 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.