The OpenNET Project / Index page

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

23.10.2018 22:27  Неосмотрительное использование плагина jQuery-File-Upload делает многие сайты уязвимыми

В плагине jQuery-File-Upload выявлена поучительная уязвимость CVE-2018-9206, показавшая беспечность web-разработчиков и web-администраторов. jQuery-плагин jQuery-File-Upload предоставляет функциональный web-виджет для организации загрузки файлов на сайты, поддерживающий групповую загрузку, индикатор прогресса и возобновление прерванных загрузок. Основная функциональность jQuery-File-Upload реализована на JavaScript и выполняется на стороне браузера, при этом в состав также входит набор примеров серверных обработчиков для сохранения отправляемых файлов.

Суть уязвимости в том, что в предлагаемых серверных обработчиках полностью отсутствовали фильтры для блокирования загрузки потенциально опасных типов контента и загружаемые файлы сохранялись на сервере под исходными именами, которые определял пользователь на сайте. Данные загружались в каталог "./files", находящийся в рабочей иерархии каталогов web-сервера. Таким образом, при использовании предлагаемых серверных обработчиков, пользователь мог сохранить любые типы файлов, например, "test.php", которые сохранялись в публично доступной директории и становились видимыми для внешних запросов (например, загруженный "test.php" можно было получить запросив "http://example.com/files/test.php").

В ситуации, если на сайте используется PHP и включено выполнение php-файлов во всей иерархии каталогов, подобный запрос без должного ограничения доступа к каталогу "./files" приведёт к выполнению кода скрипта, сохранённого в файле test.php, на стороне сервера, что позволит полностью получить контроль за сайтом. Основной ошибкой разработчика jQuery-File-Upload стало то, что он не стал ограничивать допустимые для сохранения типы файлов, а попытался включить в поставку ".htaccess", отключающий выполнение PHP-файлов через возврат обработчика по умолчанию ("SetHandler default-handler", "ForceType application/octet-stream").

Разработчик jQuery-File-Upload полагал, что на всех web-серверах всегда включена обработка ".htaccess" и активен модуль mod_headers. В обсуждении разработчик дополнения попытался оправдаться, что на момент написания плагина по умолчанию в Apache httpd для всех каталогов выставлялась опция "AllowOverride All", но начиная с выпуска 2.3.9 она была незаметно заменена на "AllowOverride None".

Но данное объяснение не выдерживает критики, так как ветка 2.3.x являлась тестовой и сама по себе не использовалась на практике, а выступала основой для формирования следующего значительной ветки Apache httpd 2.4, в которой указанное поведение было документировано и преподносилось как одно из изменений для повышения безопасности и производительности. Кроме того, решение о включении или отключении по умолчанию ".htaccess" всегда лежало на операторах хостинга и мэйнтейнерах пактов в дистрибутивах, поэтому и во времена до появления Apache httpd 2.4 нельзя было с уверенностью утверждать, что .htaccess везде будет работать.

За время своего существования плагин jQuery-File-Upload вошёл в состав сотен web-приложений и дополнений к системам управления web-контентом, и лишь единицы догадались ограничить список допустимых для загрузки файлов. В настоящее время на GitHub репозиторий jQuery-File-Upload насчитывает 7843 форков, проверка 1000 из которых показала, что лишь 36 содержат должные исправления, блокирующие уязвимость.

