Règles Semgrep pour HTML¶
html_generic_rule_reflected_xss¶
Résumé :
Neutralisation inadéquate de l’entrée utilisateur rendue en HTML ('XSS')
Gravité : Élevée
CWE : CWE-79
Description :
Le modèle HTML contient des motifs potentiellement dangereux où des variables contrôlées par l'utilisateur peuvent être exécutées dans des contextes non sécurisés. Cela inclut : (1) des appels à document.write() ou eval() dans des blocs <script> qui traitent des variables de modèle non échappées, (2) la manipulation du DOM via les propriétés .innerHTML ou .outerHTML qui peuvent exécuter des scripts intégrés, (3) des blocs CSS <style> utilisant la syntaxe obsolète :expression() ou l'interpolation de modèles, (4) des variables de modèle entre backticks qui permettent l'injection de littéraux de modèle, et (5) des variables de modèle non échappées dans les attributs d'URL (href, src, action, data, http-equiv, style, background-image) qui peuvent permettre des gestionnaires de protocole javascript: ou des URI de données contenant des scripts. Ces motifs contournent l’auto-évasion des modèles et créent des vulnérabilités de Cross-Site Scripting (XSS) où les attaquants peuvent exécuter du JavaScript arbitraire dans les navigateurs des victimes.
Remédiation :
Envisagez d'éviter complètement document.write() et eval() car ils sont intrinsèquement dangereux avec des données utilisateur. Utilisez des méthodes de manipulation du DOM comme textContent au lieu de innerHTML pour insérer des données utilisateur en tant que texte plutôt qu'en HTML. Supprimez la syntaxe CSS obsolète :expression() qui n'est prise en charge que dans les anciennes versions d'IE. Évitez l'interpolation de littéraux de modèle avec des backticks pour les données fournies par l'utilisateur. Pour les attributs d'URL, validez que les URL utilisent des protocoles sûrs (http/https) et évitez des URL javascript: ou data: avec des entrées utilisateur. Utilisez des filtres d’échappement des moteurs de templates appropriés au contexte - pour Django, utilisez | urlencode pour les paramètres d'URL, | escapejs pour les chaînes JavaScript, et comptez sur l’auto-évasion par défaut pour HTML. Implémentez des en-têtes de politique de sécurité de contenu (CSP) avec script-src 'self' pour bloquer JavaScript en ligne et unsafe-eval comme protection en profondeur.
OWASP :
- A7:2017-Cross-Site Scripting (XSS)
- A03:2021-Injection
html_tornado_rule_reflected_xss¶
Résumé :
Neutralisation inadéquate des entrées utilisateur rendues en HTML ('XSS')
Sévérité : Élevée
CWE : CWE-79
Description :
Le modèle HTML de Tornado désactive l'échappement automatique des HTML en utilisant {% autoescape None %}
globalement, ou contournant l'échappement localement en utilisant des blocs {% raw ... %} ou la syntaxe {{! ... }}
. Cela crée des vulnérabilités de Cross-Site Scripting (XSS) lorsque des données contrôlées par l'utilisateur
sont rendues dans ces contextes non échappés. L'échappement automatique par défaut de Tornado protège contre
le XSS en encodant les caractères spéciaux HTML, et ces directives contournent explicitement cette
protection. La désactivation globale avec {% autoescape None %} affecte l'ensemble du modèle et
tous les modèles inclus, ce qui le rend particulièrement dangereux. Le bloc {% raw %} et
la syntaxe {{! }} affichent le contenu sans échappement, permettant à du HTML et à du JavaScript malveillants
de s'exécuter directement dans le navigateur si une entrée utilisateur est impliquée.
Réparation :
Considérez garder l'échappement automatique par défaut de Tornado activé en supprimant {% autoescape None %}
des modèles ou en utilisant {% autoescape xhtml_escape %} explicitement. Évitez d'utiliser
les blocs {% raw %} et la syntaxe {{! }} sur des données fournies par l'utilisateur - réservez-les uniquement
pour un HTML de confiance provenant de votre code applicatif. Si vous devez rendre un contenu généré par les utilisateurs riche qui nécessite du HTML, utilisez un assainisseur basé sur une liste blanche comme bleach ou nh3 pour
nettoyer le HTML en Python avant de le passer au modèle. Utilisez les fonctions d'échappement de Tornado
dans le code Python : tornado.escape.xhtml_escape() pour les contextes HTML,
tornado.escape.url_escape() pour les URL, et tornado.escape.json_encode() pour JSON.
Implémentez des en-têtes de politique de sécurité des contenus (CSP) en utilisant la méthode set_header() de Tornado
pour fournir une protection supplémentaire contre les attaques XSS même si l'échappement est accidentellement
contourné.
OWASP :
- A7:2017-Cross-Site Scripting (XSS)
- A03:2021-Injection