The OpenNET Project / Index page

[ новости /+++ | форум | wiki | теги | ]

Локальная root-уязвимость в PHP-FPM

28.10.2021 18:41

В PHP-FPM, менеджере процессов FastCGI, входящем в основную поставку PHP начиная с ветки 5.3, выявлена критическая уязвимость CVE-2021-21703, дающая возможность непривилегированному пользователю хостинга выполнить код с правами root. Проблема проявляется на серверах, использующих для организации запуска PHP-скриптов PHP-FPM, обычно применяемый в связке с Nginx. Выявившие проблему исследователи смогли подготовить рабочий прототип эксплоита.

Уязвимость вызвана сохранением указателей в область разделяемой памяти (scoreboard), применяемой для организации взаимодействия между дочерним и родительским процессом PHP-FPM. Основной процесс PHP-FPM, координирующий работу, запускается с правами root и порождает несколько дочерних процессов, которые выполняются под непривилегированным пользователем (обычно www-data или nobody) и непосредственно занимаются выполнением PHP-скриптов. Суть проблемы в том, что подконтрольный пользователю дочерний процесс может получить доступ к разделяемой памяти управляющего процесса и изменить указатели, используемые в основном процессе (в структуре scoreboard сохраняются указатели на вложенную структуру fpm_scoreboard_proc_s).

Указанная особенность позволяет атакующему, который имеет возможность запустить свой PHP-код на сервере, обойти sandbox-изоляцию интерпретатора и через подмену указателей в структуре fpm_scoreboard_s очистить область памяти основного процесса или изменить значение 32-разрядных целых значений с нуля на единицу. Для изменения значения атакующий записывает указатель на целочисленную переменную в массив scoreboard->procs и отправляет связанному с этим указателем обработчику сигнал SIGKILL.

Подобные манипуляции дают возможность через проявление ещё одной ошибки добиться выполнения своего кода в основном процессе. В частности, в памяти можно установить в 1 настройку catch_workers_output, которая по умолчанию имеет значение 0. Указанная настройка включает сохранение в лог stderr-вывода от рабочих процессов php-fpm. Поступающая информация буферизируется, а буфер создаётся в куче основного процесса, что позволяет атакующему разместить в куче до 1024 байт произвольных данных. Далее манипулируя возможностью менять 0 на 1 и очищать память, атакующий может изменить размера блока и добиться контролируемого переполнения кучи.

Уязвимость проявляется начиная с версии PHP 5.3.7, в которую был интегрирован PHP-FPM. Примечательно, что разработчики PHP были уведомлены о проблеме ещё в мае, но не спешили с подготовкой исправления. В итоге уязвимость была устранена в обновлениях PHP 7.3.32, 8.0.12 и 7.4.25 уже после раскрытия сведений о проблеме. Для веток PHP, поддержка которых уже прекращена, можно попытаться использовать патч. Основные дистрибутивы выпустили обновления пакетов с устранением уязвимости: Debian, RHEL, SUSE, Ubuntu, Fedora, Arch. В портах FreeBSD проблема пока не устранена.

