Россия
RU
Казахстан
RU KZ
Беларусь
RU
Грузия
RU EN
Турция
RU EN
Критическая RCE в PHP (CVE-2026-109619) и легаси: как защитить PHP 5.6 и написать C-патч для ядра

PHP-дагы қауіпті RCE (CVE-2026-109619) және ескірген жүйелер: PHP 5.6-ны қалай қорғауға және ядроға арналған C-патч жазу

2026 жылдың 21 қазанында PHP экожүйесінде қауіптілік деңгейі ең жоғары CVSS 9.2 болатын екі қауіпті осалдық анықталды: CVE-2026-109618 және CVE-2026-109619. Екеуі де Zend Engine ядросының жадты басқару бұзылысына байланысты және қашықтан ерікті кодты орындауға (RCE) әкеледі.

1. Нақты сектор үшін басты мәселе неде?

Киберқауіпсіздік мамандарының ресми кеңесі қарапайым: «Шұғыл түрде ресми патчтары бар PHP 8.2+ немесе PHP 8.3+ нұсқаларына жаңартыңыз».

Алайда, көптеген корпоративтік B2B-порталдар, электрондық сауда платформалары және өндірістік жүйелер үшін PHP 5.6 нұсқасынан бір күнде көшу мүмкін емес. PHP 5.6 нұсқасын ресми қолдау 2018 жылдың соңында аяқталған (EOL), және оған арналған ресми патчтар шығарылмайды. Төменде аудиттің, мәселені оқшаулаудың және меншікті бэкпорт-патчты жасаудың тәжірибесі сипатталған.

2. Си тіліндегі кодтағы осалдықтың анатомиясы

CVE-2026-109619 шабуыл векторы session.upload_progress механизміндегі (ext/session/session.c файлы) жадты босату қатесіне негізделген:

  1. PHP_SESSION_UPLOAD_PROGRESS өрісі бар multipart/form-data формасын жіберу кезінде ядро жедел жадта қадағалау құрылымын бөледі және оның мекенжайын PS(rfc1867_progress) жаһандық айнымалысында сақтайды.
  2. Егер файлды тасымалдау кезінде жад тапшылығы (OOM, memory_limit асуы) немесе байланыс үзілісі орын алса, қозғалтқыш стандартты аяқтауды айналып өтіп, шұғыл zend_bailout() орындайды.
  3. Ағымдағы сұраныстың жады босатылады, бірақ ұзақ жұмыс істейтін воркердегі (Apache / PHP-FPM) жүйелік көрсеткіш босатылған мекенжайға нұсқап қала береді (dangling pointer пайда болады).
  4. Осы воркерге түскен келесі сұраныс бөтен жадқа жүгінеді — Use-After-Free орын алады, бұл шабуылдаушыға серверде ерікті шеллкодты орындауға мүмкіндік береді.

3. Қорғаныс стратегиясы: қауіпсіздіктің үш деңгейі

1-деңгей: PHP 8 нұсқасына толық көшу (Ұсынылады)

Екі осалдықтың да толыққанды шешімі — жобаны қолдау көрсетілетін PHP 8.2 немесе 8.3 нұсқаларына жоспарлы түрде көшіру.

2-деңгей: PHP 5.6 үшін C-патч бэкпорты

Жаңарту мүмкін емес серверлер үшін біз PHP 5.6 бастапқы кодына арналған C-патч әзірлеп, сынақтан өткіздік. Патч әрбір жаңа сұраныстың (RINIT) басында PS(rfc1867_progress) = NULL; көрсеткішін мәжбүрлі түрде нөлдейді және ақау орын алғанда (RSHUTDOWN) құрылымдарды дұрыс босатады.

3-деңгей: Қайта құрастырусыз уақытша шара (.htaccess / Nginx)

Егер сізде серверде root құқықтары болмаса, веб-сервер конфигурациясында осал механизмді өшіріңіз:

# Осал механизмді өшіру
<IfModule mod_php5.c>
    php_flag session.upload_progress.enabled off
</IfModule>

# WAF: шабуыл белгілерін блоктау
<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteCond %{THE_REQUEST} (PHP_SESSION_UPLOAD_PROGRESS|upload_progress) [NC,OR]
    RewriteCond %{QUERY_STRING} (PHP_SESSION_UPLOAD_PROGRESS|upload_progress) [NC]
    RewriteRule .* - [F,L]
</IfModule>
Маңызды: session.upload_progress өшіру CVE-2026-109619 векторын бұғаттайды, бірақ ядроның жалпы OOM ақауын (CVE-2026-109618) түзетпейді. Тауар суреттері мен прайс-парақтарды $_FILES арқылы жүктеу қалыпты түрде жұмыс істей береді.

4. Қоғамдастыққа арналған ашық бастапқы кодтар мен бинарлық файлдар

Барлық әзірлемелер — C-патч, дайын .deb пакеттер, қайта өндіруге болатын құрастыруға арналған Dockerfile және егжей-тегжейлі нұсқаулық — GitHub репозиторийінде ашық лицензиямен жарияланған:

GitHub репозиторийі: checkfoxe/php56-session-uaf-patch →

Авторы: Виктор Зарбашев (@checkfoxe)

Содержание