8 ポイント 投稿者 GN⁺ 2025-12-04 | 1件のコメント | WhatsAppで共有
  • ReactとNext.jsで、リモートコード実行(RCE)が可能なセキュリティ脆弱性が報告された
  • この問題はNext.jsパッケージ内部で発生し、攻撃者が悪意ある入力により任意のコード実行を引き起こせる可能性がある
  • VercelはGitHubの**セキュリティアドバイザリ(GHSA-9qr9-h5gf-34mp)**を通じて、該当脆弱性を公開し、更新版を配布した
  • 利用者は最新バージョンにアップグレードして脆弱性を緩和する必要がある
  • 今回の事例はフレームワークレベルのセキュリティ管理の重要性を再び浮き彫りにした

RCE脆弱性の概要

  • Next.jsReact環境で、リモートコード実行が可能な脆弱性が発見された
    • 攻撃者がサーバー側で任意のJavaScriptコードを実行できるリスクが存在する
  • この脆弱性はNext.jsパッケージの内部コード処理で発生する
    • 具体的な脆弱関数やモジュールに関する詳細は公開されていない

影響と対応

  • VercelはGitHubの**セキュリティアドバイザリ(GHSA-9qr9-h5gf-34mp)**を通じて問題を正式に発表した
    • 当該アドバイザリはNext.jsリポジトリのセキュリティ通達セクションに掲載された
  • 脆弱性の対象バージョンは明示されていないが、更新版の配布が行われた
    • ユーザーには最新の安定版にアップグレードすることが推奨される

セキュリティアドバイザリと対策

  • Next.jsパッケージを使用するすべてのプロジェクトは即座にバージョン確認が必要
    • package.jsonのNext.jsバージョンは最新の状態に保つ必要がある
  • Vercelは修正版配布以外の追加的な緩和策について言及していない
  • 脆弱性の技術的な詳細は非公開のままで、セキュリティ上の理由から限定的な情報のみが提供されている

重要性

  • 今回の脆弱性は、サーバーサイドレンダリング環境におけるコード実行リスクを示した
  • ReactおよびNext.jsベースのサービス運用者はセキュリティアップデートを定期的に適用する必要がある
  • フレームワークレベルのセキュリティ脆弱性がアプリケーション全体のセキュリティに直接的な影響を与えうる

