FlawOpen

flawopen.com/SSRF/SSRF avec fetch() dans Node.js

fetch() de Node.js empêche-t-il les SSRF ?

CWE-918: Server-Side Request ForgeryRéférence de sécurité Node.js
En clair

Non. fetch() côté serveur envoie une requête depuis le serveur. Si l’appelant choisit la destination, il peut viser des systèmes accessibles au serveur mais pas à lui-même. C’est comme demander à un coursier de confiance de livrer un colis sans vérifier l’adresse. Le risque dépend du réseau, de l’identité, de la politique URL et des redirections.

SSRF (CWE-918)Le serveur contacte une destination choisie ou influencée par un appelant non fiable et franchit la frontière de confiance réseau.
Liste de destinations autoriséesAssociation fixe entre un choix utilisateur, tel que providerId, et une origine configurée par l’application. Elle évite les URL arbitraires.
Validation des redirectionsUne réponse peut indiquer une seconde destination. Suivre automatiquement les redirections peut contourner une validation limitée à l’URL initiale.
DNS rebindingUn nom peut résoudre vers différentes adresses. Valider le DNS une fois puis laisser le client refaire la résolution crée une fenêtre TOCTOU.

Cause : le serveur fait confiance à la destination fournie

Le fetch() de Node.js est un client HTTP général, pas une politique anti-SSRF. Il ne choisit pas les réseaux accessibles ; CORS du navigateur n’établit pas de frontière côté serveur. Analyser l’URL ne suffit pas : un hôte autorisé peut résoudre vers une adresse interdite, et une réponse peut rediriger vers un autre hôte. Les fonctions qui récupèrent avatar, webhook, document ou aperçu fourni par l’utilisateur peuvent exposer le serveur.

Comment la requête franchit la frontière de confiance

Step 1

L’appelant influence une URL

Un endpoint accepte une URL entière ou assez de données pour la construire, par exemple pour prévisualiser une image.

Step 2

Le serveur envoie la requête

Le client HTTP utilise la route réseau, le DNS, le proxy et l’identité disponibles au processus serveur.

Step 3

Une redirection change la destination

Fetch suit les redirections par défaut. Une destination validée initialement peut répondre par un Location vers un hôte interdit.

Step 4

La réponse expose des données accessibles

Si réseau et politique l’autorisent, des services internes ou métadonnées cloud peuvent être atteints. Cela dépend de l’environnement, pas de chaque appel fetch.

Exemples Node.js vulnérable et plus sûr

Vulnérable
// Ne récupérez pas une URL arbitraire fournie par l’appelant.
const response = await fetch(userProvidedUrl);
Plus sûr
// L’appelant choisit une clé, jamais une destination réseau.
const destinations = new Map([
  ["status", new URL("https://status.example/")],
  ["docs", new URL("https://docs.example/")],
]);

const target = destinations.get(providerId);
if (!target) throw new Error("Unknown provider");

const response = await fetch(target, {
  redirect: "error",
  signal: AbortSignal.timeout(3000),
});
if (!response.ok) throw new Error("Upstream request failed");

Si l’utilisateur doit fournir une URL

Préférez un identifiant fournisseur associé à une destination fixe. Si des URL publiques arbitraires sont indispensables, n’autorisez que les schémas et ports requis ; rejetez user-info, loopback, adresses privées, link-local et autres destinations IPv4/IPv6 interdites ; validez toutes les adresses résolues et forcez la connexion à utiliser une adresse validée sans seconde résolution non contrôlée. Désactivez les redirections automatiques ou validez chaque étape. Appliquez des règles de sortie réseau indépendantes, y compris le blocage des métadonnées telles que 169.254.169.254 et l’adresse IPv6 activée. Limitez durée, taille de réponse et concurrence ; ne transmettez pas d’identifiants internes à la destination.

Liste de prévention SSRF

Questions fréquentes

Bloquer localhost et les IP privées suffit-il ?

Non. Redirections, variantes IPv4/IPv6, DNS rebinding, proxies et courses entre résolution et connexion contournent les vérifications simples. Préférez une liste autorisée. Si les destinations sont libres, validez chaque adresse et forcez la connexion à utiliser ce résultat ; appliquez la même politique au réseau.

Exiger IMDSv2 élimine-t-il les SSRF ?

Non. IMDSv2 exige un jeton et réduit certaines expositions, mais une SSRF peut viser d’autres services internes ou métadonnées selon la configuration. Gardez les contrôles de destination et de sortie.

Sources primaires

Explorer des sujets de sécurité et analyses d’incidents :Répertoire complet de sécurité →
À voir aussi Falsification de requêtes côté serveur (SSRF, CWE-918) : fonctionnement et prévention dans chaque langage — flawopen.com SSRF et métadonnées cloud : risques et défenses Bots IA de revue de PR : prévenir SSRF — flawopen.com