Перейти к содержанию

Python str.lower() как уязвимость в IDNA и TLS

8.0/10

Статья на sethmlarson.dev объясняет, что поведение Python str.lower() может расходиться с требованиями Unicode в чувствительных к безопасности контекстах, в частности при нормализации имён для IDNA и проверке TLS-сертификатов. Из-за привязки к конкретной версии Unicode, а не к версии 3.2.0, которую требуют алгоритмы StringPrep и IDNA, одна и та же строка может превращаться в разные доменные имена в зависимости от реализации. В Python уже есть данные Unicode 3.2.0 в модуле unicodedata.ucd_3_2_0, однако предложенное исправление заключается в добавлении специальных исключений, чтобы str.lower() в отдельных функциях вёл себя как Unicode 3.2.0. Это создаёт тонкую уязвимость: расхождение между реализацией и спецификацией может приводить к некорректной валидации имён и сертификатов.

Контекст

IDNA (Internationalized Domain Names in Applications) — стандарт для интернациональных доменных имён, который опирается на алгоритм StringPrep из RFC 3454. Таблицы B.2 и B.3 этого RFC фактически кодируют правила приведения регистра (case-folding) из Unicode 3.2.0, поэтому для согласованной работы IDNA требуется именно эта версия Unicode, а не более новые. Python же использует str.lower(), который опирается на версию Unicode, встроенную в текущий интерпретатор; расхождение между реализацией и спецификацией при сравнении доменных имён, например в проверке сертификатов TLS, и создаёт уязвимость.

Влияние

Разработчики, использующие str.lower() для нормализации доменных имён или проверки сертификатов в Python, могут получить поведение, несовместимое с IDNA/TLS, что способно привести к ошибкам валидации и потенциальным обходам проверок.

Обсуждение

В комментариях часть участников сомневается, что это действительно уязвимость, а не просто ошибка генерации данных; другие критикуют исправление как хрупкое и отмечают, что в Python уже есть данные Unicode 3.2.0, а браузеры используют UTS #46, а не IDNA2008.

Источники

Покрытие источниками

Проверяются выбранные ключевые утверждения, а не истинность всей статьи целиком.

  1. Поддерживается прямым источником

    Python str.lower() как уязвимость в IDNA и TLS

    • sethmlarson.dev · подтверждает · первоисточник
    • docs.python.org · контекст · компетентная запись
    • tutorialspoint.com · контекст · тип источника не определён
    • pythonz.net · контекст · тип источника не определён