Skip to main content

Die Jinja2-XSS-Sicherheitslücke verstehen und beheben (CVE-2024-22195)

Artikel von
feature open source

18. Januar 2024

0 Min. Lesezeit

Am 11. Januar 2024 wurde eine schwerwiegende Sicherheitslücke in Jinja2, einer weitverbreiteten Python-Template-Bibliothek, bekannt. Die als CVE-2024-22195 identifizierte Cross-Site-Scripting-Sicherheitslücke (XSS) gibt Anlass zur Sorge, da zahlreiche Projekte betroffen sind. Jinja2 verzeichnet über 33 Millionen Downloads pro Woche, fast 10.000 GitHub-Sterne und mehr als 90.000 abhängige Projekte.

Die Sicherheitslücke betrifft alle Versionen vor 3.1.3. Die gepatchte Version 3.1.3 ist die einzige sichere Option. Besonders wichtig: Die am häufigsten heruntergeladene Version 3.1.2 ist weiterhin anfällig und weitverbreitet.

Popularitäts-Dashboard mit wöchentlichen Downloads nach Version. Version 3.1.2 erreicht mit 17,42 Millionen Downloads den Spitzenwert.

Wie kann ich prüfen, ob mein Projekt eine anfällige Version von Jinja2 verwendet?

Sie können die Jinja2-Version in Ihrem Projekt in der Datei requirements.txt nachsehen oder in der virtuellen Umgebung Ihres Projekts pip list | grep Jinja2 ausführen.

Die Verwendung von Jinja2 in der Python-Entwicklung verstehen

Die Beliebtheit von Jinja2 beruht auf der Möglichkeit, dynamische HTML-Templates mit einer Python-ähnlichen Syntax zu erstellen. Die Bibliothek bietet Funktionen wie Template-Vererbung, automatisches HTML-Escaping, um XSS durch nicht vertrauenswürdige Eingaben zu verhindern, sowie Unterstützung für Internationalisierung.

Entwickler installieren die Bibliothek in der Regel über PyPI mit dem Befehl pip install Jinja2. Ein Beispiel für die Verwendung in einem Projekt könnte so aussehen:

{% 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 %}

Details zur XSS-Sicherheitslücke

CVE-2024-22195 entsteht durch den xmlattr-Filter in Jinja2, wenn auf Basis von Benutzereingaben Schlüssel mit Leerzeichen verwendet werden. Dieser Fehler ermöglicht es Angreifern, beliebige HTML-Attribute in Templates einzuschleusen, den Auto-Escaping-Mechanismus zu umgehen und möglicherweise nicht vertrauenswürdige Skripte im Browser eines Nutzers auszuführen.

Im Folgenden finden Sie eine vollständige Proof-of-Concept-Reproduktion der Cross-Site-Scripting-Sicherheitslücke in Jinja2. Sie stammt von Calum Hutton aus dem Snyk-Sicherheitsforschungsteam, der die Sicherheitslücke offengelegt hat:

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
    ))

Reproduktion der Jinja2-XSS-Sicherheitslücke CVE-2024-22195 

Richten Sie eine neue virtuelle Python-3-Umgebung ein:

  1. python3 -m venv myenv 

  2. source myenv/bin/activate

Hinweis: Wenn Sie noch nicht mit der Verwaltung verschiedener Python-Entwicklungsumgebungen vertraut sind, empfehle ich Ihnen, sich ein paar Minuten Zeit zu nehmen und Python-Umgebungen mit venv und Docker optimal zu nutzen und Ihren Code zu schützen: ein umfassender Leitfaden zu lesen.

Erstellen Sie anschließend die Python-Abhängigkeitsdatei requirements.txt, die der Paketmanager pip verwendet, und fügen Sie gängige Bibliotheken aus der PyPI-Registry hinzu:

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

Jetzt können wir Snyk verwenden, um das Projekt zu scannen und zu prüfen, ob eine unserer Python-Abhängigkeiten anfällig ist. Wenn Sie macOS verwenden, installieren Sie Snyk zunächst über brew, denn so können Sie am schnellsten loslegen:

brew tap snyk/tap
brew install snyk

Hinweis: Anleitungen zur Installation unter anderen Betriebssystemen wie Windows oder Linux finden Sie in den Installationsanweisungen in Snyk User Docs.

Sie müssen sich bei Snyk authentifizieren. Führen Sie dazu snyk auth aus und folgen Sie den Anweisungen, um sich im Browser anzumelden. Die Snyk CLI ruft dann automatisch Ihre API-Anmeldedaten ab.

