Skip to content
KitploitKITPLOIT
ИнструментыБлог
Отправить
ИнструментыБлог
Отправить

Инструменты для хакинга, пентеста и кибербезопасности — ваш арсенал защиты!

Kitploit — это каталог инструментов для хакинга, кибербезопасности и пентестинга. Находите последние обновления проектов для поиска уязвимостей, анализа систем, автоматизации тестирования и усиления вашей безопасности.

··Ленты·Контакты·Конфиденциальность·© 2026 Kitploit

Каталог инструментов

Категории

Все категории
Loading categories
givewp-cve-2026-82222-rce-lab — # Авторизованная Docker-лаборатория и чистый PoC для проверки CVE-2026-82222 RCE в GiveWP 4.16.5.1 и исправления 4.16.7.2. | Kitploit
Инструменты/GitHubGitHub/dinosn/givewp-cve-2026-82222-rce-lab
Анализ уязвимостейЭксплуатацияЭксплуатация веб-приложенийОбучение и ОбразованиеЛаборатории и Практика
GitHubdinosn/givewp-cve-2026-82222-rce-lab

givewp-cve-2026-82222-rce-lab

# Авторизованная Docker-лаборатория и чистый PoC для проверки CVE-2026-82222 RCE в GiveWP 4.16.5.1 и исправления 4.16.7.2.

Репозиторий
19 ч 4 мин назадЕщё не проверено

Популярное

Смотреть все →

Откройте для себя самые используемые инструменты нашего сообщества.

Изучить все инструменты

Просмотрите нашу коллекцию инструментов

Смотреть все инструменты →
Поделиться

CVE-2026-82222 — Лаборатория проверки RCE только по маркеру в GiveWP

Материалы для исследования безопасности, предназначенные для воспроизведения и проверки CVE-2026-82222 в изолированной Docker-лаборатории.

Для прямого PoC RCE и сканирования URL используйте CVE-2026-8222-RCE.py

Вердикт

Статус: подтверждено в предоставленной лаборатории

GiveWP 4.16.5.1 позволяет изначально неаутентифицированному атакующему сохранить граф PHP-объектов, восстановить его через обработку сессий GiveWP и выполнить фиксированную маркерную команду от имени пользователя веб-сервера WordPress.

Положительный результат теста:

root@kitploit:~
GiveWP:    4.16.5.1
WordPress: 6.6.2
PHP:       8.1.30
Result:    /tmp/CVE-2026-82222-RCE-GETBAG создан пользователем www-data

Сквозной результат также был воспроизведён на чистом, неинструментированном исходном коде GiveWP 4.16.5.1. GiveWP 4.16.7.2 заблокировал HTTP-носитель в протестированной конфигурации и независимо заблокировал терминальный гаджет при прямом управлении.

Это демонстрирует выполнение команд внутри контейнера WordPress. Это не демонстрирует получение root-доступа, выход из контейнера, горизонтальное перемещение или компрометацию хоста.

Границы безопасности

Используйте этот репозиторий только на системах, которыми вы владеете или на тестирование которых у вас есть явное разрешение.

Предоставленный PoC намеренно ограничен:

  • Он выполняет только touch /tmp/CVE-2026-82222-RCE-GETBAG.
  • Он не предоставляет опции произвольных команд.
  • Он не создаёт оболочку, callback, механизм персистентности или повышение привилегий.
  • Он отказывается работать с целями вне loopback, если оператор не укажет явный флаг --allow-authorized-non-loopback.
  • Docker публикует WordPress только на 127.0.0.1.
  • Имя проекта Compose формируется из пути к каталогу, поэтому один клон не может удалить контейнеры или тома другого клона.
  • Лаборатория использует чистый официальный исходный код плагина; она не инструментирует и не модифицирует уязвимую цель.

HTTP-тест создаёт одноразового донора, метаданные и строки сессии GiveWP. После тестирования используйте встроенную команду сброса.

Быстрый старт

Требования:

  • Docker с Compose v2
  • Python 3.10 или новее
  • curl
  • unzip
  • sha256sum или shasum
  • Сетевой доступ к downloads.wordpress.org для официальных архивов плагинов

Запустите полную матрицу уязвимая/исправленная версия:

