Une faille XSS sur une dApp DeFi, c'est le genre de truc qui ne fait pas les gros titres mais qui peut vous coûter tout votre portefeuille. Le principe : un attaquant injecte du code JavaScript malveillant dans une page web que vous visitez. Ce script s'exécute dans votre navigateur, avec vos permissions, et peut interagir avec votre wallet MetaMask sans que vous le sachiez. Selon le rapport IBM Cloud Threat Landscape 2024, le XSS reste la vulnérabilité cloud la plus découverte.

Je trouve que le XSS est sous-estimé dans la communauté crypto. Tout le monde parle de phishing et de ransomware, mais les attaques par injection de script sont plus discrètes et potentiellement plus dévastatrices.

Comment fonctionne une attaque XSS

XSS signifie Cross-Site Scripting. L'idée est d'injecter du code dans une page web qui sera ensuite exécuté par le navigateur des visiteurs. Il existe trois variantes principales.

Le XSS stocké (stored XSS) est le plus dangereux. L'attaquant publie du code malveillant dans un champ de saisie (commentaire, profil, message de forum) qui est sauvegardé sur le serveur. Chaque visiteur qui charge la page exécute le script sans le savoir. Sur un forum crypto ou un chat de protocole DeFi, ça peut toucher des milliers d'utilisateurs.

Le XSS réfléchi (reflected XSS) passe par un lien piégé. L'attaquant vous envoie une URL qui contient le script malveillant en paramètre. Quand vous cliquez, le serveur renvoie la page avec le script intégré. C'est souvent combiné avec du phishing : un message sur Telegram qui dit "Vérifiez votre airdrop" avec un lien contenant du JavaScript malveillant.

Le XSS basé sur le DOM manipule directement le document HTML dans votre navigateur, sans passer par le serveur. C'est plus technique mais aussi plus difficile à détecter pour les outils de sécurité côté serveur.

Le XSS appliqué aux dApps crypto

Dans le contexte crypto, le XSS prend une dimension particulière. Quand votre navigateur exécute MetaMask ou un autre wallet, le script malveillant peut potentiellement intercepter vos appels de smart contract, modifier les adresses de destination avant signature, ou déclencher des approbations de tokens en arrière-plan.

Imaginez : vous utilisez un DEX pour swapper de l'ETH contre de l'USDC. Une faille XSS sur le frontend du DEX permet à l'attaquant de remplacer l'adresse du contrat de swap par la sienne. Vous signez la transaction sur MetaMask en pensant swapper, mais vous envoyez vos ETH à l'attaquant. C'est pour ça que vérifier les détails sur un hardware wallet avant de signer est si important.

Les dApps sont des cibles intéressantes pour les attaquants parce que les enjeux sont élevés (accès direct aux fonds) et que beaucoup de projets crypto ont des pratiques de sécurité web insuffisantes. 7% des vulnérabilités identifiées dans le secteur blockchain sont des XSS, un chiffre plus bas que d'autres industries, mais suffisant pour causer des dégâts importants.

Se protéger en tant qu'utilisateur

La première règle : ne cliquez pas sur des liens suspects, surtout ceux reçus sur Telegram, Discord ou Twitter. Les bots arnaqueurs sur Telegram utilisent régulièrement des liens contenant du XSS réfléchi.

Utilisez un navigateur dédié pour vos interactions crypto. Un profil Chrome ou Firefox séparé, sans extensions inutiles, uniquement pour accéder à vos wallets et dApps. Ça limite la surface d'attaque.

Vérifiez toujours les détails de la transaction sur l'écran de votre hardware wallet avant de signer. Si l'adresse ou le montant ne correspondent pas à ce que vous attendez, refusez. C'est la meilleure protection contre les scripts qui modifient les transactions en arrière-plan.

Révoquez les approbations de tokens inutilisées. Des outils comme Revoke.cash permettent de vérifier quels contrats ont accès à vos tokens et de révoquer les permissions. Même si un script XSS a déclenché une approbation malveillante, vous pouvez la révoquer après coup.

La double authentification sur vos comptes exchange protège aussi contre le vol de session cookies via XSS.

Ce que les développeurs doivent faire

Si vous développez une dApp, la prévention du XSS passe par la sanitization de toutes les entrées utilisateur. Chaque donnée qui vient de l'extérieur (champ de formulaire, URL, API) doit être nettoyée avant d'être affichée dans le HTML. Les frameworks modernes (React, Vue) font ça par défaut dans la plupart des cas, mais il reste des pièges (dangerouslySetInnerHTML en React, par exemple).

Les Content Security Policy (CSP) sont une deuxième ligne de défense. Elles indiquent au navigateur quels scripts sont autorisés à s'exécuter sur votre page. Un CSP bien configuré bloque l'exécution de scripts injectés, même si la sanitization a raté un cas.

Faites auditer votre code. Un audit de smart contract est devenu standard dans la DeFi, mais l'audit du frontend est tout aussi important. Un smart contract parfait ne sert à rien si le frontend qui interagit avec lui est vulnérable au XSS.

À lire aussi