ThinkPHP 6.1.3 至 8.0.4 存在反序列化漏洞 CVE-2024-44902,因 Memcached 等组件未经校验调用 unserialize() 并结合 POP 链导致 RCE;修复需升级至 8.0.5+ 或 6.1.12、禁用高危入口、加固运行时配置。

ThinkPHP 6.1.3 存在反序列化漏洞(如 CVE-2024-44902),其根本原因是框架在特定组件(如 Memcached 缓存驱动)中对用户输入数据执行了未经校验的 unserialize() 操作,结合可利用的 POP 链(例如通过 think\Model 或缓存类的魔术方法调用),最终导致远程代码执行。
修复不是简单打补丁,而是需从版本升级、入口控制、运行时防护三方面同步落实。
立即升级到安全版本
该漏洞影响范围明确:v6.1.3 至 v8.0.4。官方已在后续版本中移除高风险反序列化路径,并收紧缓存/Session 数据处理逻辑。- 推荐升级至 ThinkPHP 8.0.5 或更高版本(截至 2026 年 10 月,8.0.5+ 已修复 CVE-2024-44902 相关链)
- 若暂无法升至 8.x,可降级使用已修复的 6.1.x 分支 —— 6.1.12 是 6.1 系列最后一个稳定且修复了主流反序列化链的版本
- 执行命令:
composer update topthink/framework:^8.0.5(或^6.1.12),并确认vendor/topthink/framework/composer.json中版本锁定生效
禁用或加固高危反序列化入口
即使升级,也需排查业务中是否手动调用了 `unserialize()`,尤其在以下位置:-
自定义缓存驱动:检查是否继承了
think\cache\driver\Memcached或Redis,并在get()/set()中直接反序列化 value -
Session 处理逻辑:避免在中间件或全局钩子中对
$_SESSION或 session 文件内容做 `unserialize()` -
控制器接收点:搜索项目中所有
unserialize($_*(如$_GET、$_POST['data']、cookie)的调用,全部替换为json_decode()或严格白名单校验
allowed_classes 参数
```php
$data = unserialize($raw, ['allowed_classes' => false]); // 完全禁止对象反序列化
// 或限定仅允许安全类
$data = unserialize($raw, ['allowed_classes' => ['stdClass', 'DateTime']]);
```
关闭危险组件与运行时加固
CVE-2024-44902 的典型触发依赖 Memcached + PHP Memcached 扩展 + 不安全缓存配置。- 临时缓解:在
config/cache.php中将默认缓存驱动改为file或redis(确保 Redis 不开启unserialize模式) - 禁用 Memcached 扩展(如非必需):
sudo phpdismod memcached,重启 PHP-FPM - 在
php.ini中添加:session.serialize_handler = php_serialize(避免旧式phphandler 引发隐式反序列化) - 启用 OPcache 并设置
opcache.validate_timestamps=1,防止恶意篡改已加载类定义
不复杂但容易忽略。



