root@kitploit:~
./lab verify

Эта команда:

  1. Загружает GiveWP 4.16.5.1 и 4.16.7.2 с WordPress.org.
  2. Проверяет оба SHA-256 хеша.
  3. Создаёт новую лабораторию WordPress 6.6.2/PHP 8.1 только на loopback с явно отключённой стандартной регистрацией WordPress.
  4. Тестирует чистую версию 4.16.5.1 и требует создания маркера веб-пользователем.
  5. Создаёт вторую новую лабораторию с чистой версией 4.16.7.2.
  6. Требует отсутствия HTTP-маркера.
  7. Обходит вход в систему при прямом управлении и подтверждает, что исправленный терминальный ProviderForwarder также отклоняет строковый callable.

Исправленная лаборатория остаётся запущенной в конце. Удалите её с помощью:

root@kitploit:~
./lab reset

Для использования другого loopback-порта:

root@kitploit:~
LAB_PORT=8099 ./lab verify

Ожидаемые доказательства

Уязвимый контроль должен завершиться конкретными терминальными доказательствами:

root@kitploit:~
[PASS] E1: неаутентифицированная регистрация выдала auth cookie
[PASS] E3: сериализованный граф сохранён в собственном last_name
[PASS] E4: получен nonce формы пожертвования
[PASS] E5: запись сессии достигла ожидаемого пост-синка HTTP status=500
[PASS] E6: чтение/уничтожение сессии завершено
маркер присутствует и принадлежит веб-пользователю WordPress
RESULT: УЯЗВИМЫЙ КОНТРОЛЬ ПОДТВЕРЖДЁН

Исправленный контроль должен показать:

root@kitploit:~
[PASS] P1: исправленный шлюз регистрации заблокировал auth cookie
DIRECT_MARKER=absent
HTTP-маркер отсутствует, и прямой терминальный гаджет заблокирован
RESULT: ИСПРАВЛЕННЫЙ КОНТРОЛЬ ПОДТВЕРЖДЁН

HTTP 500, сохранённая нагрузка, исключение или срабатывание детектора без маркера не принимаются как доказательство RCE.

Ручной жизненный цикл лаборатории

Запустите и протестируйте уязвимую версию:

root@kitploit:~
./lab start vulnerable
./lab test

Запустите и протестируйте исправленную версию:

root@kitploit:~
./lab start patched
./lab test

Проверьте текущее состояние:

root@kitploit:~
./lab status

Удалите контейнеры, тома, тестовых пользователей, сессии и состояние маркера:

root@kitploit:~
./lab reset

Кэшированные ZIP-архивы плагинов и извлечённые ресурсы сохраняются для ускорения повторных запусков. Удалите и эти сгенерированные ресурсы с помощью:

root@kitploit:~
./lab reset --purge-assets

Затронутые и протестированные версии

ВерсияОценка
GiveWP 4.16.5.1RCE воспроизведён сквозным образом
GiveWP 4.16.6–4.16.7.1Указаны как затронутые; здесь индивидуально не воспроизведены
GiveWP 4.16.7.2Исправленные отрицательные контроли воспроизведены
Более поздние версииИндивидуально не тестировались; обновитесь до последней поддерживаемой версии

Публичный advisory указывает версии до 4.16.7.1 включительно как затронутые. Этот репозиторий напрямую доказывает только две версии в своей матрице положительных/отрицательных тестов.

Ссылки:

  • Advisory Patchstack
  • CVE-2026-82222
  • Коммит исправления GiveWP
  • Официальная страница плагина GiveWP

Корневая причина

Эксплойт сочетает несколько видов поведения:

  1. GiveWP 4.16.5.1 предоставляет действие регистрации, которое создаёт и аутентифицирует донора с низкими привилегиями, даже когда стандартная регистрация WordPress отключена.
  2. Этот пользователь может сохранять сериализованные данные в собственных метаданных имени.
  3. Give\Helpers\Utils::maybeSafeUnserialize() использует allowed_classes => false, создавая __PHP_Incomplete_Class, но последующая сериализация сохраняет исходные имена классов и свойства.
  4. Граф сохраняется в сессии покупки GiveWP.
  5. Последующий неограниченный maybe_unserialize() восстанавливает поставляемые классы.
  6. Автоматическое уничтожение входит в полную POP-цепочку до system().

