Дайджесты новостей
Предметный натюрморт с терминалом обновления Hono v4.13.16, роутерным замком и контрольным журналом безопасности.

Патчи безопасности Hono: разбор уязвимостей в v4.13.15 и v4.13.16

Если твои микросервисы или бессерверные функции в Cloudflare Workers, Bun или Node.js крутятся на веб-фреймворке Hono, этот день стоит начать с ревизии зависимостей. Команда проекта выпустила сразу два последовательных релиза: сервисный v4.13.15 и внеплановый экстренный патч безопасности v4.13.16.

Совсем недавно мы обсуждали Hono v4.13.14: кастомные ответы в bearer-auth и точечные оптимизации роутинга, где разработчики полировали работу с заголовками. Свежий апдейт куда серьезнее: версия 4.13.16 закрывает сразу пять бюллетеней GitHub Security Advisories, напрямую затрагивающих ядро роутинга, изоляцию подприложений и парсинг форм.

Анатомия пяти брешей: от обхода mount() до невидимого CSRF

Меня в этом релизе особенно зацепило то, насколько неочевидными оказались векторы атак. Это не банальные ошибки новичков, а тонкие несостыковки в логике нормализации путей и сопоставления регулярок:

  1. Обход middleware в mount() (GHSA-4m76-xfj5-7975): Самая опасная уязвимость. При монтировании вложенного подприложения по динамическому шаблону вроде /api/:tenant/* фреймворк вычислял остаточный путь, отсекая префикс по длине строки шаблона, а не по реальному сегменту URL. При дальнейшей нормализации в среде выполнения обратные слэши \ превращались в прямые /, а сегменты .. схлопывались. Злоумышленник мог сформировать путь с path traversal, который попадал в подприложение, но полностью перепрыгивал через middleware авторизации префикса.
  2. Пропуск wildcard-фильтров в RegExpRouter (GHSA-h7mg-cq63-vhpq): Базовый и гибридный (SmartRouter) роутеры пропускали маски *, если маршрут содержал регулярку {[^/]+} только в middleware, если рядом сосуществовал обработчик вида /prefix*, либо если путь содержал закодированный перенос строки (%0A, %0D).
  3. Обход валидатора форм (GHSA-4h7h-rv7c-7m2v): Валидатор validator('form') спотыкался о составной заголовок Content-Type: multipart/form-data; charset=utf-8. Валидатор считал тело пустым и пропускал запрос без валидации, тогда как нижестоящий обработчик успешно парсил все поля.
  4. HTML-инъекция в хелпере css (GHSA-3gg2-335m-rxc6): Вставка внешних данных на границе шаблонной строки позволяла закрыть тег </style> и внедрить произвольный скрипт (XSS).
  5. Пропуск CSRF для клик-аудита (GHSA-46wx-v44x-9hh2): Запросы с типом text/ping от браузерного атрибута <a ping="..."> миновали проверку csrf().

В сопутствующем релизе v4.13.15 авторы также починили экранирование слэшей в заголовке WWW-Authenticate (realm) и открыли возможность вызывать c.header() после чтения тела ответа.

Что проверить в коде и как обновиться без сюрпризов

Для перехода на защищенную ветку достаточно обновить зависимость в проекте:

# Для npm:
npm install hono@^4.13.16

# Для pnpm или Bun:
pnpm update hono@^4.13.16
bun update hono
Важно для пользователей PreparedRegExpRouter

Если в твоем проекте используется предкомпиляция маршрутов для ускорения холодного старта, простой установки обновленного пакета недостаточно: обязательно запусти повторную генерацию таблиц роутера, чтобы в продакшен не утекли старые скомпилированные регулярные выражения.

Кроме того, разработчики Hono ужесточили синтаксический анализ: маршруты с сомнительными суффиксами вроде /assets* (вместо /assets/*) и шаблоны, сопоставляющиеся с пустой строкой ({[0-9]*}), теперь вызывают явную ошибку при компиляции роутера. Проверь логи инициализации своего приложения сразу после деплоя.