Use the $@ deserialization to get a Chunk reference, and put Chunk.prototype.then as the then property of the root object. Then then would be invoked with root object as this/chunk when it is awaited/resolved.
By setting the status to RESOLVED_MODEL, now we can call initializeModelChunk with a fake chunk that is comlpetely in our control. This is particularly useful since itself and its related functions call many methods from the chunk._response object.
The target is to trigger the Blob deserialization, which calls response._formData.get with payload from response._prefix and return the result directly. So all we need is to set response._formData.get to Function so the returned result would be a function with attacker controlled code, then put that to then again so it would be executed.
This sends the adapted PoC multipart request from the first Gist, checking for exploitation indicators like timeouts or deserialization errors. It mimics the chunk pollution ($1:proto:then), resolved model status, and _formData.get gadget but with a safe echo.
Save as cve-2025-55182-detection.yaml
This checks for vulnerable React/Next.js versions via common exposure points (e.g., error pages, headers, or manifest). Complements the active template for low-noise scanning. Based on affected versions from CVE (19.0.0–19.2.0) and write-up's protocol details.
Save as cve-2025-55182-versions.yaml: