Upgrade to PRO for Only $50/Year—Limited-Time Offer! 🔥

CVE-2025-55182の原理を詳細に解説!

Avatar for kurenaif kurenaif
December 07, 2025
470

 CVE-2025-55182の原理を詳細に解説!

Avatar for kurenaif

kurenaif

December 07, 2025
Tweet

Transcript

  1. React Server Components とは? ・既存の SSR (Server Side Rendering) を少し改良したもの

    ・今まではイベントリスナー不要のものも bundle.js に含めないといけなかった ・サーバーサイドで完結するものとそうでないものを区別して描画するための仕組み(多分) IUUQTTQFBLFSEFDLDPNNJ[ESBSFBDUTFSWFSDPNQPOFOUTOPZJXFOXPKJFLJNJOHLBTV TMJEF IUUQTKBSFBDUEFWSFGFSFODFSTDTFSWFSDPNQPOFOUT
  2. Next.js と React Server Components IUUQTEFWMPHNFTDJVTKQSFBDUTFSWFSDPNQPOFOUTCBTJDVTBHF ・Next.js とは、 The React

    Framework for the Web ・昔から SSR に強いフレームワークの印象 ・デフォルトではサーバーコンポーネントになり、 use client を使うと Client Component になる
  3. Next.js と App Router IUUQTOFYUKTPSHEPDTQBHFT IUUQTOFYUKTPSHEPDTBQQ IUUQT[FOOEFWZBNBEBEBZPBSUJDMFTDCGEF ・従来は pages 直下に作ったものがすべてルーティングされていたが、

    React Server Components の実装と同時期くらいに、app/page.tsx のみが ルーティング対象になった(App Router) ・React Server Components が新たに生まれたことで、 「サーバーコンポーネントを要求しているのか」 「クライアントコンポーネントを要求しているのか」 を区別する必要が生まれた。 (多分)
  4. RSC Payrload / Flight protocol とは https://nextjs.org/docs/app/getting-started/server-and-client-components ・React Server Component

    で利用する、React 内部で使われている Protocol ・普段は特にユーザーは気にせず使うことができる ・next.js では Next-Action というヘッダに値を入れて渡せば処理させることができる
  5. 今回の Exploit の全体像 サーバー クライアント お、Next-Action に値入ってるな これは React Server

    Component やな! Flight Protocol の deocde よろ~~ Next-Action: ~~~ { ヤバい Flight Protocol} { ヤバい Flight Protocol}
  6. 今回の Exploit の全体像 サーバー クライアント { ヤバい Flight Protocol} を

    Decode したら ヤバいオブジェクトになったで! Next-Action: ~~~ { ヤバい Flight Protocol} { ヤバい Flight Protocol}
  7. step1. React Flight Protocol が React にわたるまで サーバー クライアント お、Next-Action

    に値入ってるな これは React Server Component やな! Flight Protocol の deocde よろ~~ Next-Action: ~~~ { ヤバい Flight Protocol} { ヤバい Flight Protocol}
  8. step1. React Flight Protocol が React にわたるまで 1 Next-Action: “適当な文字列”

    の HTTP header がついていること 2 POST であること 3 multipart/from-data であること → decodeReplyFromBusboy という React 側の関数に渡される react から取ってくる IUUQTHJUIVCDPNWFSDFMOFYUKTCMPCCGFDCGCCDFFEDCCBGQBDLBHFTOFYUTSDTFSWFSBQQSFOEFSBDUJPOIBOEMFSUT- 入力値を渡す 関数内部で Flight が渡されていることを確認
  9. step2. React がヤバい Flight protocol を処理する サーバー クライアント { ヤバい

    Flight Protocol} を Decode したら ヤバいオブジェクトになったで! Next-Action: ~~~ { ヤバい Flight Protocol} { ヤバい Flight Protocol}
  10. RSC Payrload / Flight protocol とは(詳細版) ・かなり json に近い形式 ・$

    を渡すと様々な事ができる ・例えば $1 とすると、1 番の要素を参照する ・0 から順番に処理される(多分) ・Next.js は最終的に 0 番の要素を取得し、await する IUUQTHJUIVCDPNNTBOGU$7&USFFNBJO
  11. step1: 0 の処理 ・まずは 0 を処理する ・$1 は 1 番の要素を参照してねという意味なので、一旦保留して次に行く。

    ・保留する際、$1 が終わったら処理するということをメモしておく。 $1 が終わったら処理する :
  12. step2: [0 は保留状態 ] 1 の処理 ・1 を処理する ・$2 は

    2 番の要素を参照してねという意味なので、一旦保留して次に行く。 $1 が終わったら処理する :
  13. step3: [0 は保留状態 ] [1 は保留状態 ] 2 の処理 ・2

    を処理する ・特に何もないので、処理は完了する。 →$2 = {”fruitName”: ”cherry”} $1 が終わったら処理する : $2 が終わったら処理する :
  14. step4: [0 は保留状態 ] 1 を再実行する ・保留していた $1 を実行する $1

    が終わったら処理する : $2 = {”fruitName”: ”cherry”} ・ $2:fruitNameとるすると、 $2[’fruitName’]のような挙動になる → $1={”object”:”fruit”, “name”:”cherry”}
  15. 今回作りたい Exploit とそれを実現するための課題 課題 1: ユーザーから渡した文字列から関数オブジェクトを生成する必要がある str → Function Object

    への変換が必要 課題 2: 関数オブジェクトの中に任意の文字列を入れる必要がある (このヤバい関数オブジェクトを next.js に返す) 課題 3: 関数オブジェクトを実行する必要がある(これは next.js 側) 1. 文字列型からコレを作る 2. 作った Function の中に値を入れる 3. それを実行する
  16. step2: [0 は保留状態 ] 1 の処理 ・$1 がふくまれているので保留される ・0 番

    chunk が参照される (この 0 とか 1 とかオブジェクトのことを chunk という) $@ だった場合、obj=0 になり、 getChunk(response, 0) が呼ばれ、 0 番目の chunk になる。
  17. step4: 最終的な値 → $0=[{”then”:Function, ...}] ・帰ってきた値が thenable だった場合、その then を実行される

    ・どっかでこのオブジェクトに対して await かなんかしてるっぽい?
  18. これが実行される この then() の中では、 this.status などの結果は これになる。 ・await などでは then

    の要素があれば、自動的にそれを実行するようになっている ・普通にメンバ関数が実行されるので同じ階層にある諸々のパラメータは this で 参照されるようになる。 step5: chunk.then が実行されると何が起きるのか
  19. これが実行される この then() の中では、 this.status などの結果は これになる。 ・await などでは then

    の要素があれば、自動的にそれを実行するようになっている ・普通にメンバ関数が実行されるので同じ階層にある諸々のパラメータは this で 参照されるようになる。 step5: chunk.then が実行されると何が起きるのか resulved_model にして initializeModelChunk を実行し fullfilled にしてから this.value を呼ぶ
  20. これが実行される この then() の中では、 this.status などの結果は これになる。 ・await などでは then

    の要素があれば、自動的にそれを実行するようになっている ・普通にメンバ関数が実行されるので同じ階層にある諸々のパラメータは this で 参照されるようになる。 step5: chunk.then が実行されると何が起きるのか まだ this.value は JSON 文字列なので それを object にしてから resolve したい。
  21. 最後にやりたいこと ・this.value = {then: Function( 任意の文字列 )} にして、resolve を実行したい。 (resolve

    は then があったら勝手に実行する ) ・initializeModelChunk で object にはできるがどうやって 関数オブジェクトにするか