Судя по всему, проблема уже давно известна в кругах атакующих, так как в сети найдено несколько руководств, первое из которых датируется 2015 годом, с демонстрацией взломов тех или иных систем через загрузку php-файла в форме на сайте и последующего запроса этого файла из каталога "./files". Всем web-мастерам сайтов с формами загрузки на базе jQuery-File-Upload рекомендуется проверить наличие блокировки доступа к каталогу "./files" для внешних запросов и при необходимости внести изменения, отключающие выполнение PHP-скриптов в данной директории, на уровне настроек web-сервера.

  1. Главная ссылка к новости (https://blogs.akamai.com/sitr/...)
  2. OpenNews: Релиз новой стабильной ветки http-сервера Apache 2.4
  3. OpenNews: Вредоносное ПО организует майнинг криптовалют на серверах с незакрытыми уязвимостями
  4. OpenNews: Уязвимость, позволяющая удалённо выполнить код на сервере PHP-репозитория Packagist
  5. OpenNews: Около 390 тысяч сайтов оставили открытыми каталоги .git с кодом
  6. OpenNews: Зафиксирована массовая атака на сайты с необновлённым движком WordPress
Лицензия: CC-BY
Тип: Проблемы безопасности
Ключевые слова: php, security
При перепечатке указание ссылки на opennet.ru обязательно
Обсуждение Ajax/Линейный | Раскрыть все сообщения | RSS
 
  • 1.2, Jehy (?), 22:44, 23/10/2018 [ответить] [показать ветку] [···]    [к модератору]
  • +4 +/
    Удивительно одно - идиотизм людей, которые на полном серьёзе рассказывают эту школьную историю по всему интернету.
     
     
  • 2.14, Электрон мастдай (?), 02:15, 24/10/2018 [^] [ответить]    [к модератору]
  • –11 +/
    Удивительно одно - идиотизм людей, которые тянут js библиотеку на несколько мегабайт вместо того, чтобы написать одну строчку на html.
     
     
  • 3.25, Ононимко (?), 08:39, 24/10/2018 [^] [ответить]    [к модератору]
  • +3 +/
    Давай, г-ній JS, покажи-ка нам эту самую заветную одну строчку на html, функционально торжественную плагины.
     
     
  • 4.57, annual slayer (?), 04:30, 09/11/2018 [^] [ответить]    [к модератору]
  • +/
    плагины в функционально-торжественном стиле

    доступны также повседневные плагины и плагины выходного дня

     
  • 3.26, Аноним (26), 08:40, 24/10/2018 [^] [ответить]    [к модератору]
  • +4 +/
    И как же одной строчкой на html сделать закрузчик множественных файлов с индикатором?
     
     
  • 4.38, Аноним (38), 11:17, 24/10/2018 [^] [ответить]    [к модератору]  
  • –1 +/
    Множественные загрузки возможно, а «индикатором» будет браузер ¯\_(ツ)_/¯
     
     
  • 5.47, captcha 20168 (?), 12:36, 24/10/2018 [^] [ответить]    [к модератору]  
  • –1 +/
    действительно
    https://caniuse.com/#search=multiple
     
  • 3.27, Аноним (27), 09:03, 24/10/2018 [^] [ответить]    [к модератору]  
  • +3 +/
    > Удивительно одно - идиотизм людей, которые тянут js библиотеку на несколько мегабайт

    Дыра в примерах на php, python и go, а не в JS. Ты, кстати, свое коронное "вспомнити leftpaf" еще забыл.

     
  • 1.3, Григорий Федорович Конин (?), 22:49, 23/10/2018 [ответить] [показать ветку] [···]    [к модератору]  
  • +11 +/
    А при чем тут js-мирок, если виноваты во всём серверные обработчики?
     
     
  • 2.15, Аноним (15), 04:49, 24/10/2018 [^] [ответить]     [к модератору]  
  • –2 +/
    Похапешники Мы не виноваты Это JS-ребята психологически манипулировали нами и ... весь текст скрыт [показать]
     
     
  • 3.23, Аноним (23), 08:15, 24/10/2018 [^] [ответить]     [к модератору]  
  • +2 +/
    Это не жс и не пхпшники, это просто идиоты, писавшие код на стороне сервера В с... весь текст скрыт [показать]
     
     
  • 4.33, уебмакак (?), 10:00, 24/10/2018 [^] [ответить]     [к модератору]  
  • –1 +/
    это чего это вот файл Мы и круче умеем, учись, шкoльник str... весь текст скрыт [показать]
     
  • 1.6, Аноним (6), 23:05, 23/10/2018 [ответить] [показать ветку] [···]    [к модератору]  
  • +/
    Поэтому надо пользоваться CMS, в которых URL не маппится напрямую в часть древа ФС, а парсится с помощью dispatch rules, или как они там у кого называются.
     
     
  • 2.7, sdf (?), 23:10, 23/10/2018 [^] [ответить]    [к модератору]  
  • +/
    routes
     
  • 2.30, istepan (ok), 09:20, 24/10/2018 [^] [ответить]    [к модератору]  
  • +/
    Не CMS, а тупо файлы отдавать через Nginx как статику, без всяких php и т.п. обработчиков.
     
     
  • 3.43, уебмакак (?), 11:55, 24/10/2018 [^] [ответить]     [к модератору]  
  • +2 +/
    это слишком сложно для типового девляпсика, у него КПИ горят, git clone, ansible... весь текст скрыт [показать]
     
  • 1.8, Аноним (8), 23:15, 23/10/2018 [ответить] [показать ветку] [···]    [к модератору]  
  • +5 +/
    А с чего бы скрипту общего назначения что-то проверять по дефолту? Может ещё и сайт весь за разработчика написать?
     
     
  • 2.9, Аноним (9), 23:27, 23/10/2018 [^] [ответить]     [к модератору]  
  • –2 +/
    В конечном счёте фильтрами всё и исправили https github com blueimp jQuery-Fi... весь текст скрыт [показать]
     
     
  • 3.24, Аноним (23), 08:17, 24/10/2018 [^] [ответить]    [к модератору]  
  • +3 +/
    Выпал в осадок. Править в этом случае надо серверсайд.
     
  • 3.34, уебмакак (?), 10:05, 24/10/2018 [^] [ответить]     [к модератору]  
  • +4 +/
    ну вот, а вы ругались, что проблема в пехепе - видите же, автор все признал, пок... весь текст скрыт [показать]
     
  • 1.10, koblin_ (?), 23:31, 23/10/2018 [ответить] [показать ветку] [···]    [к модератору]  
  • +15 +/
    Это не забота плагина что-то фильтровать и почему он должен запрещать к загрузке какие-то типы файлов? Может пользователь хочет передать скрипт через шару. То что скрипты выполняются в директории для загрузки - это диагноз админу хоста.
    Проблема высосана
     
  • 1.11, Аноним (11), 00:17, 24/10/2018 [ответить] [показать ветку] [···]    [к модератору]  
  • +11 +/
    В молотке найдена поучительная уязвимость, показавшая беспечность изобретателя: можно ударить по пальцу или даже уронить его на ногу. По умолчанию молоток бьёт бойком по всему, что под него попадает, не различая гвоздь это или конечность идиота!
     
  • 1.12, Алконим (?), 00:23, 24/10/2018 [ответить] [показать ветку] [···]    [к модератору]  
  • +1 +/
    7843 форков? Кто все эти люди?
     
     
  • 2.39, КО (?), 11:19, 24/10/2018 [^] [ответить]    [к модератору]  
  • +/
    Вы исправление видели?
    + 'accept_file_types' => '/\.(gif|jpe?g|png)$/i',
    Теперь всем тем, кому нужен будет pdf, придется делать форк. :)
     
     
  • 3.42, трурль (?), 11:36, 24/10/2018 [^] [ответить]    [к модератору]  
  • +/
    Поясните, плиз, куда именно воткнули это «исправление»? В жс код, в пример жс кода или в пример серверного обработчика?
    Бред какой, что «уязвимость», что новость.
     
     
  • 4.44, уебмакак (?), 11:56, 24/10/2018 [^] [ответить]    [к модератору]  
  • +/
    в конфиг его воткнули, сюрпрайз.
     
  • 1.13, Sw00p aka Jerom (?), 00:32, 24/10/2018 [ответить] [показать ветку] [···]    [к модератору]  
  • +2 +/
    SECURITY FIX: Only allow image file types by default.

    смешно, превратили в jQuery-Image-Upload

     
     
  • 2.36, пох (?), 10:15, 24/10/2018 [^] [ответить]     [к модератору]  
  • +1 +/
    на самом деле - нет, что настроишь, то и upload - причем оно там всегда было, ... весь текст скрыт [показать]
     
  • 1.16, Игорь С. (?), 05:14, 24/10/2018 [ответить] [показать ветку] [···]    [к модератору]  
  • –1 +/
    В статье 0 про nginx с fpm, который тоже напрочь не слушает .htacces и как то без этого отлично безопасно работает. Лучше бы написали, что держать аплоадер без авторизации это плохо и все.
     
  • 1.17, anonymous (??), 05:56, 24/10/2018 [ответить] [показать ветку] [···]    [к модератору]  
  • +/
    files ? Хм. Ну так нужно специально сделать обработчик пути files для начала чтобы можно было так обратиться ...
     
  • 1.18, Аноним (18), 07:27, 24/10/2018 [ответить] [показать ветку] [···]    [к модератору]  
  • +/
    это косяк не разработчика плагина. больше тянет на разработчиков apache и может админов
     
     
  • 2.20, ну (?), 07:52, 24/10/2018 [^] [ответить]    [к модератору]  
  • +7 +/
    по результатам голосования среди админов и разработчиков было решено, что виноват только автор плагина.
     
     
  • 3.37, 1 (??), 11:07, 24/10/2018 [^] [ответить]    [к модератору]  
  • +/
    автор apache же ... Он так злокозненно заменил умолчание в 2.4
     
     
  • 4.45, пох (?), 12:02, 24/10/2018 [^] [ответить]     [к модератору]  
  • +/
    ну что авторы нынешнего апача совсем плохие п-сы, никто и не сомневается А вот ... весь текст скрыт [показать]
     
  • 1.21, Нанобот (ok), 07:58, 24/10/2018 [ответить] [показать ветку] [···]    [к модератору]  
  • +2 +/
    явная ошибка конфигурации веб-сервера, а крайним сделали разработчика плагина
     
     
  • 2.32, Аноним (15), 09:33, 24/10/2018 [^] [ответить]    [к модератору]  
  • –2 +/
    ты еще скажи, что электрон это круто. ЖС должен умерет
     
  • 1.22, Аноним (23), 08:13, 24/10/2018 [ответить] [показать ветку] [···]     [к модератору]  
  • +/
    Воистину, неискоренима тупость Какие фильтры Какие ошибки конфигурации Сохр... весь текст скрыт [показать]
     
     
  • 2.41, Аноним (38), 11:29, 24/10/2018 [^] [ответить]    [к модератору]  
  • +1 +/
    Шёл 21 век, ФС позволяла сохранять метаданные в себя…
     
     
  • 3.53, Аноним (53), 16:34, 25/10/2018 [^] [ответить]    [к модератору]  
  • +/
    Не надо метаданные в себя, ФС может оказаться разная.
     
     
  • 4.56, нах (?), 18:11, 25/10/2018 [^] [ответить]    [к модератору]  
  • +/
    > Не надо метаданные в себя, ФС может оказаться разная.

    давайте тогда и данные (вот все 48 мегапикселей фоточки салатика) сохранять в БД - "fs же может оказаться разная" (а не горе-девляпс, выбравший fs для хранения юзерских файлов, не умеющую хранить файлы, покидает нас в трех ботинках) - вдруг у нее размер файла три килобайта и ни байтом больше? А, и внутри файла могут быть только четные байты, а от нечетных она ломается.

     
  • 2.48, Аноним (48), 15:50, 24/10/2018 [^] [ответить]     [к модератору]  
  • –3 +/
    Да Интересно как это работает на высоко нагруженных серверах Что будет если ... весь текст скрыт [показать]
     
     
  • 3.54, Аноним (53), 16:35, 25/10/2018 [^] [ответить]     [к модератору]  
  • +/
    Будут два файла abcd0001 dat и abcd0002 dat, и две записи в БД Файл отдать можн... весь текст скрыт [показать]
     
     
  • 4.55, нах (?), 18:07, 25/10/2018 [^] [ответить]    [к модератору]  
  • +/
    > Будут два файла abcd0001.dat и abcd0002.dat, и две записи в БД.

    а если запись в бд по каким-то причинам пропала - мусор храним вечно, да?

    > Файл отдать можно например через mod_xsendfile, но с прослоечкой, которая подставит content-
    > disposition с нужным файлнеймом.

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

     
  • 1.28, ыы (?), 09:09, 24/10/2018 [ответить] [показать ветку] [···]    [к модератору]  
  • +/
    Количество интеллекта в мире- величина постоянная, а население растет... (с)

    Апач - не единственный веб-сервер на свете, и какая-то аргументация по поводу привязки плагина к .htaccess - просто абсурдна по сути. И со стороны автора и со стороны обвинителей.

    Что же до описания механизма уязвимости - то это какой-то паноптикум некомпетентности.

    Ждем продолжения :)

     
     
  • 2.50, пох (?), 22:25, 24/10/2018 [^] [ответить]    [к модератору]  
  • +/
    аффтар попытался подложить соломки, как умел, примерно предвидя уровень "админов", которые это будут настраивать.

    Но кунфу аффатаров апача оказалось круче, и они таки умудрились именно в тех местах, где гнездятся эти админы, поделить плохонькую защиту на ноль, безусловно, тоже ради заботы об альтернативно одаренных (всем остальным их поделка даром не нужна со времен убийства 1.3)

     
  • 2.52, Тот самый (?), 16:18, 25/10/2018 [^] [ответить]    [к модератору]  
  • +/
    >это какой-то паноптикум некомпетентности.

    Полностью согласен, особенно глядя на предлагаемые воркараунды

    По поводу идиотского ограничения загружать только image/*. Не удивлюсь если потом выяснится, что  в php включен fileinfo c libmagic и оно, увидев в начале .jpg файла волшебные строчки "<?php", проигнорирует расширение и замечательно отработает как php.

    Элементарное правило - отключение всех серверных хандлеров для каталогов, куда юзерам позволено загружать файло, не зависимо от расширения. Например, для Апача неужели сложно сделать
    <Directory "/uploads">
        php_flag engine off
        AllowOverride None
        Options None
        Require all granted
    </Directory>

    Либо в .htaccess
    php_flag engine off

     
  • 1.49, arisu (ok), 19:57, 24/10/2018 [ответить] [показать ветку] [···]    [к модератору]  
  • +/
    в тексте новости досадная ошибка: не «беспечность», а «…зм».
     
  • 1.58, annual slayer (?), 04:34, 09/11/2018 [ответить] [показать ветку] [···]    [к модератору]  
  • +/
    лихо говнокодеры всех дырявых пыхобэкендов попытались спрыгнуть, что фронтенд библиотека браузерная не проверяла тип файлов на опасность против их прелестного пыха
     

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


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