Alexander Garcia
Just when you thought it was safe to go back in the water... React Server Components get THREE more CVEs.
Read time is about 16 minutes
Alexander Garcia is an effective JavaScript Engineer who crafts stunning web experiences.
Alexander Garcia is a meticulous Web Architect who creates scalable, maintainable web solutions.
Alexander Garcia is a passionate Software Consultant who develops extendable, fault-tolerant code.
Alexander Garcia is a detail-oriented Web Developer who builds user-friendly websites.
Alexander Garcia is a passionate Lead Software Engineer who builds user-friendly experiences.
Alexander Garcia is a trailblazing UI Engineer who develops pixel-perfect code and design.
It's December 11th, 2025 just 8 days after the critical RCE vulnerability (CVE-2025-55182/66478). I'm enjoying my morning coffee, feeling pretty good about patching all my projects to React 19.0.1, 19.1.2, and 19.2.1.
Then React drops another blog post: Denial of Service and Source Code Exposure in React Server Components.
THREE new CVEs. And here's the kicker: some of the previous patches were incomplete.
If you updated to 19.0.2, 19.1.3, or 19.2.2 thinking you were safe? You're still vulnerable to one of the new CVEs (CVE-2025-67779).
Time to fire up the Bash script again. โ๏ธ
This time we're dealing with three CVEs:
Denial of Service - Malicious HTTP requests to Server Functions endpoints can cause infinite loops that hang your server and consume CPU resources.
The scary part: You're affected even if your app supports React Server Components but doesn't implement Server Function endpoints. Just having the capability is enough.
Source Code Exposure - Malicious HTTP requests can unsafely return source code of Server Functions, potentially exposing hardcoded secrets.
The good news: Runtime secrets like process.env.SECRET are NOT affected. Only hardcoded values in your source.
The bad news: How many of us have hardcoded an API key "just for testing" that never got removed? ๐ฌ
Here's what made this particularly frustrating:
Vulnerable versions: 19.0.0, 19.0.1, 19.0.2, 19.1.0, 19.1.1, 19.1.2, 19.2.0, 19.2.1, 19.2.2
Wait, 19.0.2? 19.1.3? 19.2.2? Those were supposed to be the patches from December 3rd!
Turns out, the initial patches for the RCE vulnerability were incomplete. They fixed CVE-2025-55182/66478 but left the door open for CVE-2025-67779.
Fixed versions: 19.0.3, 19.1.4, 19.2.3
So if you followed best practices and patched immediately after the first disclosure, you're running a version that's still vulnerable to the new DoS attack.
Security is hard.
I already had the infrastructure from the first CVE checker, so this was mostly about updating the vulnerability logic. But there were some interesting challenges.
The hardest part was communicating to users that some "patched" versions are still vulnerable:
check_react_vulnerable() { local version=$1 local main_version=$(echo "$version" | cut -d'-' -f1) # Handle "19.0" (same as 19.0.0) if [ "$main_version" = "19.0" ]; then return 0 # Vulnerable fi # Check 19.0.x series if version_compare "$main_version" ">=" "19.0.0" && version_compare "$main_version" "<" "19.0.3"; then return 0 # Vulnerable (includes 19.0.0, 19.0.1, 19.0.2) fi # Check 19.1.x series if version_compare "$main_version" ">=" "19.1.0" && version_compare "$main_version" "<" "19.1.4"; then return 0 # Vulnerable (includes 19.1.0, 19.1.1, 19.1.2, 19.1.3) fi # Check 19.2.x series if version_compare "$main_version" ">=" "19.2.0" && version_compare "$main_version" "<" "19.2.3"; then return 0 # Vulnerable (includes 19.2.0, 19.2.1, 19.2.2) fi return 1 # Not vulnerable }
Notice how the ranges now include the previous patch versions. Anyone running 19.0.2, 19.1.3, or 19.2.2 needs to update again.
I added special detection for the incomplete patch versions with extra warning messages:
if check_react_vulnerable "$CLEAN_REACT"; then VULNERABLE=true WARNINGS+=("${RED}โ VULNERABLE: React $CLEAN_REACT is affected${NC}") WARNINGS+=(" Patch to: 19.0.3, 19.1.4, or 19.2.3") # Special note for incomplete patch versions if [ "$CLEAN_REACT" = "19.0.2" ] || [ "$CLEAN_REACT" = "19.1.3" ] || [ "$CLEAN_REACT" = "19.2.2" ]; then WARNINGS+=(" ${YELLOW}โ NOTE: Version $CLEAN_REACT had incomplete patches and is still vulnerable to CVE-2025-67779${NC}") fi fi
This way, users get a very clear message that their "patched" version isn't actually safe.
The output needed to communicate three different CVEs clearly:
echo -e "${YELLOW}Vulnerability Details:${NC}" echo "โข CVE-2025-55184 & CVE-2025-67779 (CVSS 7.5 - High):" echo " Denial of Service - Malicious HTTP requests can cause infinite loops" echo " that hang the server and consume CPU resources" echo "" echo "โข CVE-2025-55183 (CVSS 5.3 - Medium):" echo " Source Code Exposure - Malicious requests can expose Server Function" echo " source code containing hardcoded secrets (runtime secrets are NOT affected)"
I wanted developers to understand both the severity and impact of each vulnerability without information overload.
Here's what it looks like when it detects a vulnerable version:
======================================== React Server Components Security Checker CVE-2025-55183 / CVE-2025-55184 / CVE-2025-67779 ======================================== Checking package.json... โน React found: ^19.0.2 โน Installed React version: 19.0.2 โ VULNERABLE: React 19.0.2 is affected Patch to: 19.0.3, 19.1.4, or 19.2.3 โ NOTE: Version 19.0.2 had incomplete patches and is still vulnerable to CVE-2025-67779 โน react-server-dom-webpack found: ^19.0.2 โน Installed react-server-dom-webpack version: 19.0.2 โ VULNERABLE: react-server-dom-webpack 19.0.2 is affected Update to patched React 19.x version (19.0.3, 19.1.4, or 19.2.3) โ NOTE: Version 19.0.2 had incomplete patches and is still vulnerable to CVE-2025-67779 Other frameworks/bundlers: โน next: ^15.0.5 โ react-router: Not found โ react-router-dom: Not found โ waku: Not found โ @parcel/rsc: Not found โ @vitejs/plugin-rsc: Not found โ rwsdk: Not found ======================================== Results: ======================================== VULNERABILITIES DETECTED: โ VULNERABLE: React 19.0.2 is affected Patch to: 19.0.3, 19.1.4, or 19.2.3 โ NOTE: Version 19.0.2 had incomplete patches and is still vulnerable to CVE-2025-67779 โ VULNERABLE: react-server-dom-webpack 19.0.2 is affected Update to patched React 19.x version (19.0.3, 19.1.4, or 19.2.3) โ NOTE: Version 19.0.2 had incomplete patches and is still vulnerable to CVE-2025-67779 โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ STATUS: VULNERABLE โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ Vulnerability Details: โข CVE-2025-55184 & CVE-2025-67779 (CVSS 7.5 - High): Denial of Service - Malicious HTTP requests can cause infinite loops that hang the server and consume CPU resources โข CVE-2025-55183 (CVSS 5.3 - Medium): Source Code Exposure - Malicious requests can expose Server Function source code containing hardcoded secrets (runtime secrets are NOT affected) Recommended Actions: 1. Update React to a patched version (19.0.3, 19.1.4, or 19.2.3) 2. Update all react-server-dom-* packages to patched versions 3. If using previous patches (19.0.2, 19.1.3, 19.2.2), upgrade immediately as these versions had incomplete patches and remain vulnerable 4. Run: npm audit fix --force (or yarn upgrade) 5. Review Server Functions for hardcoded secrets that may have been exposed References: - https://react.dev/blog/2025/12/11/denial-of-service-and-source-code-exposure-in-react-server-components - CVE-2025-55184: https://nvd.nist.gov/vuln/detail/CVE-2025-55184 - CVE-2025-67779: https://nvd.nist.gov/vuln/detail/CVE-2025-67779 - CVE-2025-55183: https://nvd.nist.gov/vuln/detail/CVE-2025-55183
Clear. Actionable. Impossible to misunderstand (fingers crossed ๐ค)
This was a harsh reminder that security is iterative. Just because you patched doesn't mean you're safe. In this case:
Always verify patch completeness and watch for follow-up advisories.
When I wrote the first script, I focused on exact version matches. This time I had to handle ranges that included previous patch versions:
# Before: 19.0.0 was vulnerable # After: 19.0.0, 19.0.1, AND 19.0.2 are all vulnerable if version_compare "$main_version" ">=" "19.0.0" && version_compare "$main_version" "<" "19.0.3"; then return 0 # All vulnerable fi
Semantic versioning comparison isn't just about being correct it's about being comprehensively correct.
Half of security is fixing the problem. The other half is making sure people know they need to fix it.
That's why I added special warnings for incomplete patches:
โ NOTE: Version 19.0.2 had incomplete patches and is still vulnerable to CVE-2025-67779
Without this message, developers running 19.0.2 might think "I'm on the patched version, I'm fine!" and never update.
Because I built the first CVE checker with good structure, adding support for the new CVEs took about 30 minutes instead of 3 hours:
Good architecture isn't about predicting the future. It's about making the unpredictable easier to handle.
After running this on my projects:
Personal portfolio: โ Vulnerable (upgraded to 19.0.2 last week, now vulnerable again) The Tiki Social: โ Vulnerable (upgraded to 19.0.2 last week, now vulnerable again) VA.gov Frontend: โ Safe (still on React 18.x, dodging all this drama)
So one of my projects needed another emergency patch. Eight days after the last one.
This is why we can't have nice things. ๐
Let's recap the chaos:
So in 8 days, we went from:
React Server Components are having a rough month.
This is the question everyone's asking. My take:
Yes, but...
Server Components are powerful. But power requires responsibility. If your team can't commit to rapid security updates, stick with client-side React for now.
The updated script is available on GitHub: check-cve
# Quick check curl -O https://raw.githubusercontent.com/asg5704/check-cve/main/check-cve-2025-55183-55184-67779.sh chmod +x check-cve-2025-55183-55184-67779.sh ./check-cve-2025-55183-55184-67779.sh
Or add it to your CI/CD pipeline to catch vulnerable deployments automatically.
At this rate, I'll have a full CVE checker framework by New Year's. Maybe I'll add:
Or maybe I'll just keep writing Bash scripts at 9AM when React announces CVE round 3. ๐
Stay safe out there. Update your dependencies. And maybe set up a Google Alert for "React Server Components vulnerability".
Related Posts:
Questions? Concerns? Found another React CVE? Open an issue on GitHub or reach out on LinkedIn.