1件のコメント

 
GN⁺ 2025-12-04
Hacker Newsの意見
  • 今回の脆弱性は、RSC/server actions導入時から警告されていた最悪のシナリオが現実化した事例だ
    サーバーがクライアントの信頼できない入力をそのままデシリアライズし、モジュールとexport名を探して実行していた
    hasOwnPropertyパッチで防げはするが、根本的にはReactがRPCレイヤーを作っているという事実を明確に認識していなかったのが問題だ
    gRPCやSOAPのような従来のRPCフレームワークは明示的なスキーマとサービス定義で境界を明確にするが、Reactはバンドラーから見えるすべてのAPIを公開する方式なので危険だ
    こうした設計によるセキュリティ問題は今後も繰り返される可能性が高い

    • これは単に不注意の問題に見える
      明示的なスキーマがあっても、最後の段階で信頼できない入力がサーバー名前空間の任意のオブジェクトを参照できるようにしていれば意味がない
    • 実際には、クライアントが要求するすべてのエンドポイントが公開されるわけではない
      "use server"と記された関数だけが公開され、ReactチームもRPCシステムを設計していることは認識している
      この種のバグは他のRPCシステムでも十分起こり得る(Reactコントリビューターです)
    • 警告を受けていたのにこうなったというのは、結局不注意な実装としか見なせない
    • 一般ユーザーの立場では、このアプローチを使わなければ安全なのか気になる
      ただし古い非公開レポジトリを維持するのも良い選択ではない
  • Nextは静的ビルドだけが唯一の長所だ
    そのサポートが打ち切られたら、もはや使う理由はない

  • Facebook/Metaのセキュリティアドバイザリによると、React Server Components 19.0.0〜19.2.0には**認証前のリモートコード実行(RCE)**脆弱性が存在する
    React公式ブログの告知でも、クライアントがサーバー関数を呼び出せる構造のため、攻撃者が悪意あるHTTPリクエストを作成してサーバー上で任意コードを実行できると説明している

    • 修正内容がhasOwnPropertyチェックの追加なら、攻撃はおそらくプロトタイプチェーンのプロパティ(__proto__など)を参照する方式だったのだろう
    • 「クライアントがサーバー関数を呼び出せる」という文が意図された機能なのだとしたら、かなり恐ろしい設計に感じる
  • 修正コミットはこのコミットのようだ
    複数の変更と一緒にsquashされ、詳細が見えにくくなっているように見える
    コードで公開される関数の一覧をホワイトリスト方式で制限するパターンが4か所で見られる

    • あるいはこのコミットが原因かもしれない(「重大なセキュリティ脆弱性を修正」と明記)
  • Vercelはすでにプラットフォームレベルの保護で悪意あるリクエストパターンを遮断している
    告知参照
    CloudflareもWAFルールで先回りして対応した

    • 複数のパートナー企業と協力して事前緩和措置を展開した
      それでもNext、React、その他のメタフレームワーク依存関係を直ちにアップデートすることを強く推奨する
    • Netlifyの対応告知
      Deno Deploy/Subhostingのブログ記事も参考になる
    • 私は直接パッチを当てて再ビルドし、万一の漏れに備えてCrowdsec WAFルールも追加した
  • PoCリポジトリを参考に脆弱性を再現してみた

    • パッチ済みのreact-server-dom-webpackでもRCEが実行できたので、メカニズムの理解が完全には合っていないようだ
      実際のNext.jsプロジェクトでデモを見せてもらえるとよい
    • それでも、整理してくれた記事は本当に印象的だった
  • 「VercelなしではRCEはない」と言われるほど、今回の件はホスティング環境とセキュリティの相関関係を浮き彫りにしている

  • CVEスコア10.0は、これほど広く使われているプロジェクトでは衝撃的な数値

    • 影響を受けたパッケージreact-server-dom-webpackには「実験的であり、リスクを受け入れよ」と明記されている
      それでも週間ダウンロード数は31万件を超えている
    • こうした事件では、CVSS 10.0を明確に表記しないとPR的な発言で覆い隠されてしまう
    • Reactは広く使われているが、React Server Componentsはまだそこまで一般的ではない
  • Reactチームがなぜこんな混乱を招く機能に時間を使うのか理解しがたい
    SSRより何が優れているのか、性能向上がどれほどあるのかも疑問だ
    Hook導入以降、開発者体験は悪化したのに、それを改善するよりさらに別の複雑さを足している
    むしろJS本来の制御フローをコンポーネントロジックで自然に使えるようにしてほしい

    • Server ComponentsはSSRと直接の関係はない
      私はこれを**コンポーネント化されたBFF(Backend for Frontend)**レイヤーだと見ている
      各UI断片が対応するバックエンドロジックと直接結び付けられ、fetch呼び出しなしでデータを取得できる
      こうするとフロントとバックエンドを一緒に進化させやすくなり、必要なデータだけを細かくロードできる
      結局のところ、UI専用のサーバーロジックをコンポーネント構造の中に自然に溶け込ませられる
    • Reactが「デフォルトフレームワーク」になったのは残念だ
      SvelteやReactのコンパイラベースのモデルの方がはるかに扱いやすい
    • 根本的にはJS言語の限界競争不足が問題だと思う
      Vue、Svelte、Angularなどはいずれも別個のコンパイラとファイル拡張子を必要とする
      一方でReact/JSXはプリプロセッサ段階ですでに優遇されている
      Rustはマクロシステムでこの問題を解決した — たとえばLeptosYewは標準の.rsファイル内でJSXやHTMLテンプレートをサポートしている
      JSがこうした拡張性を持てない限り、Webは今後も複雑で非効率な環境にとどまる可能性が高い
    • 私はhooksが好き :)
    • RSCはSSRを高速化できなかった結果として出てきた代替の試み
      クライアント側の負荷を減らそうとしたが、それすら失敗したように感じる
  • Reactブログの詳細説明も参考になる