Skip to content
KitploitKITPLOIT
ИнструментыБлог
Отправить
ИнструментыБлог
Отправить

Инструменты для хакинга, пентеста и кибербезопасности — ваш арсенал защиты!

Kitploit — это каталог инструментов для хакинга, кибербезопасности и пентестинга. Находите последние обновления проектов для поиска уязвимостей, анализа систем, автоматизации тестирования и усиления вашей безопасности.

··Ленты·Контакты·Конфиденциальность·© 2026 Kitploit

Каталог инструментов

Категории

Все категории
Loading categories
CVE-2025-55182-analysis — Детальный технический анализ CVE-2025-55182 — критической неаутентифицированной RCE в Next.js + React 19.0.0. Описывает исследовательский путь, анализ патча, обход прототипа и приемник десериализации Blob, который обеспечивает полную эксплуатацию без специфичных для приложения гаджетов. | Kitploit
Инструменты/GitHubGitHub/santihabib/cve-2025-55182-analysis
Анализ уязвимостейЭксплуатацияЭксплуатация веб-приложенийВеб-безопасностьТестирование на ПроникновениеОбучение и Образование
GitHubsantihabib/cve-2025-55182-analysis

CVE-2025-55182-analysis

Репозиторий
439 месяцев назадЕщё не проверено

Популярное

Смотреть все →

Откройте для себя самые используемые инструменты нашего сообщества.

Изучить все инструменты

Просмотрите нашу коллекцию инструментов

Смотреть все инструменты →

Описание

Детальный технический анализ CVE-2025-55182 — критической неаутентифицированной RCE в Next.js + React 19.0.0. Описывает исследовательский путь, анализ патча, обход прототипа и приемник десериализации Blob, который обеспечивает полную эксплуатацию без специфичных для приложения гаджетов.

Поделиться

Технический анализ CVE-2025-55182: Мой исследовательский путь

⚠️ Важное предупреждение

Этот документ описывает мой личный исследовательский процесс по CVE-2025-55182, включая подтвержденные находки и проведенные мной эксперименты. Это честный отчет о моем расследовании, включая первоначальные ошибочные предположения и итоговый прорыв.


Краткое изложение

После тщательного расследования CVE-2025-55182 (CVSS 10.0) мой первоначальный вывод заключался в том, что автоматическое удаленное выполнение кода (RCE) не было публично продемонстрировано, и что эксплуатация требует специфических для приложения гаджетов. Этот вывод был неверен.

5 декабря 2025 года, получив дополнительные сведения от другого независимого исследователя на X (@maple3142), я успешно воспроизвел полное неаутентифицированное RCE на стандартном Next.js без необходимости в каких-либо уязвимостях в коде приложения.


Методология исследования

Этап 1: Анализ патча (Первоначальное ошибочное предположение)

Мой первоначальный фокус был на первом изменении в патче React 19.0.1:

Уязвимая (19.0.0):

root@kitploit:~
return fn.bind.apply(fn, [null].concat(_ref));

Исправленная (19.0.1):

root@kitploit:~
if (Array.isArray(promiseValue)) {
  promiseValue = promiseValue.slice(0);
} else {
  promiseValue = [];
}

Я предположил, что путь атаки лежит через fn.bind.apply() с вредоносными объектами вместо массивов. Мне удалось продемонстрировать внедрение аргументов в серверные действия с помощью $ACTION_REF_ и контролируемого злоумышленником bound:

root@kitploit:~
curl -X POST http://localhost:9000/ \
  -F '$ACTION_REF_0=' \
  -F '$ACTION_0:0={"id":"<ACTION_ID>","bound":["; id #","/etc/passwd"]}'

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


Этап 2: Небезопасное поведение, замеченное в патче

Более детальный взгляд на патч выявил ещё одно важное изменение в getOutlinedModel():

Уязвимая:

root@kitploit:~
for (key = 1; key < reference.length; key++)
  parentObject = parentObject[reference[key]];

Исправленная:

