HeadlinesBriefing favicon HeadlinesBriefing.com

Уязвимость безопасности IDNA в Python str.lower() исправлена

Hacker News •
×

Некоторые стандарты интернета поддерживают только символы ASCII, но мир использует гораздо больше, чем латинский алфавит. Поэтому требуется отображение Unicode в ASCII для использования в доменных именах. Name Prep был частью этого решения, определен в RFC 3491 в качестве профиля String Prep, и является ключевым компонентом Internationalizing Domain Names in Applications (IDNA), также известного как "IDNA 2003". Алгоритм String Prep определен в RFC 3454. IDNA 2003 был устаревшим по IDNA 2008, определенному в RFC 5890, 5891, 5892 и 5893. Python поддерживает IDNA 2003 через кодек idna (str.encode('idna')) и IDNA 2008 поддерживается пакетом idna в Индексе пакетов Python. Реализация Python String Prep реализована в модуле stringprep стандартной библиотеки.

В общем случае вы должны использовать пакет idna (IDNA 2008) и не .encode("idna") (IDNA 2003), но иногда вам нужно старое поведение. String Prep определяет этап "case folding" (сворачивания регистра) в разделе 3.2, обеспечивая регистронезависимое сравнение строк, сопоставляя все символы через таблицы отображения B.2 и B.3. B.2 на самом деле str.lower(), преобразующий все символы в нижний регистр согласно правилам Unicode, а B.3 содержит исключения.

Вызов str.lower() в этой функции является уязвимостью! Поскольку str использует любые данные Unicode, которые поставляются с конкретным интерпретатором Python, вы можете узнать, какую версию Unicode использует ваш интерпретатор Python, получив доступ к unicodedata.unidata_version. Также есть база данных данных Unicode 3.2.0, доступная во всех версиях Python (unicodedata.ucd_3_2_0), специально для алгоритмов String Prep и IDNA. String Prep зависит от этой конкретной версии Unicode для того, чтобы работать последовательно, таблицы B.2 и B.3 в RFC 3454 по сути закодированы в таблицу правил сворачивания регистра Unicode 3.2.0. Поэтому нам нужно использовать правила сворачивания регистра Unicode 3.2.0, а не более новые правила сворачивания регистра Unicode.

Исправление заключалось в создании новых исключений, чтобы str.lower() вел себя так, как будто он использует Unicode 3.2.0 для определенных функций. Благодарность Bitshift за сообщение об уязвимости, Stan Ulbrych за совместную разработку устранения неполадок, и Marc-Andre Lemburg и Petr Viktorin за проверку устранения неполадок. См. CVE-2026-17084 для получения дополнительной информации.

Ключевые сущности: Компании: Python Software Foundation, Alpha-Omega | Люди: Seth Larson, Bitshift, Stan Ulbrych, Marc-Andre Lemburg, Petr Viktorin