В React Server Components нашли критическую уязвимость с максимальным баллом CVSS 10.0, позволяющую выполнить произвольный код на сервере без авторизации.
При десериализации данных React обращается к свойствам модуля через квадратные скобки, не проверяя принадлежность объекту. JavaScript в таком случае лезет по всей прототипной цепочке, включая Object.prototype и конструкторы. Злоумышленник отправляет запрос такого вида:
{
"id": "vm#runInThisContext",
"bound": ["code here"]
}А синтаксис с решёткой позволяет указать любой экспорт, включая constructor.
В запросе можно передать цепочки вроде
$1:constructor:constructor, что даёт доступ к конструктору функций через обход прототипов. Но создать функцию мало, нужно заставить её выполниться. Для этого используется встроенный модуль виртуальной машины Node.js, который исполняет код сразу при вызове. React связывает аргументы с функцией, и когда приложение её дёргает, runInThisContext('...') отрабатывает, выполняя вредоносный код.Кстати, наш любимый Next.js тоже уязвим к этому. Патчи выпустили и добавили проверку собственных свойств перед доступом. Обновляться нужно вчера 😲
НеКасперский