root@kitploit:~
if (hasOwnProperty.call(value, name)) {
  value = value[name];
}

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

root@kitploit:~
$1:__proto__:constructor:constructor

Этап 3: Эксперимент с Thenable и Function.constructor (Тупик)

В ходе исследования я протестировал thenable-объект, содержащий свойство .then:

root@kitploit:~
{"then": "$1:__proto__:constructor:constructor"}

Когда JavaScript обрабатывает это через await:

  1. JavaScript видит свойство .then и считает объект Promise
  2. Вызывает obj.then(resolve, reject)
  3. Если then разрешается в Function.constructor, JavaScript пытается выполнить Function(resolve, reject)

Наблюдаемый результат:

root@kitploit:~
SyntaxError: Unexpected token 'function'
    at Object.Function [as then] (<anonymous>)

Этап 4: Ограничение привязки аргументов (Стена)

Когда Function.constructor вызывается как:

root@kitploit:~
Function(resolve, reject)
// resolve.toString() = "function () { [native code] }"
// Function пытается распарсить это как код → SyntaxError

Аргументы resolve и reject всегда являются нативными функциями Promise. Function пытается интерпретировать первый аргумент как исходный код, который является недопустимым JavaScript.

На этом мое исследование застопорилось. Я пришел к выводу, что управление аргументами Function.constructor невозможно без специфичного для приложения гаджета.


Этап 5: Прорыв — Десериализация Blob (5 декабря 2025 года)

После публикации моих первоначальных находок другой независимый исследователь указал мне на критический элемент, который я упустил: сток десериализации $B (Blob).

Недостающий кусочек

В скомпилированном серверном коде React Flight (невидимом в исходниках TypeScript) существует:

root@kitploit:~
case "B":
  return response._formData.get(response._prefix + id);

Расположение:

  • Пакет: [email protected]
  • Файл: cjs/react-server-dom-webpack-server.node.unbundled.development.js
  • Также в: [email protected]/dist/compiled/react-server-dom-webpack/

Этот код позволяет React вызывать response._formData.get() со значениями, полученными из контролируемого злоумышленником ввода, без валидации.

Почему это меняет всё

ПодходАргументы для Function.constructorРезультат
Thenable (Этап 3)resolve, reject (нативные функции)❌ SyntaxError
Blob + Отравленный Response_prefix (контролируемая злоумышленником строка)✅ RCE

Комбинируя:

  1. Обход прототипа ($1:__proto__:then → Chunk.prototype.then)
  2. Отравленный объект _response с:
    • _formData.get, установленный на Function.constructor
    • _prefix, установленный на произвольный JavaScript-код
  3. Внутренняя модель, содержащая ссылку $B

Обработчик case "B": выполняет:

root@kitploit:~
Function.constructor("<код атакующего>" + id)

Это полностью обходит ограничение привязки аргументов.


Публичные PoC: Анализ

Популярные GitHub PoC, утверждающие о RCE, используют Action ID, такие как:

  • "child_process#execSync"
  • "vm#runInThisContext"

Это подделка. Next.js принимает только Action ID, определённые приложением. Неверные ID приводят к:

root@kitploit:~
TypeError: Cannot read properties of undefined (reading 'workers')

Однако настоящая эксплойтация не требует поддельных Action ID. Любой валидный ID серверного действия работает.


Проверка и воздействие

Я протестировал эту цепочку эксплойтации на минимальном приложении Next.js 15.0.3 + React 19.0.0 только с:

root@kitploit:~
async function myAction(data) {
  "use server";
  console.log("Server Action called with:", data);
  return { success: true, received: data };
}

Результат: Полное RCE подтверждено. Приложение не содержало никакого небезопасного кода, ни eval, ни execSync, ни гаджетов.

Оценка воздействия

АспектРезультат
Требуется аутентификация?❌ Нет
Требуется гаджет приложения?❌ Нет
Работает на стандартном Next.js?✅ Да
Количество необходимых запросов1 POST
Затронутые версииNext.js ≤15.0.4 + React 19.0.0
Оценка CVSS10.0 (обоснованно)

