
Эксплойт-концепт для CVE-2022-31630, уязвимости чтения за пределами буфера в расширении GD языка PHP. Демонстрирует аварийное завершение и раскрытие памяти в уязвимых версиях PHP. Включает лабораторную среду на базе Docker для безопасного тестирования.
Предупреждение: Этот код создан исключительно в образовательных целях и для тестирования в изолированной лабораторной среде. Использование в других системах без разрешения незаконно и безответственно.
📌 Описание
CVE-2022-31630 — это уязвимость Out-of-Bounds (OOB) чтения в расширении GD PHP, а именно в функции imageloadfont(). Уязвимость позволяет атакующему, который может контролировать файл шрифта, загружаемый приложением PHP, читать данные за пределами выделенного буфера. Возможные последствия:
· Отказ в обслуживании (аварийное завершение) – приложение перестаёт отвечать. · Раскрытие информации – чувствительные данные из памяти могут быть прочитаны (например, ключи, токены или фрагменты других данных).
Затронутые версии PHP
· PHP 7.4.x до 7.4.33 · PHP 8.0.x до 8.0.25 · PHP 8.1.x до 8.1.12
PHP 7.4.33 — первая версия, получившая исправление для CVE. Этот репозиторий предоставляет доказательство концепции (PoC) для демонстрации различий в поведении между уязвимой версией (≤ 7.4.32) и исправленной версией (≥ 7.4.33).
🔍 Технические детали
Уязвимость возникает из-за отсутствия проверки входных данных при чтении файла шрифта GD (формат .gdf). Файл шрифта имеет следующую структуру заголовка:
| Смещение в байтах | Размер (байт) | Описание |
|---|
| 0 | 2 | Магическое число (0x01BE) |
| 2 | 2 | Количество символов (nchars) |
| 4 | 2 | Ширина символа (width) (в пикселях) |
| 6 | 2 | Высота символа (height) |
| 8 | 2 | Количество байтов на символ (char_offset) |
Если значение width сделать очень большим (например, 65535), расчёт размера буфера для хранения битовой карты символа становится неверным. В результате выделенный буфер оказывается слишком мал. Когда функция imagechar() затем читает символ из этого шрифта, она обращается к памяти за пределами буфера — это и есть Out-of-Bounds чтение.
🧪 Требования для тестирования
· Docker (для запуска изолированной среды)
· PHP версии 7.4.32 или 7.4.33 (можно использовать образы Docker php:7.4.32-cli / php:7.4.33-cli)
· Расширение GD (будет установлено внутри контейнера)
🚀 Как использовать PoC
git clone https://github.com/sepkascurty-cpu/php-exploit_cve-2022-31630.git
cd exploit_cve-2022-31630
Для тестирования уязвимой версии (7.4.32):
docker run -it --rm -v $(pwd):/app php:7.4.32-cli bash
Для тестирования исправленной версии (7.4.33):
docker run -it --rm -v $(pwd):/app php:7.4.33-cli bash
cd /app
apt-get update
apt-get install -y libfreetype6-dev libjpeg62-turbo-dev libpng-dev
docker-php-ext-configure gd --with-freetype --with-jpeg
docker-php-ext-install gd
php exploit_cve-2022-31630.php
📊 Пример вывода
| Версия PHP | Ожидаемый результат |
|---|---|
| 7.4.32 (уязвимая) | Программа аварийно завершается с Segmentation Fault или происходит утечка памяти (видны фиктивные данные из памяти). |
| 7.4.33 (исправленная) | Выполнение завершается нормально, файл output.png сохраняется, аварийных сбоев нет. |
🛡️ Смягчение
· Обновите PHP до последней версии, содержащей исправление:
· PHP 7.4.33 или новее
· PHP 8.0.25 или новее
· PHP 8.1.12 или новее
· Если обновление невозможно, отключите расширение GD или функцию imageloadfont(), если они не нужны.
· Применяйте принцип наименьших привилегий в приложении, чтобы минимизировать последствия утечки памяти.
📚 Ссылки
· CVE-2022-31630 на NVD · Коммит исправления в php-src · Объявления о выпуске PHP
⚠️ Отказ от ответственности
Этот репозиторий предоставлен в образовательных целях и для исследований в области безопасности. Автор не несёт ответственности за неправомерное использование этого кода. Убедитесь, что вы тестируете только в среде, которой владеете, или имеете письменное разрешение.
Создано для сообщества кибербезопасности Индонезии.