Как безопасно проверить Netty SNI ClientHello allocation: затронутые версии, обратимый тест, измеримые PASS/FAIL/Unknown и stop-rule по ghsa-x4gw-5cx5-pgmh без production-данных.
Определите границу проблемы в Netty SNI ClientHello allocation
Отдельная пользовательская боль: короткий TLS-фрагмент объявляет большой ClientHello и вызывает раннее выделение памяти. Проверяемое правило: «объём выделения до полной проверки не превышает заданный лимит». Не переносите severity записи на любую установку: сначала нужны точный artifact, runtime-mode и достижимость затронутого пути. Reviewed advisory ghsa-x4gw-5cx5-pgmh опубликована 2026-06-08, обновлена 2026-06-12; её summary — «Netty: SNI handler pre-allocates up to 16 MiB from nine attacker bytes». Это подтверждает технический сигнал, но не эксплуатацию конкретной системы, не популярность запроса и не будущую индексацию страницы.
Сверьте версию, конфигурацию и достижимость
Зафиксируйте resolved dependency, provenance сборки и boundary «io.netty:netty-handler >= 4.2.0.Final, <= 4.2.14.Final; first patched 4.2.15.Final | io.netty:netty-handler <= 4.1.134.Final; first patched 4.1.135.Final». Затем разнесите состояния: компонента нет; версия вне диапазона; функция выключена; путь недостижим; исправление backported; требуется fixture. Рабочая матрица именно для этой проверки: declared length / received bytes / allocation peak / parser result / channel state. Banner, имя transitive package или общий CVE-score сами по себе не доказывают применимость. Если version scheme форка не сопоставима с upstream либо происхождение сборки неизвестно, результат остаётся Unknown и запрещает категоричный вывод.
Выполните обратимый изолированный fixture
Безопасная процедура: локальный EmbeddedChannel подаёт усечённый синтетический ClientHello с граничными длинами и считает allocator metrics. До запуска запишите ожидаемый invariant, размер тестовых данных, допустимые side effects и способ очистки. Добавьте positive control, который проходит нормальный путь компонента, и negative case, нарушающий только одну границу. Никаких production identifiers, секретов, внешних целей или персональных данных в fixture быть не должно. После каждого case удалите временное состояние и сравните counters: тест полезен только когда control доказывает исправность самого harness.
Примите решение по измеримым полям
Заполняйте артефакт без сырых логов: declared length / received bytes / allocation peak / parser result / channel state. PASS: пик выделения ограничен, некорректный канал закрыт, корректный control разобран. FAIL фиксируйте только если forbidden effect наблюдается в изоляции, версии и runtime-mode совпали, а оба controls дают ожидаемые результаты. Иначе используйте Inconclusive. Для повторяемости сохраните dependency resolution, hash fixture, имя теста, лимиты времени и памяти, а также итог PASS/FAIL/Unknown. Такой пакет помогает maintainer воспроизвести границу без раскрытия токенов, адресов и пользовательских данных.
Обновите компонент и соблюдайте stop-rule
Предпочтительное действие — использовать исправленную upstream-ветку, затем повторить тот же fixture и штатный control. Временное ограничение годится лишь когда разрывает описанный механизм, имеет владельца, срок действия и проверяемый rollback. Stop-rule: не подключать fixture к публичному TLS listener и не создавать давление на рабочий allocator. В обращение к maintainer включите build/provenance, feature state, обезличенную матрицу, control result и прямые ссылки на reviewed record и upstream; не добавляйте эксплуатационные инструкции или данные реальной среды.
Соберите минимальный пакет по сценарию netty-sni-clienthello-allocation-cap
Для этой конкретной проверки зафиксируйте не общий отчёт о безопасности, а узкую причинную цепочку. Наблюдаемая боль: короткий TLS-фрагмент объявляет большой ClientHello и вызывает раннее выделение памяти. Ожидаемая защитная граница: объём выделения до полной проверки не превышает заданный лимит. Тестовая операция: локальный EmbeddedChannel подаёт усечённый синтетический ClientHello с граничными длинами и считает allocator metrics. Поля доказательства перечисляйте в заданном порядке — declared length / received bytes / allocation peak / parser result / channel state. Критерий приёмки сформулирован заранее: пик выделения ограничен, некорректный канал закрыт, корректный control разобран. Если хотя бы один обязательный field отсутствует, итог нельзя повышать из Unknown в PASS или FAIL. Отдельно запишите, почему штатный control относится к тому же parser, cache, policy или protocol path, а не к соседней функции. Это предотвращает ложный вывод по внешне похожему симптому. После удаления temp-state повторите один малый control: результат должен быть детерминированным и не оставлять фоновых задач, файлов или сетевых обращений. Граница остановки остаётся обязательной: не подключать fixture к публичному TLS listener и не создавать давление на рабочий allocator.
Проверьте независимость вывода для Netty SNI ClientHello allocation
Рецензент должен суметь ответить на пять вопросов именно об этом механизме. Первое: каким наблюдением доказано «короткий TLS-фрагмент объявляет большой ClientHello и вызывает раннее выделение памяти», а не соседняя неисправность. Второе: где в resolved build проходит граница «объём выделения до полной проверки не превышает заданный лимит». Третье: почему операция «локальный EmbeddedChannel подаёт усечённый синтетический ClientHello с граничными длинами и считает allocator metrics» обратима и не затрагивает внешнюю систему. Четвёртое: какие из полей «declared length / received bytes / allocation peak / parser result / channel state» получены измерением, а какие заранее заданы конфигурацией. Пятое: почему критерий «пик выделения ограничен, некорректный канал закрыт, корректный control разобран» одновременно проверяет отрицательный случай и штатный control. Сопоставьте ответы с исходной формулировкой advisory «Netty: SNI handler pre-allocates up to 16 MiB from nine attacker bytes» и boundary «io.netty:netty-handler >= 4.2.0.Final, <= 4.2.14.Final; first patched 4.2.15.Final | io.netty:netty-handler <= 4.1.134.Final; first patched 4.1.135.Final», не расширяя их смысл. Если источник говорит только о затронутой версии, не приписывайте ему локальную эксплуатацию; если fixture показывает ошибку, не называйте её массовой. Для этого сценария допустимы только PASS, FAIL или Unknown с датой, build provenance и hash теста. Любое противоречие возвращает карточку на проверку, а правило «не подключать fixture к публичному TLS listener и не создавать давление на рабочий allocator» прекращает эксперимент до появления безопасной среды.
Отделите объявленную длину TLS от реально принятых байтов
В SNI-проверке особенно важно не смешивать три величины: длину TLS record, 24-битную длину handshake и число фактически накопленных байтов. Таблица должна показывать каждую отдельно для первого fragment, продолжения и завершённого ClientHello. Allocation peak снимайте через тестовый allocator до вызова hostname mapping: это доказывает именно порядок выделения, а не работу сертификата или SNI lookup. Граничные cases размещайте вокруг настроенного maxClientHelloLength, включая отсутствие лимита в используемом constructor. Нормальный control обязан содержать короткое допустимое имя сервера и завершать decode без повторного роста буфера. Если harness видит только итоговый close, но не момент allocation, такой результат остаётся Unknown: по нему нельзя утверждать, что раннее резервирование устранено. Отчёт не должен содержать домен клиента; достаточно фиктивного имени и числовых counters.
Материал подготовлен редакцией VOne с помощью ИИ; даты, диапазоны, прямые источники, безопасный fixture, privacy-границы и отсутствие рекламных обещаний затем перепроверены.
Источники и проверка
- GitHub Reviewed Advisory ghsa-x4gw-5cx5-pgmh проверено 2026-08-31
- Прямой upstream-источник для Netty SNI ClientHello allocation проверено 2026-08-31
Информация актуальна на дату публикации. Правила сервисов, приложений и сетей могут меняться.