Критическое открытие: Статус патча

По состоянию на 5 декабря 2025 года сток $B всё ещё существует в Next.js 15.0.5 (якобы исправленной версии).

Проверка:

root@kitploit:~
$ npm pack [email protected]
$ tar -xzf next-15.0.5.tgz
$ grep -A5 'case "B":' package/dist/compiled/react-server-dom-webpack/cjs/react-server-dom-webpack-server.node.development.js

Результат:

root@kitploit:~
case "B":
  return response._formData.get(response._prefix + obj);

Код идентичен уязвимой версии.


Замечание об ответственном раскрытии

В связи с обнаружением того, что уязвимость может быть не полностью исправлена в заявленных «исправленных» версиях, я удерживаю полный proof-of-concept эксплойт до проверки с командами безопасности Vercel и Meta.

Технические детали, представленные в этом документе, достаточны для понимания механизма уязвимости, но намеренно неполны, чтобы предотвратить немедленную эксплуатацию.


Обновлённые выводы

Что я нашёл (Этапы 1-4)

ТехникаСтатус
Внедрение аргументов через bound✅ Подтверждено (ограниченное воздействие)
Обход прототипа✅ Подтверждено
Доступ к Function.constructor через thenable✅ Подтверждено (но не эксплуатируется самостоятельно)
Обнаружение уязвимых версий✅ Подтверждено

Что я упустил изначально

ПроблемаВоздействие
Сток десериализации $B (Blob)❌ Критично — позволяет контролировать аргументы
Изучение скомпилированного кода вместо исходников❌ Сток существует только в скомпилированном выводе
Механизм отравления объекта Response❌ Позволяет обойти все защиты

Итоговая оценка

CVE-2025-55182 эксплуатируема для полного неаутентифицированного RCE на стандартных приложениях Next.js.

  • ✅ Не требуется специфический для приложения гаджет
  • ✅ Работает с одним HTTP POST
  • ✅ «Гаджет» встроен в логику десериализации React
  • ⚠️ Может быть не полностью исправлена в заявленных исправленных версиях

Хронология

  • 3 декабря 2025 г.: Анализ обхода прототипа и thenable-подхода (тупик)
  • 4 декабря 2025 г.: Получение инсайта о десериализации $B от независимого исследователя
  • 5 декабря 2025 г.: Полное воспроизведение RCE подтверждено
  • 5 декабря 2025 г.: Обнаружено, что уязвимость может сохраняться в «исправленных» версиях
  • 5 декабря 2025 г.: Опубликован этот отчёт (детали PoC скрыты)

Рекомендации

  1. Немедленно обновитесь до последних версий React и Next.js
  2. Проверьте патч, протестировав, принимает ли десериализация $B по-прежнему произвольные объекты _response
  3. Мониторинг попыток эксплуатации — ищите:
    • Необычные заголовки Next-Action
    • Сложные multipart-полезные нагрузки с паттернами $@, __proto__, $B
  4. Рассмотрите правила WAF для блокировки подозрительных паттернов в запросах серверных действий
  5. Свяжитесь с командами безопасности, если вы используете затронутые версии в продакшене

Благодарности

  • Прорывной инсайт относительно десериализации $B был предоставлен исследователем на X (@maple3142)
  • Командам безопасности React и Next.js за их работу над патчами (проверка продолжается)
  • Сообществу исследователей безопасности за совместное расследование

Вынесенные уроки

  1. Изучайте скомпилированный код, а не только исходники — критические уязвимости могут скрываться в собранном выводе
  2. Пересматривайте предположения при появлении новой информации
  3. Совместные исследования необходимы для сложных уязвимостей
  4. Документируйте путь — тупики ценны для понимания полной картины
  5. Ответственное раскрытие имеет приоритет над публичным признанием

Последнее обновление: 5 декабря 2025 г.

Скачать инструмент