Как безопасно проверить Puma: лимит строки PROXY v1 до разбора: точная версия, reachability, обратимый fixture, измеримые PASS/FAIL/Unknown и stop-rule без production-данных.
Граница проблемы: Puma: лимит строки PROXY v1 до разбора
Самостоятельная пользовательская боль: одна незавершённая PROXY v1 строка без CRLF бесконечно увеличивает pre-parse buffer. Защитное правило для проверки сформулировано заранее: «как безопасно проверить что до crlf действует малый byte budget и timeout а превышение закрывает только offending connection в puma proxy protocol v1 parser без production данных». GitHub Reviewed Advisory ghsa-qpgp-93vx-g8v8 описывает: «Puma PROXY Protocol v1 Parser Allows Remote Memory Exhaustion»; запись опубликована 2026-06-08 и обновлена 2026-06-08. Эти сведения подтверждают технический сигнал и upstream-контекст, но не доказывают наличие затронутой версии, достижимость пути, эксплуатацию конкретной системы или популярность запроса. Поэтому итог по локальной среде начинается как Unknown и меняется только после inventory, reachability и изолированного теста.
Сверьте версии и достижимость для puma-proxy-v1-line-buffer-budget
Начинайте с inventory и resolved dependency, а не с общего severity. Boundary из reviewed record и прямого upstream-источника: «rubygems/puma >= 8.0.0, < 8.0.2; first patched 8.0.2 | rubygems/puma >= 5.5.0, < 7.2.1; first patched 7.2.1». Разнесите состояния в таблице: компонента нет; версия вне диапазона; исправление backported; функция выключена; путь недостижим; provenance неясен; нужен fixture. Рабочий набор полей именно для этой темы: PROXY enabled, bytes received, CRLF, buffer watermark, parser state, close reason. Banner, lockfile без resolved tree или совпадение имени пакета не являются доказательством. Если схема версий форка не сопоставима с upstream, оставьте Unknown и запросите build provenance вместо категоричного PASS.
Обратимый тест без production-данных: PROXY enabled
Безопасный fixture: socketpair/loopback harness порциями подаёт dummy bytes без CRLF и измеряет buffer watermark/close reason без внешней сети. До запуска запишите expected invariant, лимиты времени и памяти, допустимые side effects и способ полной очистки. Добавьте положительный control для штатного пути и отрицательный case, который меняет только одну проверяемую границу. Используйте фиктивные identifiers и временное состояние; токены, реальные адреса, пользовательские данные, рабочие конфиги и внешние цели исключены. После каждого case удалите temp-state и повторите малый control: он подтверждает, что отказ относится к механизму, а не к сломанному harness.
Зафиксируйте доказательство по полям close reason
Артефакт проверки хранит только минимизированные поля: PROXY enabled, bytes received, CRLF, buffer watermark, parser state, close reason. Для каждого поля отметьте источник: configuration, измерение, parser output или решение policy. Критерий PASS определён до запуска: watermark не превышает policy limit, bad connection закрывается, оба controls продолжают обслуживаться. FAIL допустим только если запрещённый эффект наблюдается в изоляции, boundary и runtime-mode совпали, а оба controls дают ожидаемый результат. Во всех остальных случаях ставьте Unknown или Inconclusive. Не прикладывайте сырые логи: достаточно hash fixture, версии, обезличенной матрицы, результата controls и времени проверки.
Проверьте причинность вывода о как безопасно проверить что до crlf действует малый byte budget и timeout а превышение зак
Рецензент должен связать наблюдение «одна незавершённая PROXY v1 строка без CRLF бесконечно увеличивает pre-parse buffer» с конкретной границей «как безопасно проверить что до crlf действует малый byte budget и timeout а превышение закрывает только offending connection в puma proxy protocol v1 parser без production данных», а не с похожим внешним симптомом. Попросите показать, где в resolved build применяется boundary «rubygems/puma >= 8.0.0, < 8.0.2; first patched 8.0.2 | rubygems/puma >= 5.5.0, < 7.2.1; first patched 7.2.1», почему операция «socketpair/loopback harness порциями подаёт dummy bytes без CRLF и измеряет buffer watermark/close reason без внешней сети» обратима и какие значения PROXY enabled, bytes received, CRLF, buffer watermark, parser state, close reason получены измерением. Затем отдельно объясните, почему результат «watermark не превышает policy limit, bad connection закрывается, оба controls продолжают обслуживаться» проверяет и отказ, и штатный control. Если хотя бы одно звено отсутствует, вывод возвращается в Unknown; severity advisory нельзя переносить на локальную установку автоматически.
Особенность механизма puma-proxy-v1-line-buffer-budget
У PROXY v1 граница проходит до поиска CRLF: отсутствие терминатора нельзя трактовать как разрешение бесконечно наращивать строку. В harness отдельно считайте принятые байты, текущий watermark и причину закрытия. Один control завершает короткую корректную строку, второй показывает, что после отказа новый независимый канал всё ещё обслуживается. Это отличает лимит одного parser buffer от общего состояния event loop и не требует сетевой нагрузки.
Обновление, повторная проверка и граница остановки
Предпочтительное действие — перейти на исправленную upstream-ветку из boundary «rubygems/puma >= 8.0.0, < 8.0.2; first patched 8.0.2 | rubygems/puma >= 5.5.0, < 7.2.1; first patched 7.2.1», затем повторить тот же fixture и штатный control. Временная мера допустима только если разрывает описанный механизм, имеет владельца, срок действия, наблюдаемый сигнал и проверяемый rollback. Обязательный stop-rule: не направлять поток на публичный Puma listener и не создавать memory pressure в рабочем process.. При его срабатывании эксперимент прекращают, не расширяя доступ и не повышая нагрузку. В обращение к maintainer включите provenance, feature state, матрицу полей и ссылки на reviewed advisory и прямой upstream-источник; эксплуатационные инструкции и данные реальной среды исключите.
Минимальный пакет для поддержки по puma-proxy-v1-line-buffer-budget
Соберите короткую причинную карточку: боль — «одна незавершённая PROXY v1 строка без CRLF бесконечно увеличивает pre-parse buffer»; invariant — «как безопасно проверить что до crlf действует малый byte budget и timeout а превышение закрывает только offending connection в puma proxy protocol v1 parser без production данных»; версия — «rubygems/puma >= 8.0.0, < 8.0.2; first patched 8.0.2 | rubygems/puma >= 5.5.0, < 7.2.1; first patched 7.2.1»; операция — «socketpair/loopback harness порциями подаёт dummy bytes без CRLF и измеряет buffer watermark/close reason без внешней сети»; поля — PROXY enabled, bytes received, CRLF, buffer watermark, parser state, close reason; PASS — «watermark не превышает policy limit, bad connection закрывается, оба controls продолжают обслуживаться». Добавьте hash теста, результат positive/negative controls, cleanup result и причину, по которой тест не касается внешней системы. Не включайте IP, токены, реальные имена, ключи, содержимое документов или полные логи. Если direct source подтверждает только release context, так и укажите: он не является доказательством локальной уязвимости. Граница остановки остаётся неизменной: не направлять поток на публичный Puma listener и не создавать memory pressure в рабочем process..
Материал подготовлен редакцией VOne с помощью ИИ; даты, диапазоны, прямые источники, безопасный fixture, privacy-границы и отсутствие рекламных обещаний затем перепроверены.
Источники и проверка
- GitHub Reviewed Advisory ghsa-qpgp-93vx-g8v8 проверено 2026-08-31
- Прямой upstream-источник для Puma: лимит строки PROXY v1 до разбора проверено 2026-08-31
Информация актуальна на дату публикации. Правила сервисов, приложений и сетей могут меняться.