テック技報最新号へ →
セキュリティ

開発サーバーを LAN に晒さない(Storybook GHSA-px85-f4q5-jh77 から学ぶ)

カフェや偽 Wi-Fi など信頼できないネットワークでは、0.0.0.0 で待ち受ける開発サーバーが同じ LAN の第三者から触られる。Storybook は修正版で既定を 127.0.0.1 に変えた。アップデートしたうえで、開発サーバー全般をループバックだけで待ち受けさせる。

@MalwareBibleJP · 2026-10-16
#dev-server#storybook#vite#vitest#lan#wifi#supply-chain#frontend

何が起きたか

  • Storybook の開発サーバーは、HTML ページを読み込める相手なら誰にでも WebSocket 用の認証トークンを渡していた。同じ LAN の端末が IP アドレスで開けばトークンを取れる。
  • そのトークンで入力検証を回避して story ファイルにコードを書き込めた。Vitest アドオンと古い Vitest がある環境では、テスト実行を通じて別のファイルも書き込め、条件次第で開発者のマシンでコード実行に至る。
  • CVSS v4 8.7(High、攻撃元区分は Adjacent)。

対策(Storybook)

  1. 修正版に上げる: storybook 8.6.19 / 9.1.21 / 10.6.2 / 11.0.0-alpha.6(@storybook/addon-vitest・@storybook/addon-mcp なども同じ系統の修正版)。上げるまでは影響版で storybook dev を動かさない。
  2. 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 へ)。
  3. 既定の変更を把握する:
    • 開発サーバーは 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 を配信している場合

出典

X の元の投稿を開く