Elgg 的头像上传功能中,因图像尺寸不受限制导致 GD 内存耗尽,造成认证后拒绝服务。
< 6.3.5(6.x 系列),以及 7.0.0-rc.1 – < 7.0.0(7.0 发布候选版)6.3.5、7.0.0actions/avatar/upload.php 将上传的图像直接传入 saveIconFromUploadedFile(),未进行任何尺寸、大小或内存防护:
$avatar = elgg_get_uploaded_file('avatar', false);
// No dimension check.
// No size check.
// No ratio check.
if (!$owner->saveIconFromUploadedFile('avatar')) {
return elgg_error_response(elgg_echo('avatar:resize:fail'));
}
PHP 的 GD 库按图像解码后的像素尺寸(而非磁盘上的文件大小)来分配内存。因此,一个尺寸极端的小文件会在 GD 处理它的瞬间强制进行巨大的内存分配。
步骤 1 — python3 CVE-2026-65650.py
步骤 2 — 以任意已注册用户身份登录。
步骤 3 — 进入 个人资料 > 编辑头像,然后上传 CVE-2026-65650.png。
运行该 PoC 会迫使 GD 分配约 286 MB 内存来解码图像,并再分配约 572 MB 用于调整其大小,尽管该文件在磁盘上仅约 308 KB。在一台 14 GB 内存、无 swap 的测试机上,单次上传便将可用内存降至约 1.3 GB。在内存受限的部署环境中,这足以触发内核 OOM 杀死 PHP-FPM 工作进程,导致站点宕机且无法自行恢复。
来自单个低权限账户的单个请求就足以引发这种内存消耗。来自多个账户的重复或并发请求会加剧该影响,并提高触发 OOM 的概率。
已在 Elgg 7.0.0 中修复,并向后移植到 6.3.5。