thinkphp 8.0.4反序列化漏洞(cve-2024-44902)根本原因是未校验的unserialize()调用点配合可控pop链触发命令执行,修复需从代码层移除危险调用、配置层启用allowed_classes白名单、运行时禁用phar协议及危险函数,并升级至v8.0.5+。

ThinkPHP 8.0.4 存在反序列化漏洞(如 CVE-2024-44902),根本原因在于框架中存在未校验的 unserialize() 调用点,且攻击者可通过可控参数(如 $_GET['x']、$_COOKIE 或缓存数据)注入恶意 POP 链,最终触发命令执行。修复不能只靠“打补丁”,需从代码层、配置层和运行时三方面同步加固。
禁用危险反序列化入口
最直接有效的措施是定位并移除所有显式调用 unserialize() 的位置。常见高危点包括:
- 自定义控制器中类似
unserialize($_GET['x'])的调试或兼容逻辑——应彻底删除,改用 JSON 或严格白名单解析 - 第三方扩展或旧版兼容模块(如某些 Memcached/Redis 缓存驱动)中隐式反序列化——检查
think\cache\driver\Memcached等类,确认是否对$value直接反序列化 - 日志、错误处理、Session 反序列化等间接路径——避免将用户输入(如 URL 参数、Cookie 值)未经清洗就传入
unserialize()
启用 unserialize() 白名单机制
PHP 7.4+ 支持 unserialize() 的 allowed_classes 参数,必须强制启用:
- 将所有
unserialize($data)替换为unserialize($data, ['allowed_classes' => ['SafeClass1', 'SafeClass2']]) - 若无法枚举全部合法类,至少设为
allowed_classes => false(仅允许__PHP_Incomplete_Class),配合后续类型校验 - ThinkPHP 自身缓存系统(如
think\Cache)默认不启用白名单,需在配置中显式覆盖或重写驱动
关闭 Phar 协议与危险文件操作
CVE-2024-44902 利用链常结合 phar:// 触发,必须限制协议访问:
- 在
php.ini中设置phar.readonly = On(默认开启,确认未被关闭) - 禁用危险函数:在
disable_functions中加入unserialize, file_put_contents, system, exec, shell_exec, passthru - 避免在
file_exists()、include()、echo $obj等上下文中直接使用用户控制的对象——这些会触发__toString或__call,成为 POP 链跳板
升级到安全版本并验证补丁
官方已修复该漏洞,但需注意版本对应关系:
- CVE-2024-44902 影响范围明确为
v6.1.3 ≤ thinkphp ≤ v8.0.4,修复版本为v8.0.5+及v6.1.4+ - 升级后务必检查
vendor/topthink/framework/src/think/route/ResourceRegister.php中__destruct是否已移除或增加校验逻辑 - 验证关键类(如
think\Model、think\Validate、think\DbManager)的魔术方法是否仍可被链式调用——建议用 phpGGC 或自研脚本测试 POP 链可达性
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











