Как безопасно проверить Netty Unix socket: все полученные fd закрываются при reject: точная версия, reachability, обратимый fixture, измеримые PASS/FAIL/Unknown и stop-rule без production-данных.
Граница проблемы: Netty Unix socket: все полученные fd закрываются при reject
Самостоятельная пользовательская боль: SCM_RIGHTS с несколькими descriptors проходит kernel install, но unexpected cmsg length оставляет их открытыми. Защитное правило для проверки сформулировано заранее: «как безопасно проверить что каждый fd после recvmsg получает единственного owner либо закрывается на всех validation error paths в netty native unix domain fd receive без production данных». GitHub Reviewed Advisory ghsa-w573-9ffj-6ff9 описывает: «Netty: Unix-socket fd receive leaks descriptors when peer sends two at once»; запись опубликована 2026-06-08 и обновлена 2026-06-12. Эти сведения подтверждают технический сигнал и upstream-контекст, но не доказывают наличие затронутой версии, достижимость пути, эксплуатацию конкретной системы или популярность запроса. Поэтому итог по локальной среде начинается как Unknown и меняется только после inventory, reachability и изолированного теста.
Сверьте версии и достижимость для netty-unix-socket-multi-fd-cleanup
Начинайте с inventory и resolved dependency, а не с общего severity. Boundary из reviewed record и прямого upstream-источника: «maven/io.netty:netty-transport-native-epoll >= 4.2.0.Final, <= 4.2.14.Final; first patched 4.2.15.Final | maven/io.netty:netty-transport-native-kqueue >= 4.2.0.Final, <= 4.2.14.Final; first patched 4.2.15.Final | maven/io.netty:netty-transport-native-kqueue <= 4.1.134.Final; first patched 4.1.135.Final | maven/io.netty:netty-transport-native-epoll <= 4.1.134.Final; first patched 4.1.135.Final». Разнесите состояния в таблице: компонента нет; версия вне диапазона; исправление backported; функция выключена; путь недостижим; provenance неясен; нужен fixture. Рабочий набор полей именно для этой темы: cmsg fd count, MSG_CTRUNC, validation, adopted fds, closed fds, fd delta. Banner, lockfile без resolved tree или совпадение имени пакета не являются доказательством. Если схема версий форка не сопоставима с upstream, оставьте Unknown и запросите build provenance вместо категоричного PASS.
Обратимый тест без production-данных: cmsg fd count
Безопасный fixture: native test использует socketpair и два descriptors только на temporary pipes; считает /proc/self/fd before/after. До запуска запишите expected invariant, лимиты времени и памяти, допустимые side effects и способ полной очистки. Добавьте положительный control для штатного пути и отрицательный case, который меняет только одну проверяемую границу. Используйте фиктивные identifiers и временное состояние; токены, реальные адреса, пользовательские данные, рабочие конфиги и внешние цели исключены. После каждого case удалите temp-state и повторите малый control: он подтверждает, что отказ относится к механизму, а не к сломанному harness.
Зафиксируйте доказательство по полям fd delta
Артефакт проверки хранит только минимизированные поля: cmsg fd count, MSG_CTRUNC, validation, adopted fds, closed fds, fd delta. Для каждого поля отметьте источник: configuration, измерение, parser output или решение policy. Критерий PASS определён до запуска: multi-fd reject возвращает fd delta 0, single-fd control также завершает lifecycle без утечки. FAIL допустим только если запрещённый эффект наблюдается в изоляции, boundary и runtime-mode совпали, а оба controls дают ожидаемый результат. Во всех остальных случаях ставьте Unknown или Inconclusive. Не прикладывайте сырые логи: достаточно hash fixture, версии, обезличенной матрицы, результата controls и времени проверки.
Проверьте причинность вывода о как безопасно проверить что каждый fd после recvmsg получает единственного owner либо закр
Рецензент должен связать наблюдение «SCM_RIGHTS с несколькими descriptors проходит kernel install, но unexpected cmsg length оставляет их открытыми» с конкретной границей «как безопасно проверить что каждый fd после recvmsg получает единственного owner либо закрывается на всех validation error paths в netty native unix domain fd receive без production данных», а не с похожим внешним симптомом. Попросите показать, где в resolved build применяется boundary «maven/io.netty:netty-transport-native-epoll >= 4.2.0.Final, <= 4.2.14.Final; first patched 4.2.15.Final | maven/io.netty:netty-transport-native-kqueue >= 4.2.0.Final, <= 4.2.14.Final; first patched 4.2.15.Final | maven/io.netty:netty-transport-native-kqueue <= 4.1.134.Final; first patched 4.1.135.Final | maven/io.netty:netty-transport-native-epoll <= 4.1.134.Final; first patched 4.1.135.Final», почему операция «native test использует socketpair и два descriptors только на temporary pipes; считает /proc/self/fd before/after» обратима и какие значения cmsg fd count, MSG_CTRUNC, validation, adopted fds, closed fds, fd delta получены измерением. Затем отдельно объясните, почему результат «multi-fd reject возвращает fd delta 0, single-fd control также завершает lifecycle без утечки» проверяет и отказ, и штатный control. Если хотя бы одно звено отсутствует, вывод возвращается в Unknown; severity advisory нельзя переносить на локальную установку автоматически.
Особенность механизма netty-unix-socket-multi-fd-cleanup
SCM_RIGHTS передаёт владение дескрипторами, поэтому ошибка после recvmsg обязана закрыть каждый уже полученный fd. Снимайте fd count до fixture, после reject и после явного завершения control; учитывайте служебные descriptors harness. Отдельно запишите cmsg count и признак truncation. Нулевой delta после двух fd доказывает cleanup ветки reject, тогда как успешный single-fd control подтверждает нормальный lifecycle без доступа к рабочим файлам.
Обновление, повторная проверка и граница остановки
Предпочтительное действие — перейти на исправленную upstream-ветку из boundary «maven/io.netty:netty-transport-native-epoll >= 4.2.0.Final, <= 4.2.14.Final; first patched 4.2.15.Final | maven/io.netty:netty-transport-native-kqueue >= 4.2.0.Final, <= 4.2.14.Final; first patched 4.2.15.Final | maven/io.netty:netty-transport-native-kqueue <= 4.1.134.Final; first patched 4.1.135.Final | maven/io.netty:netty-transport-native-epoll <= 4.1.134.Final; first patched 4.1.135.Final», затем повторить тот же fixture и штатный control. Временная мера допустима только если разрывает описанный механизм, имеет владельца, срок действия, наблюдаемый сигнал и проверяемый rollback. Обязательный stop-rule: не передавать рабочие sockets/files и не запускать при недоступном fd accounting.. При его срабатывании эксперимент прекращают, не расширяя доступ и не повышая нагрузку. В обращение к maintainer включите provenance, feature state, матрицу полей и ссылки на reviewed advisory и прямой upstream-источник; эксплуатационные инструкции и данные реальной среды исключите.
Минимальный пакет для поддержки по netty-unix-socket-multi-fd-cleanup
Соберите короткую причинную карточку: боль — «SCM_RIGHTS с несколькими descriptors проходит kernel install, но unexpected cmsg length оставляет их открытыми»; invariant — «как безопасно проверить что каждый fd после recvmsg получает единственного owner либо закрывается на всех validation error paths в netty native unix domain fd receive без production данных»; версия — «maven/io.netty:netty-transport-native-epoll >= 4.2.0.Final, <= 4.2.14.Final; first patched 4.2.15.Final | maven/io.netty:netty-transport-native-kqueue >= 4.2.0.Final, <= 4.2.14.Final; first patched 4.2.15.Final | maven/io.netty:netty-transport-native-kqueue <= 4.1.134.Final; first patched 4.1.135.Final | maven/io.netty:netty-transport-native-epoll <= 4.1.134.Final; first patched 4.1.135.Final»; операция — «native test использует socketpair и два descriptors только на temporary pipes; считает /proc/self/fd before/after»; поля — cmsg fd count, MSG_CTRUNC, validation, adopted fds, closed fds, fd delta; PASS — «multi-fd reject возвращает fd delta 0, single-fd control также завершает lifecycle без утечки». Добавьте hash теста, результат positive/negative controls, cleanup result и причину, по которой тест не касается внешней системы. Не включайте IP, токены, реальные имена, ключи, содержимое документов или полные логи. Если direct source подтверждает только release context, так и укажите: он не является доказательством локальной уязвимости. Граница остановки остаётся неизменной: не передавать рабочие sockets/files и не запускать при недоступном fd accounting..
Материал подготовлен редакцией VOne с помощью ИИ; даты, диапазоны, прямые источники, безопасный fixture, privacy-границы и отсутствие рекламных обещаний затем перепроверены.
Источники и проверка
- GitHub Reviewed Advisory ghsa-w573-9ffj-6ff9 проверено 2026-08-31
- Прямой upstream-источник для Netty Unix socket: все полученные fd закрываются при reject проверено 2026-08-31
Информация актуальна на дату публикации. Правила сервисов, приложений и сетей могут меняться.