Jetzt können wir unser Python-Projekt scannen. Führen Sie dazu Folgendes aus:

snyk test

Anschließend werden Ihnen die Snyk-Ergebnisse angezeigt:

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 hat die anfällige Jinja2-Version in unserem Projekt (Version 3.1.2) erfolgreich erkannt und über die CLI eine Fehlerbehebung empfohlen.

Nutzen Sie auch die Möglichkeit, eine Snyk-Erweiterung in Ihrer IDE einzusetzen und Ihren eigenen Python-Code sowie containerisierte Python-Anwendungen zu scannen. Zusätzlich können Sie damit auch Abhängigkeiten von Drittanbietern aus PyPI überprüfen.

Lässt sich die Jinja2-XSS-Schwachstelle leicht ausnutzen?

Wie komplex die Ausnutzung dieser Schwachstelle ist, hängt von der jeweiligen Anwendung und ihrer Implementierung von Jinja2 ab. Aufgrund der Natur von XSS-Schwachstellen sollten Sie sie jedoch mit hoher Priorität behandeln.

Jinja2-Sicherheitslücke beheben und Sicherheit kontinuierlich überwachen

Entwicklern wird dringend empfohlen, umgehend auf Jinja2 Version 3.1.3 zu aktualisieren, um diese Sicherheitslücke zu beheben.

Darüber hinaus können Tools wie Snyk entscheidend dazu beitragen, Sicherheitslücken kontinuierlich zu überwachen. Snyk erkennt anfälligen Code und anfällige Bibliotheken nicht nur über seine IDE-Erweiterung, sondern ist auch unverzichtbar, um containerisierte Anwendungen mit Docker zu scannen, die diese anfällige Abhängigkeit enthalten.

Wie kann ich mein Projekt vor der Jinja2-XSS-Schwachstelle schützen?

Aktualisieren Sie Jinja2 auf Version 3.1.3 oder höher. Ändern Sie dazu Ihre requirements.txt-Datei in Jinja2>=3.1.3 und führen Sie pip install -U -r requirements.txt aus.

Ressourcen zur Entwicklersicherheit – und was kommt als Nächstes?

Die Entdeckung von CVE-2024-22195 in Jinja2 erinnert daran, wie wichtig es ist, Abhängigkeiten aktuell zu halten und Tools wie Snyk zur kontinuierlichen Sicherheitsüberwachung einzusetzen. Wenn Entwickler informiert und proaktiv bleiben, können sie ihre Projekte vor solchen Sicherheitslücken schützen.

Erfahren Sie mit Snyk Learn mehr über XSS in Python: XSS in Python

Cheat Sheet zu Best Practices für Python-Sicherheit: Python Security Best Practices

Python-Virtual-Environments optimal nutzen: Python Virtual Environments

Best Practices für die Containerisierung von Python-Anwendungen mit Docker: Containerizing Python with Docker

Gibt es weitere empfohlene Sicherheitsmaßnahmen für Jinja2-Nutzer?

Neben der Aktualisierung von Jinja2 sollten Nutzer allgemeine Best Practices für Sicherheit befolgen, etwa alle Benutzereingaben zu validieren und zu bereinigen, Content-Security-Policies einzusetzen und regelmäßige Sicherheitsaudits durchzuführen.

Weiterlesen

illustration hero ai
Blog

PHP behebt zwei kritische unauthentifizierte RCE-Schwachstellen (CVE-2026-109618, CVE-2026-109619): Jetzt aktualisieren

Zwei kritische Sicherheitslücken im Request-Lebenszyklus von PHP können unauthentifizierte Remote Code Execution ermöglichen. Aktualisieren Sie auf eine korrigierte Version oder installieren Sie für ältere Versionen einen Backport des Anbieters.

blog feature ai lilac
Blog

Mit agentischer Behebung Ihren Schwachstellen-Backlog in Pull Requests verwandeln

Der Evo Remediation Agent ist jetzt in der öffentlichen Vorschau verfügbar und erweitert Evo Agentic AppSec um die automatisierte Auflösung von Abhängigkeiten. AppSec-Teams können jetzt kontinuierliche Behebungskampagnen durchführen

AI Background min crop
Blog

KI ruft alle Risiken auf den Plan, die Sie akzeptiert haben: Sieben Erkenntnisse aus dem AI Security Panel: Unfiltered

KI macht Angriffe günstiger und schneller und legt Risiken offen, die Unternehmen bereits tragen. Vier Sicherheitsverantwortliche erklären, warum Abwehr in Maschinengeschwindigkeit und schnellere Behebung jetzt unverzichtbar sind.