HeadlinesBriefing favicon HeadlinesBriefing.com

Python str.lower() IDNA-Sicherheitsfehler wurde behoben

Hacker News •
×

Einige Internetstandards unterstützen nur ASCII-Zeichen, aber die Welt verwendet weit mehr als das lateinische Alphabet. Es ist daher erforderlich, Unicode in ASCII für die Verwendung in Domain-Namen abzubilden. Name Prep war Teil dieser Lösung, definiert in RFC 3491 als Profil von String Prep, und ist eine entscheidende Komponente von Internationalizing Domain Names in Applications (IDNA), auch als "IDNA 2003" bekannt. Der String Prep-Algorithmus ist in RFC 3454 definiert. IDNA 2003 wurde durch IDNA 2008 ersetzt, definiert in RFC 5890, 5891, 5892 und 5893. Python unterstützt IDNA 2003 durch den idna-Codec (str.encode('idna')) und IDNA 2008 wird vom idna-Paket im Python Package Index unterstützt. Die Implementierung von Python für String Prep ist in dem Modul stringprep in der Standardbibliothek implementiert.

Grundsätzlich sollten Sie das idna-Paket (IDNA 2008) verwenden und nicht .encode("idna") (IDNA 2003), aber manchmal benötigen Sie das ältere Verhalten. String Prep definiert den "Case Folding"-Schritt (Case Folding ist etwa "wie man einen Codepunkt in Klein-/Großbuchstaben umwandelt") in Abschnitt 3.2, wodurch Case-Insensitive-Vergleiche von Zeichenketten ermöglicht werden, indem alle Zeichen durch die Zuordnungstabellen B.2 und B.3 abgebildet werden. B.2 ist im Wesentlichen str.lower(), wobei alle Zeichen gemäß den Unicode-Regeln in Kleinbuchstaben umgewandelt werden und B.3 die Ausnahmen enthält.

Der str.lower()-Aufruf in dieser Funktion ist eine Schwachstelle! Denn str verwendet welche Unicode-Daten auch immer vom konkreten Python-Interpreter mitgeliefert werden, können Sie herausfinden, welche Unicode-Version Ihr Python-Interpreter verwendet, indem Sie auf unicodedata.unidata_version zugreifen. Es gibt auch eine Datenbank für Unicode 3.2.0-Daten, die in allen Versionen von Python verfügbar ist (unicodedata.ucd_3_2_0), speziell für die String Prep- und IDNA-Algorithmen. String Prep hängt von dieser spezifischen Unicode-Version ab, um konsistent zu arbeiten, die Tabellen B.2 und B.3 in RFC 3454 sind im Wesentlichen Unicode 3.2.0-Case-Folding-Regeln in einer Tabelle codiert. Wir müssen also die Unicode 3.2.0-Case-Folding-Regeln verwenden, nicht die neueren Unicode-Case-Folding-Regeln.

Die Korrektur bestand darin, neue Ausnahmen zu erstellen, damit str.lower() wie würde es Unicode 3.2.0 für bestimmte Funktionen verwenden. Wir danken Bitshift für die Meldung der Schwachstelle, Stan Ulbrych für die Mitentwicklung der Korrekturmaßnahmen, und Marc-Andre Lemburg sowie Petr Viktorin für die Überprüfung der Korrekturmaßnahmen. Siehe CVE-2026-17084 für weitere Details.

Schlüsselentitäten: Unternehmen: Python Software Foundation, Alpha-Omega | Personen: Seth Larson, Bitshift, Stan Ulbrych, Marc-Andre Lemburg, Petr Viktorin