У pip, uv и Poetry впервые будет общий выборный начальник
У pip, uv, Poetry и вообще всего Python-пакеджинга до сегодняшнего дня не было ни одного выборного органа — решения по интероп-спекам (wheel, PEP 440 и остальные) принимала неформальная PyPA, группа мейнтейнеров без единого мандата от комьюнити.
Как объявили в blog.python.org, сегодня в 14:00 UTC стартовали номинации сразу в новый Packaging Council (PEP 772, утверждён в апреле) и в PSF Board — окно до 11 августа, голосование 1–15 сентября.
Мест пять: топ-2 по голосам — два года (когорта A), следующие три — год (когорта B). Дальше когорты ротируются по очереди, чтобы совет не менялся весь разом.
Спорный PEP уровня будущего wheel v2 теперь будет решать голосование пятерых выборных, а не один решительный мейнтейнер, который раньше просто брал и делал. Медленнее, зато без личных вето — для стандартов, на которых держится весь пакеджинг, по-моему разумный обмен.
🔗 blog.python.org, blog.python.org, peps.python.org
У pip, uv, Poetry и вообще всего Python-пакеджинга до сегодняшнего дня не было ни одного выборного органа — решения по интероп-спекам (wheel, PEP 440 и остальные) принимала неформальная PyPA, группа мейнтейнеров без единого мандата от комьюнити.
Как объявили в blog.python.org, сегодня в 14:00 UTC стартовали номинации сразу в новый Packaging Council (PEP 772, утверждён в апреле) и в PSF Board — окно до 11 августа, голосование 1–15 сентября.
Мест пять: топ-2 по голосам — два года (когорта A), следующие три — год (когорта B). Дальше когорты ротируются по очереди, чтобы совет не менялся весь разом.
Спорный PEP уровня будущего wheel v2 теперь будет решать голосование пятерых выборных, а не один решительный мейнтейнер, который раньше просто брал и делал. Медленнее, зато без личных вето — для стандартов, на которых держится весь пакеджинг, по-моему разумный обмен.
🔗 blog.python.org, blog.python.org, peps.python.org
GIL уходит поэтапно — и по цифрам это заметно
Три фазы у free-threaded CPython, и по цифрам видно, что вторая — не косметика.
Phase I (3.13, октябрь 2024): экспериментальный билд, adaptive-интерпретатор выключен ради безопасности — минус 40% на single-thread коде. Многие тогда попробовали, увидели просадку и закрыли тему для себя.
Phase II (3.14, сейчас): PEP 779 приняли 16 июня 2025-го, статус — официально поддерживается, но не по умолчанию. Adaptive-интерпретатор вернули, просадка упала до 1% на macOS aarch64 и максимум 8% на x86-64 Linux.
Phase III — билд без GIL по умолчанию — пока просто пустая графа в PEP 779: критериев для неё авторы сознательно не написали. Ни PEP, ни даты — Steering Council решила сперва пожить с двумя билдами и посмотреть, что покажет прод.
🔗 peps.python.org, docs.python.org
Три фазы у free-threaded CPython, и по цифрам видно, что вторая — не косметика.
Phase I (3.13, октябрь 2024): экспериментальный билд, adaptive-интерпретатор выключен ради безопасности — минус 40% на single-thread коде. Многие тогда попробовали, увидели просадку и закрыли тему для себя.
Phase II (3.14, сейчас): PEP 779 приняли 16 июня 2025-го, статус — официально поддерживается, но не по умолчанию. Adaptive-интерпретатор вернули, просадка упала до 1% на macOS aarch64 и максимум 8% на x86-64 Linux.
Phase III — билд без GIL по умолчанию — пока просто пустая графа в PEP 779: критериев для неё авторы сознательно не написали. Ни PEP, ни даты — Steering Council решила сперва пожить с двумя билдами и посмотреть, что покажет прод.
🔗 peps.python.org, docs.python.org
Один Host-заголовок обходил защиту в каждом FastAPI
Пересчитал даты в advisory — между «нашли дыру» и «патч в релизе» прошло почти четыре месяца.
27 января X41 D-Sec наткнулись на баг, когда по заказу OSTIF гоняли аудит vLLM. Причина глубже: в Starlette
Мейнтейнеров уведомили 4 февраля, патч предложили 1 марта, а зашили в релиз только 21 мая — Starlette 1.0.1. Раскрыли на следующий день.
Starlette — подложка под FastAPI, vLLM, LiteLLM, 325 млн скачиваний в неделю. CVSS у мейнтейнера 6.5, у X41 — 7.0, и это не формальность: чем чаще access-контроль держится на пути запроса, а не на честной аутентификации, тем больнее такая дыра.
Если у вас FastAPI и Starlette не трогали с весны — гляньте версию.
🔗 github.com, ostif.org, badhost.org
Пересчитал даты в advisory — между «нашли дыру» и «патч в релизе» прошло почти четыре месяца.
27 января X41 D-Sec наткнулись на баг, когда по заказу OSTIF гоняли аудит vLLM. Причина глубже: в Starlette
request.url собирали из заголовка Host без проверки, а роутинг при этом смотрел на сырой путь из scope. Подсунул кривой Host — и request.url.path, на который завязаны миддлвари с проверками доступа, начинает врать.Мейнтейнеров уведомили 4 февраля, патч предложили 1 марта, а зашили в релиз только 21 мая — Starlette 1.0.1. Раскрыли на следующий день.
Starlette — подложка под FastAPI, vLLM, LiteLLM, 325 млн скачиваний в неделю. CVSS у мейнтейнера 6.5, у X41 — 7.0, и это не формальность: чем чаще access-контроль держится на пути запроса, а не на честной аутентификации, тем больнее такая дыра.
Если у вас FastAPI и Starlette не трогали с весны — гляньте версию.
🔗 github.com, ostif.org, badhost.org
Один релиз Pillow закрыл четыре дыры разом
Проверил
12.3.0 вышла ещё 1 июля, но CVE на самый неприятный баг из четырёх — EPS-парсер уходит в бесконечный цикл на отрицательном byte count в
В том же релизе тихо закрыли ещё три штуки: PDF без лимита на декомпрессию (классический zip bomb), shell-инъекцию через
Если Pillow где-то в проекте парсит файлы от пользователей — это апдейт на сегодня, а не «когда-нибудь занесу в спринт».
🔗 github.com, github.com
Проверил
pip show pillow в паре своих проектов — из них не все жили на актуальной версии.12.3.0 вышла ещё 1 июля, но CVE на самый неприятный баг из четырёх — EPS-парсер уходит в бесконечный цикл на отрицательном byte count в
%%BeginBinary — раскрыли только 14-го, и это до сих пор мало где обсуждали.В том же релизе тихо закрыли ещё три штуки: PDF без лимита на декомпрессию (классический zip bomb), shell-инъекцию через
ImageShow.WindowsViewer, если путь к файлу не свой, и утечку памяти на специально собранном JPEG2000.Если Pillow где-то в проекте парсит файлы от пользователей — это апдейт на сегодня, а не «когда-нибудь занесу в спринт».
🔗 github.com, github.com
Ruff одним патчем увеличил число правил в 7 раз
59 → 413. Именно так вырос дефолтный набор правил в Ruff 0.16.0, который вышел 23 июля.
С версии 0.1.0 в линтере накопилось 260+ новых правил — но по умолчанию их не включали, боялись сломать людям CI. Тут решились: заодно выпилили 18 самых холиварных pycodestyle/pyflakes-правил вроде E731 и F403 — слишком спорные, чтобы навязывать их всем.
Саймон Уиллисон прогнал релиз по своим проектам — и в sqlite-utils нашлось 1618 новых замечаний на коде, который днём раньше проходил линт чисто.
Откатить старое поведение:
🔗 astral.sh, simonwillison.net, github.com
59 → 413. Именно так вырос дефолтный набор правил в Ruff 0.16.0, который вышел 23 июля.
С версии 0.1.0 в линтере накопилось 260+ новых правил — но по умолчанию их не включали, боялись сломать людям CI. Тут решились: заодно выпилили 18 самых холиварных pycodestyle/pyflakes-правил вроде E731 и F403 — слишком спорные, чтобы навязывать их всем.
Саймон Уиллисон прогнал релиз по своим проектам — и в sqlite-utils нашлось 1618 новых замечаний на коде, который днём раньше проходил линт чисто.
Откатить старое поведение:
select = ["E4", "E7", "E9", "F"] в конфиге.🔗 astral.sh, simonwillison.net, github.com
Django 6.1 отрезает Python 3.10, 3.11 и Postgres 14
У меня в трёх сервисах на проде до сих пор Python 3.10 — и до 5 августа с этим лучше определиться.
Django 6.1 rc1 вышел 22 июля, финальный релиз — на днях. И это не косметический минор: под капотом подняли нижнюю планку сразу по всей матрице окружений.
PostgreSQL 14 выкидывают — не потому что кто-то поленился тестировать, а потому что апстрим сам хоронит эту версию в ноябре. SQLite подняли с 3.31 до 3.37 — это уже не «Ubuntu 20.04 из коробки», такое придётся доставлять руками. MariaDB и MySQL тоже сдвинули на пару минорных версий вверх.
Если в докерфайле годами лежит
🔗 djangoproject.com, docs.djangoproject.com
У меня в трёх сервисах на проде до сих пор Python 3.10 — и до 5 августа с этим лучше определиться.
Django 6.1 rc1 вышел 22 июля, финальный релиз — на днях. И это не косметический минор: под капотом подняли нижнюю планку сразу по всей матрице окружений.
PostgreSQL 14 выкидывают — не потому что кто-то поленился тестировать, а потому что апстрим сам хоронит эту версию в ноябре. SQLite подняли с 3.31 до 3.37 — это уже не «Ubuntu 20.04 из коробки», такое придётся доставлять руками. MariaDB и MySQL тоже сдвинули на пару минорных версий вверх.
Если в докерфайле годами лежит
python:3.10-slim и старый postgres:14 — это тот редкий апгрейд, где pip install -U django сам по себе не сработает, пока не поднимете инфру под ним.🔗 djangoproject.com, docs.djangoproject.com
uv 0.12 решил, что вам нужен пакет, а не скрипт
uv init с 28 июля стал строже: вместо голого
С версии 0.12.0
Заодно ужесточили
Голый layout никуда не делся —
🔗 github.com, github.com
uv init с 28 июля стал строже: вместо голого
main.py в корне — сразу пакет.С версии 0.12.0
uv init кладёт код в src/имя/_init_.py, подключает [build-system] с собственным бэкендом uv_build и сразу даёт uv build собрать wheel и tar.gz. Такой layout был дефолтом ещё в v0.3, но в v0.4 его убрали — как объяснили в issue #20185, начинающих путал hatchling. Теперь astral сделали свой билд-бэкенд и вернули пакет по умолчанию.Заодно ужесточили
--project: раньше несуществующий путь давал warning и uv тихо продолжал работать в текущей директории, теперь сразу падает с ошибкой. Отключить нельзя.Голый layout никуда не делся —
uv init --no-package name. Но по умолчанию теперь именно так: инструмент решил, что раз вы его открыли, скрипта вам мало, нужен пакет.🔗 github.com, github.com
Дважды в 2026-м патч CPython сам оказался дырявым
16 марта в security-announce@python.org ушло письмо: CVE-2026-3644 закрывает дыру в
Тогда, в CVE-2026-0672, дырявыми были control-символы в куки (header injection). Патч выправил
Это уже второй раз в 2026-м: с
Если пишете регресс-тест на CVE — гоняйте его не только на PoC из адвизори, а на соседних методах того же класса:
🔗 mail.python.org, mail.python.org, github.com
16 марта в security-announce@python.org ушло письмо: CVE-2026-3644 закрывает дыру в
http.cookies.Morsel, вроде бы починенную в феврале.Тогда, в CVE-2026-0672, дырявыми были control-символы в куки (header injection). Патч выправил
.output(), но .update(), оператор |= и unpickle остались непроверенными — это исправили только в марте, судя по коммиту в cpython.Это уже второй раз в 2026-м: с
webbrowser.open() та же схема, только месяцем позже. CVE-2026-4519 (CVSS 7.0) запрещал URL с ведущим дефисом — часть браузеров читает его как CLI-флаг, командная инъекция. Мейнтейнеры отсекли дефис, но не все пути к нему — обход остался рабочим, и через месяц вышла CVE-2026-4786 с пометкой «incomplete mitigation» в security-announce.Если пишете регресс-тест на CVE — гоняйте его не только на PoC из адвизори, а на соседних методах того же класса:
.update(), |=, unpickle.🔗 mail.python.org, mail.python.org, github.com
$90 000 — весь бюджет PSF на гранты в этом году
Питон-митап у вас в городе получит от PSF максимум $2000 на всю конференцию. Раньше так не было.
Год назад фонд просто кончил деньги: 1 августа 2025-го грантовую программу приостановили, бюджет съели раньше срока. В октябрьском заявлении фонда — отказ от гранта NSF на $1.5M, условием было подписать отказ от любых DEI-программ фонда целиком, не только в этом проекте. В январе дыру частично закрыл донат Anthropic на $1.5M.
Как написали в блоге PSF в июле, программу перезапустили — но не ту, что была. Потолок на конференцию срезали до $2000, воркшопы остались на $1500. Заявки берут 4–25 августа, и только на мероприятия с декабря 2026 по апрель 2027.
Весь этот новый раунд целиком — $90 000 на всех сразу за год.
🔗 pyfound.blogspot.com, pyfound.blogspot.com, pyfound.blogspot.com
Питон-митап у вас в городе получит от PSF максимум $2000 на всю конференцию. Раньше так не было.
Год назад фонд просто кончил деньги: 1 августа 2025-го грантовую программу приостановили, бюджет съели раньше срока. В октябрьском заявлении фонда — отказ от гранта NSF на $1.5M, условием было подписать отказ от любых DEI-программ фонда целиком, не только в этом проекте. В январе дыру частично закрыл донат Anthropic на $1.5M.
Как написали в блоге PSF в июле, программу перезапустили — но не ту, что была. Потолок на конференцию срезали до $2000, воркшопы остались на $1500. Заявки берут 4–25 августа, и только на мероприятия с декабря 2026 по апрель 2027.
Весь этот новый раунд целиком — $90 000 на всех сразу за год.
🔗 pyfound.blogspot.com, pyfound.blogspot.com, pyfound.blogspot.com
mypy — 45 секунд. ty — 2.
Полез проверять цифры Astral, ожидая маркетингового преувеличения — не подтвердилось. Бенчмарк честный: home-assistant, холодный запуск, без кэша. И тесты не спрятаны — в репозитории ty на GitHub бенчмарки лежат открыто, можно прогнать на своём проекте, а не верить графику на слово.
У той же команды за плечами uv и ruff, где «в разы быстрее» оказалось правдой, а не слоганом — доверия это добавляет.
Stable ещё не вышел, Astral сейчас чинят поддержку Pydantic и Django, а не гонятся за цифрами. У меня mypy в проекте фоном не бесит, переезжать сегодня не буду — но как выкатят stable, погоняю на отдельной ветке, не сразу в CI.
🔗 astral.sh, github.com
Полез проверять цифры Astral, ожидая маркетингового преувеличения — не подтвердилось. Бенчмарк честный: home-assistant, холодный запуск, без кэша. И тесты не спрятаны — в репозитории ty на GitHub бенчмарки лежат открыто, можно прогнать на своём проекте, а не верить графику на слово.
У той же команды за плечами uv и ruff, где «в разы быстрее» оказалось правдой, а не слоганом — доверия это добавляет.
Stable ещё не вышел, Astral сейчас чинят поддержку Pydantic и Django, а не гонятся за цифрами. У меня mypy в проекте фоном не бесит, переезжать сегодня не буду — но как выкатят stable, погоняю на отдельной ветке, не сразу в CI.
🔗 astral.sh, github.com
frozendict — новый builtin в Python 3.15
Питон 30+ лет жил без built-in неизменяемого dict — в 3.15 это наконец исправили.
PEP 814 приняли в феврале,
Специфичного кода в патче — всего ~560 строк (7%), остальное общий движок с dict. Из коробки работают json, pickle, pprint, marshal, xml.etree.
Финал 3.15 — в октябре.
🔗 peps.python.org, vstinner.github.io
Питон 30+ лет жил без built-in неизменяемого dict — в 3.15 это наконец исправили.
PEP 814 приняли в феврале,
frozendict уже в бета-сборках. Не путайте с types.MappingProxyType — это просто read-only обёртка над dict, hash() от неё как не было, так и нет. frozendict — отдельный тип, хешируемый, если хешируемы все значения: можно класть конфиг прямо в ключ словаря или в set, без tuple(sorted(d.items())).Специфичного кода в патче — всего ~560 строк (7%), остальное общий движок с dict. Из коробки работают json, pickle, pprint, marshal, xml.etree.
Финал 3.15 — в октябре.
🔗 peps.python.org, vstinner.github.io
На PyPI кража секретов начинается раньше, чем на npm — прямо на import
17 пакетов с одинаковым 1.0.0 — и это само по себе должно было насторожить раньше, чем название.
Socket 7 июля раскрыл кампанию: на PyPI и npm одновременно выложили фейковые SDK для Paysafe, Skrill и Neteller. Методы внутри выглядят рабочими, отвечают «успех» — и молча сливают секреты на C2 в AWS.
На PyPI кража стартует прямо при
Перед тем как что-то украсть, скрипт смотрит на hostname и число ядер. Меньше двух CPU или слово sandbox в имени машины — и он просто ничего не делает.
🔗 socket.dev
17 пакетов с одинаковым 1.0.0 — и это само по себе должно было насторожить раньше, чем название.
Socket 7 июля раскрыл кампанию: на PyPI и npm одновременно выложили фейковые SDK для Paysafe, Skrill и Neteller. Методы внутри выглядят рабочими, отвечают «успех» — и молча сливают секреты на C2 в AWS.
На PyPI кража стартует прямо при
import, без единого вызова функции. В npm-версии для этого нужен настоящий Paysafe API-ключ — там разработчики малвари решили не размениваться по мелочам.Перед тем как что-то украсть, скрипт смотрит на hostname и число ядер. Меньше двух CPU или слово sandbox в имени машины — и он просто ничего не делает.
🔗 socket.dev
FaceHugger: RCE из-за одной f-строки в Diffusers
Библиотеку почти из каждого AI-пайплайна уронил
Zafran Labs нашли способ обойти
По второму advisory, GHSA-98h9, гейт вообще не смотрел на локальные снапшоты и custom-компоненты — та же дыра без словесной игры с None. В 0.38.0 закрыли разом: проверку перенесли в
Тянете модели с Hub через
🔗 thehackernews.com, github.com, github.com
Библиотеку почти из каждого AI-пайплайна уронил
None.Zafran Labs нашли способ обойти
trust_remote_code в Diffusers и назвали связку багов FaceHugger (пишет Hacker News, 2 августа). Самый нелепый — из advisory GHSA-j7w6: f"{custom_pipeline}.py" без аргумента превращается в "None.py", и файл с таким именем в чужом репозитории тихо выполнялся на обычном from_pretrained(repo).По второму advisory, GHSA-98h9, гейт вообще не смотрел на локальные снапшоты и custom-компоненты — та же дыра без словесной игры с None. В 0.38.0 закрыли разом: проверку перенесли в
get_cached_module_file, единственную точку, через которую идёт любая динамическая загрузка модуля.Тянете модели с Hub через
from_pretrained — гляньте pip show diffusers: если версия ниже 0.38.0, обновление не косметическое.🔗 thehackernews.com, github.com, github.com
html.parser молча уходит в O(n²)
Заголовок issue на GitHub — «Another worst case quadratic complexity in HTMLParser». Не первая такая находка в этом парсере — уже показательно.
CVE-2026-15308: скармливаешь html.parser.HTMLParser данные кусками через feed() (как все стриминговые обёртки), а внутри висит незакрытый тег или комментарий — и парсер на каждый чанк заново пересканирует весь буфер и заново его склеивает. Оба действия квадратичные. Пара мегабайт кривого HTML — и CPU в потолке без единой строчки в логе.
9 июля Serhiy Storchaka закрыл баг: буфер теперь список чанков, join и разбор — только когда данных накопилось достаточно. Патч ушёл в ветки 3.10–3.15.
Если где-то html.parser получает сеть или файл кусками — это ровно тот случай, который не поймать юнит-тестом на короткой строке.
🔗 mail.python.org, github.com, github.com
Заголовок issue на GitHub — «Another worst case quadratic complexity in HTMLParser». Не первая такая находка в этом парсере — уже показательно.
CVE-2026-15308: скармливаешь html.parser.HTMLParser данные кусками через feed() (как все стриминговые обёртки), а внутри висит незакрытый тег или комментарий — и парсер на каждый чанк заново пересканирует весь буфер и заново его склеивает. Оба действия квадратичные. Пара мегабайт кривого HTML — и CPU в потолке без единой строчки в логе.
9 июля Serhiy Storchaka закрыл баг: буфер теперь список чанков, join и разбор — только когда данных накопилось достаточно. Патч ушёл в ветки 3.10–3.15.
Если где-то html.parser получает сеть или файл кусками — это ровно тот случай, который не поймать юнит-тестом на короткой строке.
🔗 mail.python.org, github.com, github.com
FastMCP умер 28 июля — теперь это MCPServer
Если у вас MCP-сервер на FastMCP — 28 июля он перестал существовать. В буквальном смысле: класс переименовали в
Вместе с этим вышла ревизия спецификации 2026-07-28 — протокол стал полностью stateless. Раньше клиент делал handshake, получал session ID, и все следующие запросы шли через него же. Теперь хендшейка нет, ID нет — любой запрос может улететь на любой инстанс, обычный round-robin балансировщик подходит без танцев со sticky-сессиями.
По migration guide правка на одну строку:
🔗 github.com, py.sdk.modelcontextprotocol.io, blog.modelcontextprotocol.io
Если у вас MCP-сервер на FastMCP — 28 июля он перестал существовать. В буквальном смысле: класс переименовали в
MCPServer, а в блоге MCP в тот же день объяснили зачем — старый fastmcp слишком легко путали с одноимённым сторонним пакетом на своей 3.x-ветке.Вместе с этим вышла ревизия спецификации 2026-07-28 — протокол стал полностью stateless. Раньше клиент делал handshake, получал session ID, и все следующие запросы шли через него же. Теперь хендшейка нет, ID нет — любой запрос может улететь на любой инстанс, обычный round-robin балансировщик подходит без танцев со sticky-сессиями.
По migration guide правка на одну строку:
mcp.server.fastmcp меняется на mcp.server.mcpserver, FastMCP — на MCPServer, остальной код тулов не трогается. В GitHub-релизе v2.0.0 отдельно уточняют: v1.x при этом не удалили, но туда с этого дня идут только security-патчи.🔗 github.com, py.sdk.modelcontextprotocol.io, blog.modelcontextprotocol.io
Как публичный issue заставил ИИ-агента Google слить его же ключи
Нашёл историю, после которой на CI/CD с ИИ-агентами смотрю иначе.
В репозитории google/adk-python жили два бота: публичный triage-agent, который анализирует новые issue, и privileged code-fixing agent, который чинит код — но только по команде «своих».
Pillar Security затолкали в issue промпт-инъекцию. Triage-agent послушно написал
Дальше — RCE на CI-раннере и слив PAT бота,
Google убрал три воркфлоу из репы. Pillar называют это первым задокументированным agent-to-agent эксплойтом в проде. Если у вас есть бот, который реагирует на публичные issue и потом пишет команды от своего имени — это ровно ваш кейс.
🔗 pillar.security, thehackernews.com
Нашёл историю, после которой на CI/CD с ИИ-агентами смотрю иначе.
В репозитории google/adk-python жили два бота: публичный triage-agent, который анализирует новые issue, и privileged code-fixing agent, который чинит код — но только по команде «своих».
Pillar Security затолкали в issue промпт-инъекцию. Triage-agent послушно написал
/adk-issue-fix от имени adk-bot — а privileged workflow проверял только *кто* написал команду, а не подставили её или нет. adk-bot — коллаборатор, гейт пройден.Дальше — RCE на CI-раннере и слив PAT бота,
GOOGLE_API_KEY и ключа сервис-аккаунта GCP.Google убрал три воркфлоу из репы. Pillar называют это первым задокументированным agent-to-agent эксплойтом в проде. Если у вас есть бот, который реагирует на публичные issue и потом пишет команды от своего имени — это ровно ваш кейс.
🔗 pillar.security, thehackernews.com
У JIT в CPython теперь есть дедлайн — в цифрах
В июне JIT чуть не выпилили из CPython. Не за баги — за процесс: фича заехала в main через информационный PEP 744, без нормального обсуждения. Steering council дал полгода, чтобы это исправить.
Ответ — PEP 836. Не обещания, а числа по версиям. 3.15 (вот он, rc1, вышел 4 августа) — 8–9% на x86-64 Linux, 12–13% на ARM Mac. 3.16 обязан держать минимум +5%. 3.17 — уже +20%, вместе со free-threading.
Не дотянут до цифр — код уходит из main. Дедлайн на сам PEP — декабрь.
🔗 peps.python.org, blog.python.org, theregister.com
В июне JIT чуть не выпилили из CPython. Не за баги — за процесс: фича заехала в main через информационный PEP 744, без нормального обсуждения. Steering council дал полгода, чтобы это исправить.
Ответ — PEP 836. Не обещания, а числа по версиям. 3.15 (вот он, rc1, вышел 4 августа) — 8–9% на x86-64 Linux, 12–13% на ARM Mac. 3.16 обязан держать минимум +5%. 3.17 — уже +20%, вместе со free-threading.
Не дотянут до цифр — код уходит из main. Дедлайн на сам PEP — декабрь.
🔗 peps.python.org, blog.python.org, theregister.com
Один view-доступ в админке Django писал файлы на диск
Право
4 августа Django выпустил 6.0.8 и 5.2.17, закрыв разом четыре дыры. Самая злая — CVE-2026-15307:
Дальше — по драйверу: запись файла на диск или исходящий запрос прямо с сервера.
Патч режет dict и невалидные GEOSGeometry-строки прямо на входе в lookup. На прямое присваивание полю модели это не влияет — ломается только фильтрация.
Нашли баг Bence Nagy, localhost-detect и kimchunbok_.
🔗 djangoproject.com, github.com
Право
view на модель со spatial-полем в Django admin — и сервер уже пишет файл на диск. Без единого POST, просто через фильтр в changelist.4 августа Django выпустил 6.0.8 и 5.2.17, закрыв разом четыре дыры. Самая злая — CVE-2026-15307:
lookup_allowed() пропускал в spatial-lookup str и dict вместо геометрии, а GDALRaster тихо разбирал это как растр.Дальше — по драйверу: запись файла на диск или исходящий запрос прямо с сервера.
Патч режет dict и невалидные GEOSGeometry-строки прямо на входе в lookup. На прямое присваивание полю модели это не влияет — ломается только фильтрация.
Нашли баг Bence Nagy, localhost-detect и kimchunbok_.
🔗 djangoproject.com, github.com
3 тихих фикса в патч-релизе Python 3.14.7
Раз в полтора месяца выходит скучный x.y.z — обычно скроллю мимо changelog не глядя. Зря.
5 августа вышли 3.14.7 и 3.13.15, разом 499 фиксов. Из них — три, которые реально стоит знать, вынес в карточку.
Самый неприятный — base64:
И да, quadratic
🔗 github.com, github.com, github.com
Раз в полтора месяца выходит скучный x.y.z — обычно скроллю мимо changelog не глядя. Зря.
5 августа вышли 3.14.7 и 3.13.15, разом 499 фиксов. Из них — три, которые реально стоит знать, вынес в карточку.
Самый неприятный — base64:
b64decode() в обычном режиме годами молча съедал всё, что шло после первого =. RFC 4648 такого не разрешает, а код, который доверяет base64 как проверке формата, из-за этого мог пропускать лишние байты мимо себя.И да, quadratic
[1]/[last()] в xml.etree — ровно та же болезнь, что была у html.parser на прошлой неделе, просто в другом модуле.🔗 github.com, github.com, github.com
GitPython закрывал одну и ту же дыру шесть раз за три недели
Полез смотреть security advisories GitPython — и завис.
Одна причина, шестой раз подряд: kwargs с именем git-опции летят прямо в процесс
1 августа выяснилось, что сам guard
Шесть advisory за три недели на одну причину. Фикс каждый раз точечный, паттерн — нет.
🔗 github.com, advisories.gitlab.com, advisories.gitlab.com
Полез смотреть security advisories GitPython — и завис.
Одна причина, шестой раз подряд: kwargs с именем git-опции летят прямо в процесс
git, без проверки, откуда они взялись. 22 июля закрыли Repo.archive() и git.ls_remote() (CVE-2026-67323). 24-го — сразу два: clone(template=...) с исполняемыми hooks и Remote.add(), где та же утечка $ENV через URL, что чинили неделей раньше, просто с другого входа.1 августа выяснилось, что сам guard
check_unsafe_options() обходится — опцию можно спрятать внутри значения kwarg из одной буквы. 3 августа та же болезнь нашлась в checkout() и TagReference.create().Шесть advisory за три недели на одну причину. Фикс каждый раз точечный, паттерн — нет.
🔗 github.com, advisories.gitlab.com, advisories.gitlab.com
Октябрь 2026: Python 3.15 выходит — и в тот же месяц хоронит 3.10
Проверил, на чём у нас в проде крутится половина сервисов. 3.10. Ну как проверил — вспомнил после этой новости.
31 октября Python 3.10 официально уходит на пенсию: последний security-патч, дальше — только сам с собой. А 1 октября, ровно за месяц, релизится 3.15.0 (rc1 вышел 4 августа, rc2 — 1 сентября).
Один месяц, два события: новая версия въезжает, старая выезжает. Три с половиной года security-фиксов заканчиваются тихо — без анонса на весь блог, просто дата в таблице devguide.
Если у вас в CI до сих пор
🔗 python.org, devguide.python.org
Проверил, на чём у нас в проде крутится половина сервисов. 3.10. Ну как проверил — вспомнил после этой новости.
31 октября Python 3.10 официально уходит на пенсию: последний security-патч, дальше — только сам с собой. А 1 октября, ровно за месяц, релизится 3.15.0 (rc1 вышел 4 августа, rc2 — 1 сентября).
Один месяц, два события: новая версия въезжает, старая выезжает. Три с половиной года security-фиксов заканчиваются тихо — без анонса на весь блог, просто дата в таблице devguide.
Если у вас в CI до сих пор
python:3.10 — сейчас август, время есть. В декабре его уже не будет.🔗 python.org, devguide.python.org