В августе 2026 года Hacktron сообщил о том, что выглядело как уязвимость удаленного выполнения кода (RCE) в функции оптимизации изображений Next.js. В ходе расследования выяснилось, что уязвимый код находился не в самом Next.js, а выше по цепочке зависимостей — в libheif, декодере изображений AVIF, который используется в Next.js, ImageMagick, WordPress, sharp и значительной части веб-экосистемы.
Вскоре после того, как Hacktron уведомила нас, мы совместно с ними воспроизвели RCE на актуальной сборке Next.js и сообщили об уязвимости сопровождающим sharp, libvips и libheif. Затем мы развернули митигацию на уровне всей платформы Vercel и начали работать с сопровождающими над исправлением.
Copy link to headingЦепочка зависимостей
Функция оптимизации изображений Next.js позволяет приложениям изменять размер и оптимизировать изображения с помощью компонента <Image> (next/image). Для изображений AVIF цепочка зависимостей обработки изображений выглядит следующим образом:
- <Image> вызывает /_next/image,
<Image> вызывает /_next/image,
- /_next/image вызывает sharp
/_next/image вызывает sharp
- sharp вызывает libvips
sharp вызывает libvips
- libvips использует libheif для декодирования изображения
libvips использует libheif для декодирования изображения
Это означало, что уязвимый код находился не в Next.js, но к нему по-прежнему можно было получить доступ через оптимизацию изображений Next.js. Зловредное изображение AVIF, отправленное на эндпоинт оптимизации изображений, вызывало бы libheif через sharp и libvips.
Таким образом, одним из очевидных способов митигации было отключение оптимизации AVIF в Next.js. В этом случае вредоносные изображения AVIF останавливались бы на эндпоинте оптимизации изображений, вместо того чтобы передаваться через sharp и libvips в libheif. Эксплойт не распространялся бы дальше вверх по цепочке.
Тем не менее, митигация только в Next.js без исправления на стороне вышестоящих зависимостей создавала проблемы с раскрытием информации.
Copy link to headingРаскрытие уязвимости и координация исправления на стороне зависимостей
После того как мы совместно с Hacktron успешно воспроизвели проблему, мы развернули митигацию на уровне всей платформы Vercel и обратились к сопровождающим sharp, libvips и libheif, чтобы раскрыть уязвимость и начать работу над исправлением.
Вот хронология событий:
- 11–12 августа: Hacktron сообщила о проблеме в Vercel; Hacktron и Vercel воспроизвели RCE с помощью работающего доказательства концепции.
11–12 августа: Hacktron сообщила о проблеме в Vercel; Hacktron и Vercel воспроизвели RCE с помощью работающего доказательства концепции.
- 13 августа: Vercel применила митигацию на уровне платформы с помощью своей службы оптимизации изображений.
13 августа: Vercel применила митигацию на уровне платформы с помощью своей службы оптимизации изображений.
- 19 августа: Команда Next.js встретилась с сопровождающим libvips и начала координацию между sharp, libvips и libheif.
19 августа: Команда Next.js встретилась с сопровождающим libvips и начала координацию между sharp, libvips и libheif.
- 24 августа: Next.js уведомила своих партнеров по безопасности.
24 августа: Next.js уведомила своих партнеров по безопасности.
- 25 августа: Next.js выпустила обновление безопасности, отключающее оптимизацию AVIF.
25 августа: Next.js выпустила обновление безопасности, отключающее оптимизацию AVIF.
Команда безопасности Vercel связалась с сопровождающими sharp и libvips по электронной почте и начала координацию с libheif через GitHub Security Advisory. Hacktron также предоставила детали уязвимости и эксплойта для libheif. 19 августа команда Next.js встретилась с сопровождающим libvips и согласовала дальнейшие действия для sharp, libvips и libheif. Сопровождающий libheif продолжил работу по устранению уязвимости в рамках GitHub Security Advisory, открытого Hacktron.
24 августа Next.js уведомила своих партнеров по безопасности об уязвимости в libheif и ее влиянии на Next.js (уведомления партнеров являются стандартной частью процесса выпуска обновлений безопасности Next.js).
25 августа, спустя шесть дней после встречи 19 августа, сопровождающий libheif выпустил версию v1.23.2, в которой уязвимость RCE была устранена.
Copy link to headingМитигации в Vercel и Next.js
Обеспечение безопасности Vercel и ее клиентов оказалось прямолинейным: все запросы оптимизации изображений Next.js на Vercel проходят через централизованную службу оптимизации изображений. Поэтому мы отключили оптимизацию и изменение размера AVIF в этой центральной службе. Любые входящие изображения AVIF не передавались в libheif для декодирования, и RCE на Vercel была невозможна.
Защита саморазвертываемых приложений потребовала выпуска новой версии Next.js. 25 августа Next.js published a security release, релиз которого изначально планировался для решения другой проблемы. После координации исправления в вышестоящей зависимости мы включили митигацию AVIF в этот выпуск и опубликовали его на день раньше запланированного срока. В этом релизе была отключена оптимизация и изменение размера AVIF в Next.js; учитывая, что пропатченная версия libheif еще распространялась по цепочке зависимостей, это было самым своевременным решением. Мы также опубликовали бюллетень по безопасности, чтобы сообщить о степени серьезности проблемы.
Copy link to headingНаша приверженность идее повышения безопасности веб-среды
Объем обнаруживаемых уязвимостей в ПО с открытым исходным кодом продолжает расти, и эти цифры поражают воображение:
Поскольку языки на базе ИИ ускоряют исследования уязвимостей, мы ожидаем появления новых уязвимостей вышестоящих зависимостей, аналогичных RCE в libheif, во всей экосистеме Open Source. В последние месяцы количество релизов безопасности Next.js увеличилось, и мы ожидаем, что эта тенденция сохранится по мере устранения новых уязвимостей, которые обнаруживаем как мы, так и исследовательское сообщество.
Мы стремимся упреждающе находить уязвимости раньше злоумышленников, ответственно раскрывать всю найденную информацию и сотрудничать с исследователями и сопровождающими над исправлениями.
Copy link to headingБлагодарности
Спасибо Hacktron за ответственное раскрытие уязвимости AVIF, совместную работу по воспроизведению проблемы и координацию с сопровождающими зависимостей в процессе устранения.
Мы также хотим поблагодарить сопровождающих sharp, libvips и libheif. Их работа над исправлениями в зависимостях сделала возможным скоординированное устранение уязвимости по всей цепочке обработки изображений.
Мы сотрудничаем с талантливыми исследователями для обеспечения безопасности Next.js и других фреймворков с открытым исходным кодом с помощью программы выплаты вознаграждений за найденные уязвимости в Open Source от Vercel. Мы призываем всех, кто хочет внести свой вклад в безопасность поддерживаемых фреймворков, принять в ней участие.











