The OpenNET Project / Index page

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

Уязвимость в библиотеке PharStreamWrapper, затрагивающая Drupal, Joomla и Typo3

10.05.2019 21:45

В библиотеке PharStreamWrapper, предоставляющей обработчики для защиты от проведения атак через подстановку файлов в формате "Phar", выявлена уязвимость (CVE-2019-11831), позволяющая обойти защиту от десериализации кода через подстановку символов ".." в пути. Например, атакующий может использовать для атаки URL вида "phar:///path/bad.phar/../good.phar" и библиотека выделит при проверке базовое имя "/path/good.phar", хотя при дальнейшей обработке подобного пути будет использован файл "/path/bad.phar".

Библиотека разработана создателями CMS TYPO3, но также применяется в проектах Drupal и Joomla, что делает их также подверженными уязвимости. Проблема устранена в выпусках PharStreamWrapper 2.1.1 и 3.1.1. Проект Drupal устранил проблему в обновлениях 7.67, 8.6.16 и 8.7.1. В Joomla проблема проявляется начиная с версии 3.9.3 и устранена в выпуске 3.9.6. Для устранения проблемы в TYPO3 требуется обновить библиотеку PharStreamWapper.

С практической стороны уязвимость в PharStreamWapper позволяет пользователю Drupal Core, имеющему полномочия администратора тем оформления ('Administer theme'), загрузить вредоносный phar-файл и добиться выполнения размещённого в нём PHP-кода под видом легитимного phar-архива. Напомним, что суть атаки "Phar deserialization" в том, что при проверке загруженных файлов при помощи PHP-функции file_exists(), эта функция автоматически выполняет десериализацию метаданных из файлов Phar (PHP Archive) при обработке путей, начинающихся с "phar://". Передача phar-файла возможна под видом картинки, так как функция file_exists() определяет MIME-тип по содержимому, а не по расширению.

  1. Главная ссылка к новости (https://arstechnica.com/inform...)
  2. OpenNews: Критическая уязвимость в системе управления web-контентом Drupal
  3. OpenNews: Раскрыты детали уязвимости в WordPress 5.0.0
  4. OpenNews: Выявлены следы взлома PHP-репозитория PEAR и модификации пакетного менеджера
  5. OpenNews: Уязвимости в PHP и PHPMailer
  6. OpenNews: Уязвимость в движке для создания форумов phpBB
Лицензия: CC BY 3.0
Короткая ссылка: https://opennet.ru/50665-phar
Ключевые слова: phar, drupal, joomla, typo3
При перепечатке указание ссылки на opennet.ru обязательно


Обсуждение (38) Ajax | 1 уровень | Линейный | +/- | Раскрыть всё | RSS
  • 1.1, Анонимус Суминонус (?), 22:12, 10/05/2019 [ответить] [﹢﹢﹢] [ · · · ]  
  • +2 +/
    Красиво
     
  • 1.2, Аноним (2), 22:38, 10/05/2019 [ответить] [﹢﹢﹢] [ · · · ]  
  • +6 +/
    Мы написали костыль, чтобы починить дырявый костыль. Но новый костыль тоже оказался с дырой…
     
     
  • 2.37, Аноним (37), 23:18, 12/05/2019 [^] [^^] [^^^] [ответить]  
  • +/
    Ответ очевиден - нужен ещё один костыль
     

  • 1.3, Michael Shigorin (ok), 23:07, 10/05/2019 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Эх, это ж типовой косяк двадцатилетней давности...
     
     
  • 2.4, Sluggard (ok), 00:19, 11/05/2019 [^] [^^] [^^^] [ответить]  
  • +4 +/
    > Библиотека разработана создателями CMS TYPO3

    Михаил, это не та ли CMS, переходить на которую ты постоянно советовал, в комментах к новостям об уязвимостях Drupal или WordPress? :)

     
     
  • 3.35, Michael Shigorin (ok), 00:51, 12/05/2019 [^] [^^] [^^^] [ответить]  
  • +3 +/
    >> Библиотека разработана создателями CMS TYPO3
    > Михаил, это не та ли CMS, переходить на которую ты постоянно
    > советовал, в комментах к новостям об уязвимостях Drupal
    > или WordPress? :)

    Та самая.  Заметьте, советы обычно были с присказкой вроде "вскакивать приходится раз-два в год, а не каждую неделю".

     

  • 1.5, Аноним (5), 06:43, 11/05/2019 [ответить] [﹢﹢﹢] [ · · · ]  
  • –1 +/
    Из документации PHP:
    > file_exists — Проверяет существование указанного файла или каталога

    Да и имя функции намекает.
    А тут ВНЕЗАПНО читаем
    > функция file_exists() определяет MIME-тип по содержимому

    Что-то тут не так)

     
     
  • 2.6, Аноним (6), 08:17, 11/05/2019 [^] [^^] [^^^] [ответить]  
  • +1 +/
    Не так тут PHP.
     
  • 2.8, пох (?), 08:45, 11/05/2019 [^] [^^] [^^^] [ответить]  
  • +2 +/
    вам в пехепе 4. Ну или максимум - 5.2 (который пожалуй и был последним true php)
    С тех пор было объявлено что все есть стрим, и "файловые" операции внезапно начали делать странное, если имя файла начиналось на someshit://
    Правда, для большинства этого шита доступны только самые примитивные операции, да еще и требуются явные разрешения или установка extension, а вот phar настолько прекрасен, что косплеит файловую систему целиком и включен из коробки (можно, конечно, выключить, но по неистребимой тяге разработчиков обмазываться всяким дерьмом, работать ничего кроме хеловротов и не будет).

    вопрос наличия мозгов у тех кто это придумывал - закрыт еще со времен демарша автора сухосина.

     
     
  • 3.9, Евгений (??), 08:52, 11/05/2019 [^] [^^] [^^^] [ответить]  
  • +/
    Ерунду не говорите, создание своего стримвроппера в 4.3.2 появилось.
     
     
  • 4.15, пох (?), 10:38, 11/05/2019 [^] [^^] [^^^] [ответить]  
  • –1 +/
    только вот что-то я не слышал о подобных уязвимостях не то что в 4, а и в ранних 5.
    Возможно именно потому, что из коробки ничего не работало, поэтому макаки на эти фичи не полагались, а если даже и включали - ничего кроме банальных read/write даже из приснопамятного rar было недоступно.

    кстати, наличие rar при отсутствии tar как бе намекает нам на то, какая операционная система была на столе у горе-разработчиков этого чудо-язычка.

    жаль что в ней их поделка не прижилась, поскольку там и с asp все было хорошо (и как-то он не торопился исполнять что ни попадя при попытке проверить существование файла)

     
     
  • 5.21, Онаним (?), 11:06, 11/05/2019 [^] [^^] [^^^] [ответить]  
  • +/
    У меня для вас очень плохие новости: уязвимости в glob() существовали безотносительно языка. Однако их удалённая эксплуатация (без наличия у атакующего каких-либо локальных привилегий в системе) возможна опять же только при передаче невалидированного ввода.
     
     
  • 6.24, пох (?), 11:25, 11/05/2019 [^] [^^] [^^^] [ответить]  
  • +1 +/
    > уязвимости в glob()

    а вот тут список непотребных символов вполне себе конечен (маловероятно появление завтра новых или вообще создания их методом подключения плагина), причем явно определен метод экранирования, и, вообще-то, аналогом этой уязвимости была бы передача не невалидированной строки в glob (во многих случаях вполне допустимая), а исполнение кода при передаче неправильной строки - через срыв стека где-нибудь в недрах regex или чем оно там их раскрывает.

    что было бы багом реализации, а не by design.

     
  • 3.32, Онаним (?), 13:21, 11/05/2019 [^] [^^] [^^^] [ответить]  
  • +1 +/
    Вот с чем соглашусь - так это с тем, что вся механика phar - редкостное удолбище. Оно по уму эксплицитно должно быть, через mount_phar($alias, $phar_file) например, который бы включал конкретный файл в конкретный путь phar://<alias>/...
     
     
  • 4.34, пох (?), 22:24, 11/05/2019 [^] [^^] [^^^] [ответить]  
  • +1 +/
    пожалуй что и да - я тут бегло полистал остальные стримы - нигде такой жопищи нет, если назвать кошку rar:// - абсолютно никакого ущерба окружающим она не нанесет, пока не попытаешься ее распаковать (да и тут это баг в конкретном модуле, а не by design)

     
  • 2.10, Евгений (??), 08:53, 11/05/2019 [^] [^^] [^^^] [ответить]  
  • +1 +/
    Вы прочитали неправильно. file_exists не определяет mime-тип.
     
     
  • 3.11, Евгений (??), 08:55, 11/05/2019 [^] [^^] [^^^] [ответить]  
  • +1 +/
    то есть написано неправильно
     
     
  • 4.12, Заря (?), 09:36, 11/05/2019 [^] [^^] [^^^] [ответить]  
  • +1 +/
    file_exists выполняет вначале код контейнера phar.
     
     
  • 5.14, Онаним (?), 10:34, 11/05/2019 [^] [^^] [^^^] [ответить]  
  • +1 +/
    Лучше бы вы не писали, и не показывали свою собственную безграмотность.

    Никакого исполняемого кода в контейнере Phar нет, если конечно криворучки - горе-писатели - не пытаются сделать include из пользовательского контента :D Что в современном хипста-мирке - норма жизни, также, как и eval.

    Есть возможность инстанциировать имеющиеся объекты и заполнять их проперти / вызывать десериализатор. Вкупе с автолоудерами и кривыми руками объектописателей (особенно горячих любителей eval, за который надо отлучать от кода пожизненно) это может привести и к выполнению произвольного кода.

    Если в file_exists не передавать пользовательский ввод без валидации (префикс phar:// в имени файла должен существовать) - ничего само собой случится не может. Криворучкам 100500 раз говорили, что при использовании пользовательского ввода его надо 100% валидировать, но они так и остаются криворучками.

     
     
  • 6.16, пох (?), 10:44, 11/05/2019 [^] [^^] [^^^] [ответить]  
  • +1 +/
    > Криворучкам 100500 раз говорили, что при использовании пользовательского ввода его надо 100% валидировать

    но забыли опубликовать Официальные Таблицы Валидных Символов Допустимых для file_exists.

    я у вас уже сто раз спрашивал - что не так в моем прекрасном файле phar://cat.jpeg и каков ваш _формальный_ критерий отличать такой файл от допустимых к проверке существования.

    Пока что я вижу дыру by design, и неудачные камлания на тему "нет, наш язычок прекрасен, валидируйте лучше"


     
     
  • 7.18, Онаним (?), 10:50, 11/05/2019 [^] [^^] [^^^] [ответить]  
  • –1 +/
    Нет у меня формального критерия отличать ваш файл. Я его просто априори переименую в то, что валидно для моей файловой системы, и сохраню так, как мне надо - в нужный шард, каталог, etc. А оригинальное имя запишу в книжечку метаданных.

    ---

    Весь пост совершенно к другому:
    Не делающие 100% валидации инпута - обречены иметь совершенно разнородные грабли, впрочем, туда и дорога.

     
     
  • 8.26, пох (?), 11:39, 11/05/2019 [^] [^^] [^^^] [ответить]  
  • +/
    я вам уже демонстрировал, что для моей файловой системы этот файл совершенно вал... текст свёрнут, показать
     
     
  • 9.31, Онаним (?), 13:14, 11/05/2019 [^] [^^] [^^^] [ответить]  
  • –1 +/
    Можешь называть свою кошку как угодно, поскольку ты даже не увидишь, что на серв... текст свёрнут, показать
     
  • 9.33, Онаним (?), 13:39, 11/05/2019 [^] [^^] [^^^] [ответить]  
  • +1 +/
    Я просто из старых ассемблерщиков, и у меня строка - это не просто набор символо... текст свёрнут, показать
     
  • 7.19, Онаним (?), 10:54, 11/05/2019 [^] [^^] [^^^] [ответить]  
  • +/
    Ну и да, если уж зашли на валидацию - даже самая простейшая (и не менее криворукая) валидация в виде проверки на /\?*: и \0 в именах файлов здесь нормально зайдёт. : потому, что иначе огребёте проблем под виндой.
     
     
  • 8.29, Аноним (29), 12:58, 11/05/2019 [^] [^^] [^^^] [ответить]  
  • +/
    А ты знаешь список всех функций где доступен этот API ... текст свёрнут, показать
     
     
  • 9.30, Онаним (?), 13:07, 11/05/2019 [^] [^^] [^^^] [ответить]  
  • –1 +/
    Считаем с запасом , что везде, где идут обращения к файлам, сокетам, etc Но де... текст свёрнут, показать
     
  • 7.20, Онаним (?), 10:59, 11/05/2019 [^] [^^] [^^^] [ответить]  
  • +1 +/
    Ну и дополню...

    ДА! Мы не можем 100% валидировать имена пользовательских файлов. Представляете? Никак! Сегодня это ://, вчера ? с *, завтра - ещё что-нибудь.

    Золотое правило: не можешь валидировать и доверять - не используй в системных вызовах. Нельзя невалидируемый ввод использовать в таковых. Совсем. Не понимающие этого - обречены иметь дыры каждый день, что и наблюдаем.

     

  • 1.7, Аноним (7), 08:41, 11/05/2019 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    https://github.com/nbs-system/snuffleupagus

    - Close to zero performance impact
    - Powerful yet simple to write virtual-patching rules
    - Killing several classes of vulnerabilities
      * Unserialize-based code execution
      * mail-based code execution
      * Cookie-stealing XSS
      * File-upload based code execution
      * Weak PRNG
      * XXE
    - Several hardening features
      * Automatic secure and samesite flag for cookies
      * Bundled set of rules to detect post-compromissions behaviours
      * Global strict mode and type-juggling prevention
      * Whitelisting of stream wrappers
      * Preventing writeable files execution
      * Whitelist/blacklist for eval
      * Enforcing TLS certificate validation when using curl
      * Request dumping capability
    - A relatively sane codebase:
      * A comprehensive testsuite
      * Every commit is tested on several distributions
      * An clang-format-enfored code style
      * A comprehensive documentation
      * Usage of coverity

     
     
  • 2.17, пох (?), 10:49, 11/05/2019 [^] [^^] [^^^] [ответить]  
  • +1 +/
    очередное "щас мы всем покажем как правильно кодить"

    и пофиг что половина списка ненужного ненужно ломает работающее к чертям, а где не ломает - там была не нужна.

    особенно вот это прекрасно:
    Enforcing TLS certificate validation when using curl

    дайте угадаю - еще и неотключаемая глупость.

     

  • 1.13, Онаним (?), 09:48, 11/05/2019 [ответить] [﹢﹢﹢] [ · · · ]  
  • –2 +/
    Хосспаде, долбодятлы.

    Внезапно отсутствие валидации передаваемых имён и передача пользовательских данных в системные вызовы (в данном случае Stream API) без валидации. За эти два греха надо отлучать от доступа к коду навсегда.

     
  • 1.22, Онаним (?), 11:09, 11/05/2019 Скрыто ботом-модератором [﹢﹢﹢] [ · · · ]     [к модератору]
  • –2 +/
     

     ....ответы скрыты (4)

  • 1.36, InuYasha (?), 13:06, 12/05/2019 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Придумают же костылей... pharы какие-то... хорошо что я ПХП уже лет 10 не трогал ) За всё это время, похоже, появилось много новых сущностей, а проблемы так и остались.
     
     
  • 2.38, Наноним (?), 23:24, 14/05/2019 [^] [^^] [^^^] [ответить]  
  • +/
    Держи в курсе, что ты там еще не трогал
     

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



    Партнёры:
    PostgresPro
    Inferno Solutions
    Hosting by Hoster.ru
    Хостинг:

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