В 2019 году похожая уязвимость, также связанная с хранением указателей в разделяемой памяти scoreboard, была исправлена в механизме управления дочерними процессами в Apache httpd. Уязвимость позволяла локальному злоумышленнику (например, пользователю хостинга), имеющему возможность выполнить свой скрипт под управлением web-сервера, добиться выполнения кода с правами управляющего процесса, обычно запускаемого с привилегиями root.

  1. Главная ссылка к новости (https://www.openwall.com/lists...)
  2. OpenNews: Уязвимость php-fpm, позволяющая удалённо выполнить код на сервере
  3. OpenNews: Уязвимость, позволяющая совершить MITM-атаку через манипуляцию с HTTP-заголовком Proxy
  4. OpenNews: Обновление PHP 5.5.12 с устранением уязвимости в PHP-FPM
  5. OpenNews: Критическая уязвимость в PHP
  6. OpenNews: Релиз http-сервера Apache 2.4.39 с устранением опасных уязвимостей
Лицензия: CC-BY
Наводку на новость прислал пох.
Тип: Проблемы безопасности
Короткая ссылка: https://opennet.ru/56055-php-fpm
Ключевые слова: php-fpm, php, nginx
При перепечатке указание ссылки на opennet.ru обязательно


Обсуждение (69) Ajax | 1 уровень | Линейный | +/- | Раскрыть всё | RSS
  • 1.5, Sherry Birkin (?), 18:55, 28/10/2021 [ответить] [﹢﹢﹢] [ · · · ]  
  • –16 +/
    А я говорил, ставьте Apache2!
     
     
  • 2.7, srgazh (ok), 18:57, 28/10/2021 [^] [^^] [^^^] [ответить]  
  • +8 +/
    Там таких новостей еще более
     
     
  • 3.28, пох. (?), 21:40, 28/10/2021 [^] [^^] [^^^] [ответить]  
  • +/
    именно такая ровно одна (в смысле, об ту же проблему)
     
  • 2.29, Онаним (?), 21:42, 28/10/2021 [^] [^^] [^^^] [ответить]  
  • –2 +/
    А вот да, костылинг костылей в виде FPM такой костылинг.
     
     
  • 3.48, Аноним (48), 03:19, 29/10/2021 [^] [^^] [^^^] [ответить]  
  • +/
    Просто кто-то не осилил парсинг в свое время HTTP и изобрел целый зоопарк этих CGI протоколов
    Теперь даже стыдно на это все смотреть - когда в любом Golang, Java, Ruby реалзованы полноценные асинхронные сервера с бешеной производительностью

    С другой стороны популярность и шаблонность всегда удобнее и проще - много специаистов можно найти

     
     
  • 4.72, Аноним (72), 22:25, 29/10/2021 [^] [^^] [^^^] [ответить]  
  • +/
    https://reactphp.org/
     
  • 2.50, Аноним (50), 04:20, 29/10/2021 [^] [^^] [^^^] [ответить]  
  • +1 +/
    А я говорил, не позволяйте запускать произвольный код!
     

  • 1.9, Аноним (9), 19:01, 28/10/2021 [ответить] [﹢﹢﹢] [ · · · ]  
  • +1 +/
    >Примечательно, что разработчики PHP были уведомлены о проблеме ещё в мае, но не спешили с подготовкой исправления.

    Интересно чего они ждали?

     
     
  • 2.10, Sw00p aka Jerom (?), 19:08, 28/10/2021 [^] [^^] [^^^] [ответить]  
  • +5 +/
    хорошо хоть за уязвимость восприняли :)
     
     
  • 3.13, Аноним (13), 19:34, 28/10/2021 [^] [^^] [^^^] [ответить]  
  • +2 +/
    После того как визг подняли и признали
     
  • 2.17, Аноним (17), 19:58, 28/10/2021 [^] [^^] [^^^] [ответить]  
  • +2 +/
    Им некогда, они смузи фичи пилят.
     
     
  • 3.33, Онаним (?), 21:51, 28/10/2021 [^] [^^] [^^^] [ответить]  
  • +1 +/
    Ни хрена не смузи. В 8.1 будут Fibers - это просто очешуенчик.
     
     
  • 4.36, eee (??), 22:25, 28/10/2021 [^] [^^] [^^^] [ответить]  
  • +/
    "очешуенчик" - wtf ОнаниZм?
     
  • 2.18, Аноним (18), 20:05, 28/10/2021 [^] [^^] [^^^] [ответить]  
  • +/
    С дивана долго поднимались
     
  • 2.21, QwertyReg (ok), 20:31, 28/10/2021 Скрыто модератором
  • –10 +/
     
     
  • 3.49, Аноним (48), 03:21, 29/10/2021 Скрыто модератором
  • –1 +/
     
  • 2.26, пох. (?), 21:29, 28/10/2021 [^] [^^] [^^^] [ответить]  
  • +3 +/
    там эксплойт довольно нетривиален и негарантированно сработает в идеале надо чт... большой текст свёрнут, показать
     
     
  • 3.56, FSA (??), 10:22, 29/10/2021 [^] [^^] [^^^] [ответить]  
  • +/
    А ещё эксплуатация может быть осложнена изоляцией в контейнере или подсистемой безопасности, типа SELinux или AppArmor.
     

  • 1.11, pashev.me (?), 19:17, 28/10/2021 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Ещё один пример того, что "должно работать" и "работает" - это не одно и тоже.
     
     
  • 2.31, Аноним (31), 21:47, 28/10/2021 [^] [^^] [^^^] [ответить]  
  • +1 +/
    Компилируется значит работает (с)
     

  • 1.12, Аноним (12), 19:23, 28/10/2021 [ответить] [﹢﹢﹢] [ · · · ]  
  • –1 +/
    >Основной процесс PHP-FPM, координирующий работу, запускается с правами root

    Это очень умное решение.

     
     
  • 2.24, пох. (?), 21:24, 28/10/2021 [^] [^^] [^^^] [ответить]  
  • +2 +/
    это юникс, тебе не понять, вчерародившийся.
     
  • 2.76, Ananimasss (?), 10:57, 30/10/2021 [^] [^^] [^^^] [ответить]  
  • +/
    Есть варианты как еще забиндить порт ниже 1024 и запускать чайлдов под другим юзером?
    Обязательно расскажи.
     
     
  • 3.80, yurikoles (ok), 23:17, 31/10/2021 [^] [^^] [^^^] [ответить]  
  • +1 +/
    Чта? В 99.99% случаев он работает на той же машине, что и NGINX, с которым они общаются либо через локальный сокет, либо через localhost:9000. Т.е. ему привилегированные порты в принципе не нужны.
     
  • 3.83, notroot (??), 15:43, 19/11/2021 [^] [^^] [^^^] [ответить]  
  • +/
    Есть: CAP_NET_BIND_SERVICE. Насчет ограничения setuid/setgid с ходу не понял, надо разбираться. "Наихудший" вариант: разрешать неограниченный setuid, но зарубленный доступ ко всему через эти же capabilities.

    Начать можно с "Linux Capabilities in a nutshell", но лучше с английского языка и системного подхода к обучению.

     

  • 1.14, Рева RarogCmex Денис (?), 19:38, 28/10/2021 [ответить] [﹢﹢﹢] [ · · · ]  
  • –3 +/
    Вовремя я избавился от php на своём личном сервере.
     
     
  • 2.30, Онаним (?), 21:44, 28/10/2021 [^] [^^] [^^^] [ответить]  
  • +8 +/
    Лучше сразу от сервера. Нет сервера - нет уязвимостей.
     
  • 2.37, Аноним (37), 22:27, 28/10/2021 [^] [^^] [^^^] [ответить]  
  • +/
    И чем теперь пробавляемся?
     

  • 1.15, YetAnotherOnanym (ok), 19:49, 28/10/2021 [ответить] [﹢﹢﹢] [ · · · ]  
  • +4 +/
    А термин "увизгвимость" в html title страницы - это редактор так прикололся?
     
     
  • 2.16, Аноним (16), 19:52, 28/10/2021 [^] [^^] [^^^] [ответить]  
  • +1 +/
    Это опеннет написан на перле. Старое не отредактированное значение всегда остаётся в заголовке страницы.
     
     
  • 3.20, Аноним (20), 20:26, 28/10/2021 [^] [^^] [^^^] [ответить]  
  • +/
    Задумался над тем, что когда-нибудь на Opennet появится (а может уже была) новость про уязвимость, через которую можно будет сломать его самого :) С подробным разъяснением и ссылкой на эксплойты. Хорошее оформление новости это не всегда хорошо :)
     
  • 3.55, Аноним (55), 09:31, 29/10/2021 [^] [^^] [^^^] [ответить]  
  • +1 +/
    > Это опеннет написан на перле. Старое не отредактированное значение всегда остаётся в заголовке страницы.

    И при чем тут Perl ?

     
     
  • 4.57, тигар.логиниться.лень (?), 10:39, 29/10/2021 [^] [^^] [^^^] [ответить]  
  • –1 +/
    действительно. о мертвых либо хорошо, либо вообще никак.
     
  • 2.19, Аноним (19), 20:09, 28/10/2021 [^] [^^] [^^^] [ответить]  
  • –1 +/
    Кому-то видимо особо нравятся свиньи.
     
     
  • 3.58, suffix (ok), 11:45, 29/10/2021 Скрыто модератором
  • +/
     
     
  • 4.59, Ornlo (ok), 13:29, 29/10/2021 Скрыто модератором
  • +/
     
     
  • 5.60, suffix (ok), 13:36, 29/10/2021 Скрыто модератором
  • +/
     
     
  • 6.61, Ornlo (ok), 14:11, 29/10/2021 Скрыто модератором
  • +/
     
     
  • 7.62, suffix (ok), 14:15, 29/10/2021 Скрыто модератором
  • +/
     
  • 2.23, Аноним84701 (ok), 20:52, 28/10/2021 [^] [^^] [^^^] [ответить]  
  • +1 +/
    > А термин "увизгвимость" в html title страницы - это редактор так прикололся?

    См под новостью: "Наводку на новость прислал пох."

     
     
  • 3.25, пох. (?), 21:25, 28/10/2021 [^] [^^] [^^^] [ответить]  
  • +/
    ну я ж нечаянно...
     
     
  • 4.27, Аноним (31), 21:33, 28/10/2021 [^] [^^] [^^^] [ответить]  
  • +/
    Вот кто-кто, а вот конкретно ты мог и специально)
     

  • 1.32, Онаним (?), 21:50, 28/10/2021 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Вообще шанс эксплуатации этого дела околонулевой - надо пробить код (кто-то юзает FPM для untrusted code? ссзб), дальше надо трахаться с пробитием sandbox, дальше надо трахаться с тем, чтобы выйти на rce...

    Но тем не менее дыра злобно злая, хорошо что таки заткнули.

     
     
  • 2.35, пох. (?), 22:06, 28/10/2021 [^] [^^] [^^^] [ответить]  
  • –1 +/
    Ну в нескучном язычке, способном выполнить файл при попытке проверить его существование - таки это не нерешаемая задача. То есть эксплойт придется переделывать под конкретный кривой плагин конкретной  супер-cms, но в принципе почти у каждого что-то такое можно найти, если хорошо поискать.

    Т.е. жить с такой дырой все же не стоит.

     
     
  • 3.40, Онаним (?), 00:05, 29/10/2021 [^] [^^] [^^^] [ответить]  
  • +/
    Для этого, правда, тот файл надо ещё загрузить, да так, чтобы с нужным расширением, и при проверке существования надо phar:// в начало имени подставить, ну да ладно. Тут проблема не в бобине, короче.
     
  • 3.41, Онаним (?), 00:06, 29/10/2021 [^] [^^] [^^^] [ответить]  
  • +/
    У этих ребят до сих пор eval()'ы в коде, чего вы от них хотели-то? Там завтра файл будет выполняться без существования, и никто не удивится.
     
  • 3.42, Онаним (?), 00:07, 29/10/2021 [^] [^^] [^^^] [ответить]  
  • +/
    (мысль по древу к тому, что PHP тут вообще сбоку пришёлся, дай им баш - так они и там уязвимость сделают)
     
     
  • 4.43, пох. (?), 00:13, 29/10/2021 [^] [^^] [^^^] [ответить]  
  • –1 +/
    баш - это вот та самая фигня, которая по нажатию tab исполняла внезапно код? Ну да, ну да...

     
  • 2.67, Аноним (67), 17:04, 29/10/2021 [^] [^^] [^^^] [ответить]  
  • +/
    Это по всяким шаредам типа GoDaddy может ударить.
     
     
  • 3.68, Онаним (?), 20:07, 29/10/2021 [^] [^^] [^^^] [ответить]  
  • +/
    FPM на шаредах - это редкое извращение.
     

  • 1.34, Онаним (?), 21:53, 28/10/2021 [ответить] [﹢﹢﹢] [ · · · ]  
  • –1 +/
    И да, плять, я только что собрал 7.3.31 для проекта с FPM... Теперь надо собирать и тестить 7.3.32. Хорошо, что в прод ещё не ушло, притормозить не поздно.
     
     
  • 2.38, пох. (?), 22:41, 28/10/2021 [^] [^^] [^^^] [ответить]  
  • +/
    нам бы ваши проблемы (исправляет .14 на .25)
     
  • 2.44, kissmyass (?), 00:13, 29/10/2021 [^] [^^] [^^^] [ответить]  
  • –1 +/
    да ни на что не повлияет, понятно что не есть это хорошо, но ничего реально критичного не произойдет, если это не шареный хостинг (но эти ССЗБ, если даже на дешманский VPS денег жмут)

    ну получил ты рута и что? в твоем php приложении крутится какой-то вредоносный код? нет... т.е. ты от рута ничего не сделал плохого, да это чревато в совокупности с другими дырами, но не более.

    повышение локальных привелегий при наличии возможности выполнять любой код можно всегда попытаться осуществить с использованием row-hammer, а большинство проектов ECC память не используют, даже с Xeon процессорами, нонсенс, но факт (я посмотрел сервера доступные на аукционах, т.е. таких еще тысячами используется по всему миру), исключение составляют большие сервера с регистровой памятью, инстансы по 300+ вечнозеленых.

    в общем как бы очень плохо, но несмертельно само по себе

     
     
  • 3.45, Онаним (?), 00:35, 29/10/2021 [^] [^^] [^^^] [ответить]  
  • –1 +/
    На шаредах FPM - это угрё... утопи... нонсенс в общем :D
    Насчёт ECC яхз, ECC память стоит не сильно дороже обычной по факту ныне.
     
     
  • 4.46, kissmyass (?), 01:13, 29/10/2021 [^] [^^] [^^^] [ответить]  
  • –1 +/
    > На шаредах FPM - это угрё... утопи... нонсенс в общем :D
    > Насчёт ECC яхз, ECC память стоит не сильно дороже обычной по факту
    > ныне.

    так они в новости пишут что с какой-то версии это часть PHP, а не просто отдельный компонент

    > Уязвимость проявляется начиная с версии PHP 5.3.7, в которую был интегрирован PHP-FPM.

    --

    если регистровая так еще и дешевле, больше цена зависит от размера модуля, сильно крупные модули сильно дороже даже регистровые

    но суть это не меняем, установка ECC в дедикейтед всё еще опция у многих ISP

     
     
  • 5.69, Онаним (?), 20:07, 29/10/2021 [^] [^^] [^^^] [ответить]  
  • +/
    На самом деле отдельный бинарник.
     

  • 1.39, Аноним (39), 23:22, 28/10/2021 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Забавно - в комментах пишут про мертвый язык или нескучный язык, а уязвимость в fpm_children.c  
     
     
  • 2.51, Аноним (51), 05:05, 29/10/2021 [^] [^^] [^^^] [ответить]  
  • +/
    Уязвимость вызвана сохранением указателей в область разделяемой памяти (scoreboard), применяемой для организации взаимодействия между дочерним и родительским процессом PHP-FPM.

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

     

  • 1.47, gogo (?), 02:48, 29/10/2021 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    > Основные дистрибутивы выпустили обновления пакетов с устранением уязвимости

    у RHEL статус CVE - New. Нифига они не выпустили. Ещё конь не валялся...

     
  • 1.52, Аноним (52), 05:14, 29/10/2021 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    А кто мешает запускать php-fpm не под root-ом?

      name                    user
    php-fpm             php-fpm(not root)
        |- php-fpm      php-fpm(not root)
        |- php-fpm      php-fpm(not root)

     
     
  • 2.54, Нанобот (ok), 08:38, 29/10/2021 [^] [^^] [^^^] [ответить]  
  • +1 +/
    У сабжа одна из ключевых фич - запуск рабочих процессов от других пользователей (ability to start workers with different uid/gid/chroot/environment), для нее нужны права рут.
     
     
  • 3.74, Аноним (52), 22:54, 29/10/2021 [^] [^^] [^^^] [ответить]  
  • +/
    В systemd возможно запустить php-fpm(main process) не от root, также включить всякую там защиту и т.д. Просто надо научиться читать документацию. Порты в firewall перенаправить выше 1000, также nginx должен работать под своим user-ом и не иметь доступ даже на чтение php файлов. Нужно понять, что бесплатно никто не даст гарантии безопасности, именно сейчас, может в будущем люди станут мудрее..........
     
  • 2.70, lindevel (ok), 21:35, 29/10/2021 [^] [^^] [^^^] [ответить]  
  • +/
    Дякую, я й не знав, що так можна
     
  • 2.75, SubGun (??), 01:06, 30/10/2021 [^] [^^] [^^^] [ответить]  
  • +/
    Лень мешает. Люди настолько обленились, что хотят безопасности по дефолту. БД открыта наружу - виноват не админ сервера, а разработчик, который не делает по-умолчанию бинд на локалхост. Так же и тут.
    Эпоха докера еще больше развратила людей. Бездумно ставят дефолтный образ и не видят в этом проблемы.
     

  • 1.53, Какаянахренразница (ok), 06:28, 29/10/2021 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Пойти, что ли, выполнить код с правами root из-под непривилегированного пользователя на хостинге... Хотя, кого я хакаю -- я сам себе хостер и мне нахрен не вср*лась эта уязвимость.
     
     
  • 2.77, Онаним (?), 14:50, 30/10/2021 [^] [^^] [^^^] [ответить]  
  • +/
    На хостингах обычно нет FPM, забудьте.
     
     
  • 3.78, Какаянахренразница (ok), 20:32, 31/10/2021 [^] [^^] [^^^] [ответить]  
  • +/
    > На хостингах обычно нет FPM, забудьте.

    Обычно на моём хостинге есть PHP-FPM, ибо я сам его туда поставил.

     
     
  • 4.79, Онаним (?), 22:30, 31/10/2021 [^] [^^] [^^^] [ответить]  
  • +/
    А, ну сочувствую.
     

  • 1.73, Аноним (52), 22:31, 29/10/2021 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    В systemd возможно запустить php-fpm(main process) не от root, также включить всякую там защиту и т.д. Просто надо научиться читать документацию. Порты в firewall перенаправить выше 1000, также nginx должен работать под своим user-ом и не иметь доступ даже на чтение php файлов. Нужно понять, что бесплатно никто не даст гарантии безопасности, именно сейчас, может в будущем люди станут мудрее..........
     

     Добавить комментарий
    Имя:
    E-Mail:
    Текст:



    Спонсоры:
    PostgresPro
    Inferno Solutions
    Hosting by Hoster.ru
    Хостинг:

    Закладки на сайте
    Проследить за страницей
    Created 1996-2022 by Maxim Chirkov
    Добавить, Поддержать, Вебмастеру