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.