К обсуждениям

Netty SNI: ограничение памяти до разбора ClientHello

Редакция VOne Технологии

Как безопасно проверить 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-границы и отсутствие рекламных обещаний затем перепроверены.

Источники и проверка

Информация актуальна на дату публикации. Правила сервисов, приложений и сетей могут меняться.

Ответы

0 опубликовано
Ответов пока нет. Вы можете начать обсуждение.

Ваш ответ

Добавьте свой опыт или уточнение по теме.

Вы публикуете как Аноним Аватар отличает разговоры, но не раскрывает личные данные.

Ответ появится сразу. Не публикуйте личные данные, ключи и приватные ссылки.