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