Команда React выпустила исправление уязвимости, обнаруженной в react-dom/serverimplementation. Он был представлен в версии 16.0.0 и существовал во всех последующих выпусках до сегодняшнего дня.

Эта уязвимость может затронуть только некоторые приложения React, обрабатываемые сервером. Приложения, созданные исключительно клиентом, не подвержены этой уязвимости. Кроме того, они ожидают, что большинство приложений, отображаемых на сервере, не содержат уязвимого шаблона, описанного ниже. Тем не менее, они рекомендуют при первой же возможности следовать инструкциям по смягчению последствий.

Во время исследования этой уязвимости они обнаружили аналогичные уязвимости в нескольких других популярных интерфейсных библиотеках. Они согласовали этот выпуск вместе с выпусками Vue и Preact, в которых исправлена ​​одна и та же проблема. Номер отслеживания этой уязвимости - CVE-2018-6341.

Смягчение

Они подготовили выпуск патча с исправлением для каждой затронутой второстепенной версии.

16.0.x

Если вы используете react-dom/server с этой версией:

Вместо этого обновитесь до этой версии:

16.1.x

Если вы используете react-dom/server с одной из этих версий:

Вместо этого обновитесь до этой версии:

16.2.x

Если вы используете react-dom/server с этой версией:

Вместо этого обновитесь до этой версии:

16.3.x

Если вы используете react-dom/server с одной из этих версий:

Вместо этого обновитесь до этой версии:

16.4.x

Если вы используете react-dom/server с одной из этих версий:

Вместо этого обновитесь до этой версии:

Если вы используете более новую версию react-dom, никаких действий не требуется.

Обратите внимание, что необходимо обновить только пакет react-dom.

Подробное описание

Ваше приложение может быть подвержено этой уязвимости, только если выполняются оба этих условия:

  • Ваше приложение преобразуется в HTML с помощью ReactDOMServer API, и
  • Ваше приложение включает указанное пользователем имя атрибута в тег HTML.

В частности, уязвимый паттерн выглядит так:

let props = {};
props[userProvidedData] = "hello";
let element = <div {...props} />;
let html = ReactDOMServer.renderToString(element);

Чтобы воспользоваться им, злоумышленнику потребуется создать специальное имя атрибута, запускающего XSS-уязвимость. Например:

let userProvidedData = '></div><script>alert("hi")</script>';

В уязвимых версиях react-dom/server на выходе злоумышленник может ввести произвольную разметку:

<div ></div><script>alert("hi")</script>

В версиях после исправления уязвимости (и до ее внедрения) атрибуты с недопустимыми именами пропускаются:

<div></div>

Вы также увидите предупреждение о недопустимом имени атрибута.

Обратите внимание, что мы ожидаем, что имена атрибутов, основанные на вводе данных пользователем, будут очень редкими на практике. Это не подходит для какого-либо обычного практического использования и имеет другие потенциальные последствия для безопасности, от которых React не может защититься.

Установка

React v16.4.2 доступен в реестре npm.

Чтобы установить React 16 с Yarn, запустите:

yarn add react@^16.4.2 react-dom@^16.4.2

Чтобы установить React 16 с помощью npm, запустите:

npm install --save react@^16.4.2 react-dom@^16.4.2

Мы также предоставляем UMD-сборки React через CDN:

<script crossorigin src="https://unpkg.com/react@16/umd/react.production.min.js"></script>
<script crossorigin src="https://unpkg.com/react-dom@16/umd/react-dom.production.min.js"></script>

Обратитесь к документации за подробными инструкциями по установке.

Первоисточник: https://reactjs.org/blog/2018/08/01/react-v-16-4-2.html