開発サーバーを LAN に晒さない(Storybook GHSA-px85-f4q5-jh77 から学ぶ)
カフェや偽 Wi-Fi など信頼できないネットワークでは、0.0.0.0 で待ち受ける開発サーバーが同じ LAN の第三者から触られる。Storybook は修正版で既定を 127.0.0.1 に変えた。アップデートしたうえで、開発サーバー全般をループバックだけで待ち受けさせる。
何が起きたか
- Storybook の開発サーバーは、HTML ページを読み込める相手なら誰にでも WebSocket 用の認証トークンを渡していた。同じ LAN の端末が IP アドレスで開けばトークンを取れる。
- そのトークンで入力検証を回避して story ファイルにコードを書き込めた。Vitest アドオンと古い Vitest がある環境では、テスト実行を通じて別のファイルも書き込め、条件次第で開発者のマシンでコード実行に至る。
- CVSS v4 8.7(High、攻撃元区分は Adjacent)。
対策(Storybook)
- 修正版に上げる:
storybook8.6.19 / 9.1.21 / 10.6.2 / 11.0.0-alpha.6(@storybook/addon-vitest・@storybook/addon-mcpなども同じ系統の修正版)。上げるまでは影響版でstorybook devを動かさない。 - Vite / Vitest も上げる: Vite 6.4.2 / 7.3.2 / 8.0.5(4・5 系は 6.4.2 へ)、Vitest 3.2.7 / 4.1.10(2 系は 3.2.7 へ)。
- 既定の変更を把握する:
- 開発サーバーは
127.0.0.1だけで待ち受ける(http://localhost:6006は従来どおり)。 - LAN で共有したいときは
storybook dev --host 192.168.0.110のように具体的な IP を指定(host / origin 検証は有効のまま)。--host 0.0.0.0にするならcore.allowedHostsを必ず設定する(未設定だと検証が無効になり、起動時に警告と確認が出る)。 - 共有は、静的ビルド(
storybook build)を配信するか Chromatic などに公開するほうが安全。 - Vitest アドオンは
browser.api.allowWrite/allowExecを無効化。テストからのファイル書き込み・プロセス実行が必要なら明示的に戻す。 saveStoryRequestは args とタイトルしか書けないよう検証が厳しくなった。
- 開発サーバーは
他の開発サーバーにも当てはめる
- Vite / Next.js / webpack-dev-server などで
--hostや0.0.0.0を常用していないか、package.jsonのスクリプトとコンテナの公開ポートを見直す。 - Docker で動かすなら
-p 127.0.0.1:6006:6006のようにホスト側もループバックに限定する。 - LAN 共有が必要なときはファイアウォールで同僚の IP に絞り、公衆 Wi-Fi では
--hostを使わない。 - 開発サーバーの WebSocket や HMR エンドポイントは「認証があるから大丈夫」と考えない。トークンがページから取れるなら、ページを開ける人は全員通れる。
影響を受けない条件(元の勧告より)
- 他の端末から到達できない環境(ポートを公開しないコンテナ、
127.0.0.1だけで公開) - 信頼できる LAN での利用
- ビルド済みの Storybook を配信している場合
出典
- @MalwareBibleJP · 2026-10-16
- GitHub Advisory GHSA-px85-f4q5-jh77: github.com