PHP2Shell: как утечка памяти в PHP превращается в удалённое выполнение кода

PHP2Shell Deep Dive

PHP2Shell: как утечка памяти в PHP превращается в удалённое выполнение кода

Подробный разбор цепочки уязвимостей CVE-2026-109618 и CVE-2026-109619 в PHP. Автор объясняет, как ошибка обработки нехватки памяти (OOM) порождает «висячий» указатель (use-after-free), как с его помощью утекают адреса кучи и кода, обходя ASLR, и как затем через подделку структур zend_string и HashTable перехватывается pDestructor — вплоть до выполнения произвольной команды. Материал рассчитан на читателей с базовым знанием C и включает пошаговые эксперименты, анализ выравнивания кучи и реальные трудности эксплуатации на продакшн-серверах.

PHP не выдаёт атакующему висячий указатель специально… нет, PHP не настолько щедр. Этот указатель — результат тонкого изъяна во взаимодействии легитимной функции PHP с механизмом обработки ошибок Zend Engine.
  1. djad04

    Я тот, кто это написал. Изначально я сам пытался отправить это сюда, но без особого успеха, так что рад, что кто-то другой поделился! Спасибо, что принесли это сюда.

    Также, если у кого-то есть другой рабочий PoC для той конкретной сборки, я был бы очень признателен, если бы они им поделились, потому что, глядя на то, как работает эксплойт, он делает то, что не делается ни в одном другом решении, которое я нашёл для других сборок; ни одно из них не удерживает место с помощью resize (ключ “1050” отправляется дважды), а затем создаёт промежуточный буфер из следующего поля (“1999”), который туда попадает. Это единственный подход, который я видел, использующий повторяющийся ключ таким образом.

    Интересно, есть ли более прямой способ добиться этого, как в решениях для других сборок. Если есть, думаю, было бы интересно сравнить надёжность разных подходов, основываясь на самой манипуляции с памятью, а не на том, как они достигают цели.

  2. t1234s

    Самое впечатляющее — это объединение этого эксплойта с другим эксплойтом для Linux для получения root-доступа.

    Неделя, которая войдёт в историю.

Ещё за этот день

2026-11-10