CVE-2026-23524
PHP vulnerability analysis and mitigation

Overview

CVE-2026-23524 is an insecure deserialization vulnerability in Laravel Reverb, a real-time WebSocket communication backend for Laravel applications, that allows unauthenticated remote attackers to achieve Remote Code Execution (RCE). It affects all versions of laravel/reverb prior to 1.7.0 and is only exploitable when horizontal scaling is enabled (REVERB_SCALING_ENABLED=true). The vulnerability was discovered by Mohammad Yaser Abo-Elmaaty (@m0h4mmad) and disclosed on January 21, 2026, with a patch released the same day. It carries a CVSS v3.1 base score of 9.8 (Critical) (GitHub Advisory, Github Advisory).

Technical details

The root cause is CWE-502 (Deserialization of Untrusted Data): in src/Protocols/Pusher/PusherPubSubIncomingMessageHandler.php, Reverb passed data received from Redis PubSub channels directly into PHP's unserialize() function without specifying an allowed_classes restriction, permitting arbitrary class instantiation. When horizontal scaling is active, multiple Reverb nodes communicate via Redis PubSub; an attacker with write access to the Redis instance can publish a crafted serialized PHP object payload to the channel, which is then deserialized by any subscribing Reverb node. The fix (commit 9ec26f8) adds ['allowed_classes' => [Application::class, PendingMetric::class, MetricType::class]] to all unserialize() calls, restricting instantiation to known safe classes (Patch Commit, GitHub Advisory). Exploitability is heightened because Redis is commonly deployed without authentication, making the attack precondition (network access to Redis) easy to satisfy in misconfigured environments.

Impact

Successful exploitation grants an unauthenticated attacker full Remote Code Execution on the Reverb server process, resulting in high confidentiality, integrity, and availability impact. An attacker can read sensitive application data, modify or destroy data, crash the service, and potentially pivot laterally within the internal network from the compromised server. All Laravel applications relying on Reverb for real-time WebSocket functionality with horizontal scaling enabled are at risk of complete application-layer compromise (GitHub Advisory, Github Advisory).

Exploitability

As of the time of reporting, there is no public proof-of-concept exploit and no confirmed in-the-wild exploitation (Github Advisory). However, a PoC repository (github.com/rockmelodies/CVE-2026-23524) appeared in Feedly's time series data in mid-2026, suggesting public exploit code may now exist. The EPSS score is approximately 0.17% (39th percentile), indicating a relatively low but non-negligible probability of exploitation in the near term. The vulnerability is not currently listed in the CISA Known Exploited Vulnerabilities (KEV) catalog, and no specific threat actor attribution has been reported.

Exploitation steps

  1. Reconnaissance: Identify Laravel Reverb deployments with horizontal scaling enabled by scanning for exposed Redis instances (default port 6379) using tools like Shodan, Censys, or nmap. Look for Redis servers without authentication (requirepass not set).
  2. Verify Redis access: Connect to the target Redis instance using redis-cli -h <target_ip> and confirm unauthenticated access. Check for Reverb-related PubSub channels using PUBSUB CHANNELS *.
  3. Craft malicious payload: Construct a PHP serialized object payload using a PHP Object Injection gadget chain compatible with the Laravel/Reverb application's loaded classes (e.g., using tools like phpggc to generate a gadget chain targeting Laravel's class hierarchy).
  4. Publish to Redis PubSub: Publish the malicious serialized payload to the Reverb Redis PubSub channel using PUBLISH <reverb_channel> <serialized_payload>. The channel name follows Reverb's internal naming convention.
  5. Trigger deserialization: Any Reverb node subscribed to the channel will receive the message and pass the application or payload field directly to unserialize(), instantiating the attacker-controlled object and triggering the gadget chain.
  6. Achieve RCE: The gadget chain executes arbitrary system commands as the PHP/Reverb process user, enabling reverse shell establishment, data exfiltration, or further lateral movement (GitHub Advisory, Patch Commit).

Indicators of compromise

  • Network: Unexpected inbound connections to Redis (port 6379) from external or untrusted IP addresses; unusual PUBLISH commands to Reverb PubSub channels observed in Redis logs; outbound connections from the Reverb server process to unknown external IPs (potential reverse shell).
  • Logs: Redis MONITOR or slow log output showing PUBLISH commands with large or binary-encoded payloads to Reverb channels; PHP error logs showing deserialization warnings or unexpected class instantiation errors in PusherPubSubIncomingMessageHandler.
  • Process: Unusual child processes spawned by the PHP/Reverb process (e.g., /bin/sh, bash, curl, wget, python); unexpected cron jobs or scheduled tasks created under the web server or PHP process user account.
  • File System: New or modified files in the application directory, especially web shells or scripts with recent timestamps; unexpected SSH authorized keys added to the server user's home directory.

Mitigation and workarounds

The primary remediation is to upgrade laravel/reverb to version 1.7.0 or later by running composer require laravel/reverb:^1.7.0. The fix restricts PHP's unserialize() to an allowlist of known safe classes, eliminating the gadget chain attack surface (GitHub Release, Patch Commit). If immediate upgrade is not possible, apply these interim mitigations in order of priority:

  • Disable horizontal scaling: Set REVERB_SCALING_ENABLED=false if running a single Reverb node — this bypasses the vulnerable code path entirely.
  • Secure Redis: Require a strong password (requirepass in redis.conf) and bind Redis to 127.0.0.1 or a private network interface only, preventing unauthenticated external access.
  • Network segmentation: Use firewall rules to restrict access to Redis port 6379 to only trusted Reverb nodes (GitHub Advisory).

Community reactions

The vulnerability was responsibly disclosed by researcher Mohammad Yaser Abo-Elmaaty (@m0h4mmad) and published by the Laravel team on January 21, 2026. Coverage appeared across multiple security aggregators and blogs including The Hacker Wire, Infinitsec, and CyberHub within hours of disclosure, reflecting community interest in the critical CVSS score. The Spanish national CERT (CCN-CERT) also published an advisory. Community discussion noted that the real-world risk is conditional on Redis misconfiguration, which is unfortunately common in production deployments.

Additional resources


SourceThis report was generated using AI

Related PHP vulnerabilities:

CVE ID

Severity

Score

Technologies

Component name

CISA KEV exploit

Has fix

Published date

CVE-2026-59989CRITICAL9.2
  • PHP logoPHP
  • phalcon/cphalcon
NoYesAug 21, 2026
CVE-2026-63135HIGH8.2
  • PHP logoPHP
  • yourls/yourls
NoYesAug 21, 2026
GHSA-p2ch-c2c3-4xm5MEDIUM6.1
  • PHP logoPHP
  • winter/wn-backend-module
NoYesAug 20, 2026
GHSA-8hgv-xc77-jmcrMEDIUM5.1
  • PHP logoPHP
  • getgrav/grav
NoYesAug 21, 2026
GHSA-hq84-x37p-j6q5MEDIUM4.5
  • PHP logoPHP
  • winter/wn-backend-module
NoYesAug 20, 2026

Free Vulnerability Assessment

Benchmark your Cloud Security Posture

Evaluate your cloud security practices across 9 security domains to benchmark your risk level and identify gaps in your defenses.

Request assessment

Get a personalized demo

Ready to see Wiz in action?

"Best User Experience I have ever seen, provides full visibility to cloud workloads."
David EstlickCISO
"Wiz provides a single pane of glass to see what is going on in our cloud environments."
Adam FletcherChief Security Officer
"We know that if Wiz identifies something as critical, it actually is."
Greg PoniatowskiHead of Threat and Vulnerability Management