React2Shellとは
React2Shell(リアクト・トゥ・シェル) とは、Webサイト上で本来は想定していないJavaScriptの実行経路を悪用し、最終的にOSコマンド実行(Shell実行)へ到達してしまう脆弱性の総称的な呼び方です。
Reactそのものに直接「Shellを実行する機能」はありません。
しかし、以下のような設計・実装ミスによる典型的な危険パターンが組み合わさることで、結果的に「React → サーバー → OS」という危険な到達経路が生まれ、以下のような問題が発生する可能性があります。
- ランサムウェア被害
- Webサイトの改ざん
- サーバーの乗っ取り
- 顧客情報の漏洩
- ウィルス感染
- etc.
典型的な危険パターン
1. ユーザー入力をそのままサーバーに渡す
<input value={command} onChange={e => setCommand(e.target.value)} />このcommandをサーバーへ送信し、
- Node.jsでchild_process.exec
- PHPでsystem
- Pythonでos.system
などに渡してしまうと、Shell実行リスクになります。
2. JSX + dangerouslySetInnerHTMLの誤用
<div dangerouslySetInnerHTML={{ __html: userInput }} />ここからXSSが成立して、さらに管理画面・内部API・CI/CD操作に到達すると、間接的に Shell実行につながる可能性があります。
3. Next.js / SSR環境での油断
SSR環境ではReactコードがサーバー側で実行されます。
その結果、「フロント側のコード」のつもりで書いたコードが、サーバー側で実行されOS資源に触れてしまう可能性があります。
素人でもできるReactのバージョンの確認方法
React2Shellの影響を受けるReactのバージョンは以下の4バージョンです。
- 19.0
- 19.1.0
- 19.1.1
- 19.2.0
現在は脆弱性を修正した以下のバージョンが公開されているので、前述の4バージョンからアップデートすればReact2Shellの悪影響は受けません。
- 19.0.1
- 19.1.2
- 19.2.1
フロントエンドエンジニアなどの技術職であれば使用しているReactのバージョンはファイルを見ればわかりますが、技術職でない素人の方には関連ファイルを開いて確認するのは難しいです。
しかし、以下の方法を使用すれば難しい知識がなくても簡単にWebサイトで使用されているReactのバージョンを確認できます。
やり方は、まずChromeを起動して、Chrome ウェブストアからReact Developer Toolsをインストールします。
React Developer Tools - Chrome ウェブストア
次に以下のコードをコピーしてChromeのデベロッパーツールのConsoleに貼り付けて、Enterキーを押して実行します。
const version = __REACT_DEVTOOLS_GLOBAL_HOOK__?.renderers?.get(1)?.version
if (!version) {
alert('Reactのバージョンを取得できませんでした。')
} else {
const dangerousVersions = ['19.0', '19.1.0', '19.1.1', '19.2.0']
if (dangerousVersions.includes(version)) {
alert(`❌️ React ${version} が使用されています。\nこのバージョンは危険です。`)
} else {
alert(`✅️ React ${version} が使用されています。\nこのバージョンは問題ありません。`)
}
}例えば、Reactを使用しているNetflixのWebサイトを開いている状態で実行すると、「✅️ React 18.2.0 が使用されています。このバージョンは問題ありません。」と表示されます。
次に私が作った以下のReactのサンプルサイトで実行すると、「❌️ React 19.2.0 が使用されています。このバージョンは危険です。」と表示されます。(React 19.2.0ですが、アクセスしても安全です)
もしも、Web制作会社にReactで企業サイトなどを作成してもらったが、Reactのバージョンがわからない場合は前述の方法でReactのバージョンを必ず把握しておいたほうが良いです。
もしも、脆弱性のあるバージョンの場合、最初に述べた「ランサムウェア」や「Webサイトの改ざん」などの被害を受ける可能性があります。


