
PoC для CVE-2026-65650 - DoS загрузки аватара в Elgg
Аутентифицированная атака типа «отказ в обслуживании» в функции загрузки аватара 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'));
}
Библиотека GD в PHP выделяет память на основе декодированных пиксельных размеров изображения, а не его размера на диске. Поэтому небольшой файл с экстремальными размерами вынуждает GD произвести огромное выделение памяти в момент его обработки.
Шаг 1 — python3 CVE-2026-65650.py
Шаг 2 — Войдите как любой зарегистрированный пользователь.
Шаг 3 — Перейдите в Профиль > Изменить аватар и загрузите CVE-2026-65650.png.
Запуск PoC заставляет GD выделить ~286 МБ для декодирования изображения и ещё ~572 МБ для его изменения размера, несмотря на то, что сам файл занимает ~308 КБ на диске. На тестовой машине с 14 ГБ памяти и без swap одна единственная загрузка снизила доступную память до ~1.3 ГБ. На системах с ограниченной памятью этого достаточно, чтобы вызвать срабатывание OOM-killer в ядре и убить рабочие процессы PHP-FPM, в результате чего сайт падает без возможности самостоятельного восстановления.
Достаточно одного запроса от одной учётной записи с низкими привилегиями, чтобы вызвать такое потребление памяти. Повторные или одновременные запросы от нескольких учётных записей усиливают эффект и повышают вероятность срабатывания OOM.
Исправлено в Elgg 7.0.0 и перенесено в 6.3.5.