Сет Майкл Ларсон: Когда str.lower() является уязвимостью безопасности в Python
Интернет-стандарты часто не поддерживают символы, отличные от ASCII, что требует преобразования доменных имен. NamePrep, определенный в RFC 3491, был разработан для этой цели как часть IDNA 2003. Этот более старый стандарт IDNA с тех пор был заменен IDNA 2008, указанным в RFC 5890-5893. Python поддерживает обе версии: IDNA 2003 доступен через кодек idna, а IDNA 2008 — через внешний пакет idna. Модуль stringprep в стандартной библиотеке Python реализует StringPrep. Важным шагом в StringPrep является "приведение к нижнему регистру" (case folding), которое включает преобразование символов в нижний или верхний регистр для сравнения без учета регистра. Этот процесс использует таблицы преобразования B.2 и B.3 из RFC 3454, основанные на правилах Unicode 3.2.0. Была выявлена уязвимость в реализации Python, где стандартная функция str.lower(), использующая более новые версии Unicode, отклонялась от требуемых правил приведения к нижнему регистру Unicode 3.2.0. Это несоответствие приводило к различным кодировкам IDNA для определенных символов. Исправление заключалось в создании специальных исключений, чтобы поведение str.lower() в Python соответствовало Unicode 3.2.0 для расчетов StringPrep и IDNA. Это исправление обеспечивает соответствие IDNA 2003 его спецификации.
idna, а IDNA 2008 — через внешний пакетidna. Модульstringprepв стандартной библиотеке Python реализует StringPrep. Важным шагом в StringPrep является "приведение к нижнему регистру" (case folding), которое включает преобразование символов в нижний или верхний регистр для сравнения без учета регистра. Этот процесс использует таблицы преобразования B.2 и B.3 из RFC 3454, основанные на правилах Unicode 3.2.0. Была выявлена уязвимость в реализации Python, где стандартная функцияstr.lower(), использующая более новые версии Unicode, отклонялась от требуемых правил приведения к нижнему регистру Unicode 3.2.0. Это несоответствие приводило к различным кодировкам IDNA для определенных символов. Исправление заключалось в создании специальных исключений, чтобы поведениеstr.lower()в Python соответствовало Unicode 3.2.0 для расчетов StringPrep и IDNA. Это исправление обеспечивает соответствие IDNA 2003 его спецификации.