В HTTP-носителе требуются четыре литеральных обратных слэша в пространстве имён. Два эффективных прохода удаления уменьшают их 4 -> 2 -> 1. Нагрузка не содержит NUL-байтов, и PHP 8.1.30 был проверен на корректное восстановление обычного сериализованного имени для приватного свойства Session::$attributeName.

Полная POP-цепочка

root@kitploit:~
TCPDF::__destruct()
  -> TCPDF::_destroy(true)
  -> foreach ($this->imagekeys as $file)
  -> Symfony Session::getIterator()
  -> Session::getAttributeBag()
  -> Session::getBag($this->attributeName)
  -> $this->storage->getBag($attributeName)
  -> DonationFactory->__call('getBag', [$attributeName])
  -> call_user_func_array('system', [$attributeName])
  -> system('touch /tmp/CVE-2026-82222-RCE-GETBAG')

Граф, контролируемый атакующим:

root@kitploit:~
TCPDF
├── file_id = уникальный идентификатор запроса
└── imagekeys = Give\Vendors\Symfony\Component\HttpFoundation\Session\Session
    ├── attributeName = фиксированная маркерная команда
    └── storage = Give\TestData\Factories\DonationFactory
        └── loadedProviders["getBag"] = "system"

Критический скрытый переход — это неявная диспетчеризация IteratorAggregate в PHP. TCPDF::$imagekeys не типизирован, поэтому присвоение Symfony Session заставляет foreach вызывать Session::getIterator().

Маркерная команда выполняется до того, как Symfony применит тип возврата getAttributeBag(): AttributeBagInterface. Возникающие TypeError и HTTP 500 являются пост-синк эффектами.

Что упустили более ранние попытки

Отклонённый граф-кандидат использовал:

root@kitploit:~
TCPDF::$objcopy
  -> DonationFactory::$loadedProviders['__destruct'] = 'system'

Этот граф не может работать. TCPDF::_destroy() только удаляет objcopy; PHP не направляет автоматическое уничтожение через __call('__destruct', ...).

Отсутствующей операцией была:

