30 октября 2026 года вышел Twisted 26.10.0, сетевой фреймворк для Python, на котором пишут асинхронные серверы и клиенты: HTTP, SSH, Telnet, почта, DNS, IRC и XMPP. В выпуске исправлены семь уязвимостей, три из них разработчики оценили как высокие. Все затрагивают версии до 26.4.0 включительно.
Напрямую Twisted ставят не так часто, но он приезжает зависимостью. Например, его требуют Scrapy, Matrix Synapse и Buildbot. Так что если на сервере крутится что-то из этого или свой сервис на Twisted, стоит проверить версию в каждом виртуальном окружении и контейнере.
Подмена HTTP-запросов за прокси: CVE-2026-115877
HTTP-сервер twisted.web отклонял нулевой байт в значении заголовка, но пропускал одиночные символы CR и LF, хотя RFC 9110 требует отбрасывать все три. Если в значении заголовка спрятать голый перевод строки и следом ещё один заголовок, Twisted видит одну строку, а стоящий перед ним прокси может увидеть две. Из-за этой разницы злоумышленник может протащить через прокси запрос, который тот не должен был пропустить (request smuggling). Оценка по бюллетеню 5,4 из 10.
Опасно это прежде всего там, где перед приложением на Twisted стоит nginx, HAProxy или CDN и на них завязаны правила доступа. Это продолжение старых исправлений: раньше в той же проверке закрыли только нулевой байт.
Ещё одно исправление для веба касается HTTP/2: сервер Twisted теперь ограничивает, как часто клиент может сбрасывать потоки. Это защита от известной атаки HTTP/2 Rapid Reset (CVE-2023-44487), о которой стало известно в 2023 году.
Три способа уронить сервер одним соединением
Три уязвимости с оценкой «высокая» устроены одинаково: сервер копит входящие данные в буфер без ограничения размера и ждёт символа, которого атакующий так и не пришлёт. Память растёт, пока процесс не убьёт система. Вход не нужен, хватит одного соединения, а поскольку Twisted работает в одном потоке, падает сразу весь сервис со всеми пользователями.
- CVE-2026-115778, Telnet в
twisted.conch, 7,5 из 10: клиент открывает служебные переговоры о параметрах и шлёт байты, не закрывая их. - CVE-2026-115776, IRC-сервер в
twisted.words, 7,5 из 10: поток данных без перевода строки. Касается и сервераtwistd words. - CVE-2026-115775, разбор XML для XMPP в
twisted.words.xish: клиент открывает элемент и бесконечно шлёт вложенные, не закрывая его.
IMAP и DNS: зависание и подмена ответов
В IMAP-сервере CVE-2026-115774 (4,9 из 10) позволял вошедшему пользователю подвесить весь процесс одной командой SEARCH с отрицательным размером литерала вроде {-100}. Парсер уходил в бесконечный цикл и занимал процессор на 100%, остальные клиенты переставали получать ответы. Заодно IMAP-сервер перестал принимать от клиентов произвольные регулярные выражения.
DNS-клиент twisted.names (CVE-2026-83813, 3,1 из 10) принимал ответ по UDP, сверяя только 16-битный идентификатор запроса, и не проверял, от того ли сервера он пришёл. Любой узел, который может отправить пакет на порт резолвера и угадает идентификатор, мог подсунуть свой ответ. Это касается и поиска MX-записей в twisted.mail. Теперь ответы от чужих адресов отбрасываются.
Как проверить и обновить
Версию смотрим в том окружении, где работает сервис:
python3 -c "import twisted; print(twisted.__version__)" # или pip show twisted | grep -i ^version
Обновление обычное. Если Twisted приехал зависимостью, достаточно поднять его отдельно, ограничения у Scrapy, Synapse и Buildbot на нижнюю версию это допускают:
pip install -U "twisted>=26.10.0" # в проектах на uv uv lock --upgrade-package twisted && uv sync
После обновления сервис нужно перезапустить, иначе в памяти останется старый код. Если у вас Twisted в Docker-образе, пересоберите образ. Для Twisted 26.10.0 нужен Python 3.10 или новее, и это последний выпуск с поддержкой 3.10: сама 3.10 уже без обновлений, так что следующая версия Twisted на ней не встанет.
В итоге: если у вас есть хоть что-то на Twisted, смотрящее в сеть, обновляйтесь до 26.10.0. Самое неприятное здесь три способа без входа положить сервер на Telnet, IRC и XMPP и обход прокси через голый перевод строки в заголовке. Остальное менее срочно, но обновление закрывает всё сразу.