root@kitploit:~
foreach ($this->imagekeys as $file) {

Более ранний обзор следовал за деструкторами и явными вызовами методов, но не рекурсивно исследовал неявный объектный протокол, запускаемый foreach. Symfony Session предоставляет недостающий мост:

  • foreach вызывает getIterator().
  • getIterator() достигает getBag($attributeName).
  • Контролируемое атакующим storage — это DonationFactory.
  • Неопределённый getBag вызывает ProviderForwarder::__call().
  • loadedProviders['getBag'] = 'system' выбирает callable.
  • attributeName предоставляет аргумент команды.

Доказательства из исходного кода

Соответствующие места в GiveWP 4.16.5.1:

КомпонентРасположение
Защищённая начальная десериализацияsrc/Helpers/Utils.php:203-217,237-241
Носитель пожертвованияincludes/process-donation.php:157
Персистентность сессии GiveWPincludes/class-give-session.php:364-368,489-508
Неограниченное восстановление сессииincludes/class-give-session.php:347-350
Деструктор TCPDFvendor/tecnickcom/tcpdf/tcpdf.php:2050-2052
Итерация, контролируемая атакующимvendor/tecnickcom/tcpdf/tcpdf.php:7885-7907
Мост итератора Symfonyvendor/vendor-prefixed/symfony/http-foundation/Session/Session.php:134-136
Мост getBag Symfonyvendor/vendor-prefixed/symfony/http-foundation/Session/Session.php:259-283
Терминальный callablesrc/TestData/Framework/ProviderForwarder.php:19-23
Автозагрузчики Composer GiveWPgive.php:624-625

Хеши официальных релизов:

root@kitploit:~
give.4.16.5.1.zip
95fc6709b6ed284074bf09be096e28d6299fd4a103848c2b1c3bf8a5772cf98c

give.4.16.7.2.zip
c5bc98da2abb748c64d31a43679ff5f223092dfff6d214132a55dcbc948e91ae

Лаборатория заново извлекает каждый плагин из проверенного ZIP-архива перед каждым новым запуском, копирует его в WordPress без изменений и побайтово сравнивает развёрнутое полное дерево файлов плагина с проверенным исходным кодом. Три официальных Docker-образа также закреплены за своими многоплатформенными манифестными дайджестами.

Почему 4.16.7.2 блокирует цепочку

GiveWP 4.16.7.2 добавляет независимые защиты в регистрацию, обработку сериализованных входных данных, восстановление сессии, миграцию данных и усиление гаджетов.

Терминальное усиление требует, чтобы разрешённый объект реализовывал ожидаемый контракт провайдера:

root@kitploit:~
if ( ! $provider instanceof Contract\Provider ) {
    return null;
}

Контролируемая атакующим строка system поэтому отклоняется. Прямое управление в этом репозитории обходит HTTP-носитель и проверяет, что одна эта терминальная защита оставляет маркер отсутствующим.

Проверка реального развёртывания

Отрицательный результат PoC сам по себе не доказывает, что сайт исправлен. WAF, другая маршрутизация, отключённая регистрация, отсутствующая устаревшая форма, конфигурация сессий или отключённые PHP-функции команд могут предотвратить появление маркера на всё ещё уязвимой кодовой базе.

Предпочтительная процедура проверки:

  1. Зафиксируйте развёрнутую версию GiveWP и ревизию исходного кода.
  2. Сделайте резервную копию или снапшот сайта WordPress и базы данных.
  3. Восстановите этот снапшот в изолированном staging-окружении.
  4. Отключите ненужный исходящий сетевой доступ.
  5. Запустите этот верификатор только с маркером против клона.
  6. Обновите GiveWP до последней поддерживаемой версии, при этом 4.16.7.2 — минимальная версия, содержащая протестированные исправления.
  7. Повторите идентичный тест и требуйте отсутствия маркера.
  8. Независимо проверьте установленную версию плагина и исправленный исходный код.

Проверка версии:

root@kitploit:~
wp plugin get give --fields=name,status,version

Исправление и разбор инцидента

Обновите GiveWP до последней поддерживаемой версии. После обновления:

  • Очистите кэши PHP opcode, где это применимо.
  • Убедитесь, что более старая копия GiveWP не осталась активной или доступной через веб.
  • Проверьте неожиданные учётные записи WordPress или доноров.
  • Поищите в метаданных пользователей и сессиях GiveWP сериализованные графы TCPDF, Symfony Session или loadedProviders.
  • Сопоставьте регистрацию, изменения профиля, запросы пожертвований и последующие ответы HTTP 500 из той же сессии.
  • Исследуйте неожиданные дочерние процессы веб-сервера или изменения файловой системы.

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

Структура репозитория

root@kitploit:~
.
├── .github/workflows/validate.yml
├── .gitignore
├── README.md
├── SECURITY.md
├── docker-compose.yml
├── lab
├── poc
│   ├── direct-pop-control.php
│   └── poc.py
└── scripts
    └── fetch-assets.sh

Не включено в коммит:

root@kitploit:~
официальные ZIP-архивы плагинов
извлечённый исходный код GiveWP
инструментированный исходный код цели
cookie или данные сессий
доказательства/журналы выполнения
внутренние адреса целей или повторно используемые учётные данные
устаревшие нагрузки objcopy
исторические результаты проверки

Границы проверки

УтверждениеСтатус
Персистентный носитель PHP-инъекции объектовДоказано
Восстановление поставляемых классовДоказано
Полная стандартная POP-цепочкаДоказано
Фиксированный маркер выполнен от имени веб-пользователяДоказано
Воспроизведение на чистой версии 4.16.5.1Доказано
Отрицательные контроли на чистой версии 4.16.7.2Доказано
Каждая промежуточная затронутая версия протестированаНе тестировалось
Root-привилегииНе заявляется
Выход из контейнераНе тестировалось
Компрометация хостаНе тестировалось

Стандарт доказательства намеренно строгий: только наблюдаемый командный маркер через немодифицированную стандартную цепочку обозначается как RCE. HTTP-приём, сериализация, исключения и срабатывания детекторов являются промежуточными доказательствами.

Скачать инструмент