URL: https://www.opennet.ru/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID3
Нить номер: 115640
[ Назад ]

Исходное сообщение
"Неосмотрительное использование плагина jQuery-File-Upload де..."

Отправлено opennews , 23-Окт-18 22:40 
В плагине jQuery-File-Upload (https://github.com/blueimp/jQuery-File-Upload/) выявлена (https://blogs.akamai.com/sitr/2018/10/having-the-security-ru...) поучительная уязвимость CVE-2018-9206 (http://www.vapidlabs.com/advisory.php?v=204), показавшая удивительную беспечность web-разработчиков и web-администраторов. jQuery-плагин jQuery-File-Upload предоставляет функциональный web-виджет для организации загрузки файлов на сайты, поддерживающий групповую загрузку, индикатор прогресса и возобновление прерванных загрузок. Основная функциональность jQuery-File-Upload реализована на JavaScript и выполняется на стороне браузера, при этом в состав также входит набор примеров серверных обработчиков (https://github.com/blueimp/jQuery-File-Upload/tree/master/se...) для сохранения отправляемых файлов.


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


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


Разработчик jQuery-File-Upload почему-то полагал, что на всех web-серверах всегда включена обработка ".htaccess" и активен модуль mod_headers. В обсуждении разработчик дополнения попытался оправдаться (https://news.ycombinator.com/item?id=18267309), что на момент написания плагина по умолчанию в Apache httpd для всех каталогов выставлялась опция "AllowOverride All (https://httpd.apache.org/docs/2.2/en/mod/core.html#allowover...)", но начиная с выпуска  2.3.9 она была незаметно заменена на "AllowOverride None (https://httpd.apache.org/docs/2.4/en/mod/core.html#allowover...)".


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


За время своего существования плагин jQuery-File-Upload был вошёл (https://www.theregister.co.uk/2018/10/22/jquery_file_flaw/) в состав сотен  web-приложений и дополнений к системам управления web-контентом, и лишь единицы догадались ограничить список допустимых для загрузки файлов. В настоящее время на GitHub репозиторий jQuery-File-Upload насчитывает 7843 форков, проверка (https://github.com/lcashdol/Exploits/tree/master/CVE-2018-9206) 1000 из которых показала, что лишь 36 содержат должные исправления, блокирующие уязвимость.

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


URL: https://blogs.akamai.com/sitr/2018/10/having-the-security-ru...
Новость: https://www.opennet.ru/opennews/art.shtml?num=49483


Содержание

Сообщения в этом обсуждении
"Неосмотрительное использование плагина jQuery-File-Upload де..."
Отправлено Jehy , 23-Окт-18 22:44 
Удивительно одно - идиотизм людей, которые на полном серьёзе рассказывают эту школьную историю по всему интернету.

"Неосмотрительное использование плагина jQuery-File-Upload де..."
Отправлено Электрон мастдай , 24-Окт-18 02:15 
Удивительно одно - идиотизм людей, которые тянут js библиотеку на несколько мегабайт вместо того, чтобы написать одну строчку на html.

"Неосмотрительное использование плагина jQuery-File-Upload де..."
Отправлено Ононимко , 24-Окт-18 08:39 
Давай, г-ній JS, покажи-ка нам эту самую заветную одну строчку на html, функционально торжественную плагины.

"Неосмотрительное использование плагина jQuery-File-Upload де..."
Отправлено annual slayer , 09-Ноя-18 04:30 
плагины в функционально-торжественном стиле

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


"Неосмотрительное использование плагина jQuery-File-Upload де..."
Отправлено Аноним , 24-Окт-18 08:40 
И как же одной строчкой на html сделать закрузчик множественных файлов с индикатором?

"Неосмотрительное использование плагина jQuery-File-Upload де..."
Отправлено Аноним , 24-Окт-18 11:17 
Множественные загрузки возможно, а «индикатором» будет браузер ¯\_(ツ)_/¯

"Неосмотрительное использование плагина jQuery-File-Upload де..."
Отправлено captcha 20168 , 24-Окт-18 12:36 
действительно
https://caniuse.com/#search=multiple

"Неосмотрительное использование плагина jQuery-File-Upload де..."
Отправлено Аноним , 24-Окт-18 09:03 
> Удивительно одно - идиотизм людей, которые тянут js библиотеку на несколько мегабайт

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


"Неосмотрительное использование плагина jQuery-File-Upload де..."
Отправлено Григорий Федорович Конин , 23-Окт-18 22:49 
А при чем тут js-мирок, если виноваты во всём серверные обработчики?

"Неосмотрительное использование плагина jQuery-File-Upload де..."
Отправлено Аноним , 24-Окт-18 04:49 
Похапешники: Мы не виноваты! Это JS-ребята психологически манипулировали нами и подсунули нам уязвимый код в своей документации.

Опеннет: Похапешники не виноваты! Вспомнити leftpad. ОЧЕВИДНО, что проблема в JS. Необдуманное использование именно JS-плагина к JS-фреймворку с психологическим давлением на похапешников!


"Неосмотрительное использование плагина jQuery-File-Upload де..."
Отправлено Аноним , 24-Окт-18 08:15 
Это не жс и не пхпшники, это просто идиоты, писавшие код на стороне сервера. В следующий раз они на чём-нибудь другом сохранят пользовательский файл, как исполняемый модуль, в ветке исполнения. Антрастед юзер-инпут - не, не слышали.

"Неосмотрительное использование плагина jQuery-File-Upload де..."
Отправлено уебмакак , 24-Окт-18 10:00 
это чего это вот "файл"? Мы и круче умеем, учись, шкoльник:

                $strSql=
                        "SELECT ID, NAME, AGENT_INTERVAL, IS_PERIOD, MODULE_ID ".
                        "FROM b_agent ".
                        "WHERE ACTIVE='Y' ".
                        "       AND NEXT_EXEC<=now() ".
                        "       AND (DATE_CHECK IS NULL OR DATE_CHECK<=now()) ".
                        $str_crontab.
                        " ORDER BY SORT desc";

                $db_result_agents = $DB->Query($strSql);
[skip]
                        $eval_result = "";
                        eval("\$eval_result=".$arAgent["NAME"]);


(кто не понимает - весь прикол в том, что тут не должно лежать ничего, кроме заранее определенных функций, но парсить их имена и вызывать по ссылке, убедившись что вызываемое действительно существует - не, слишком сложно для обизяна - eval, даже без try, и всех делов! При попадании в таблицу мусора или троянского кода - сам понимаешь - и хрен его кто потом найдет)

завтра точно так же сложим в таблицу все что юзер навводил или ему навводили, и eval его.



"Неосмотрительное использование плагина jQuery-File-Upload де..."
Отправлено Аноним , 23-Окт-18 23:05 
Поэтому надо пользоваться CMS, в которых URL не маппится напрямую в часть древа ФС, а парсится с помощью dispatch rules, или как они там у кого называются.

"Неосмотрительное использование плагина jQuery-File-Upload де..."
Отправлено sdf , 23-Окт-18 23:10 
routes

"Неосмотрительное использование плагина jQuery-File-Upload де..."
Отправлено istepan , 24-Окт-18 09:20 
Не CMS, а тупо файлы отдавать через Nginx как статику, без всяких php и т.п. обработчиков.

"Неосмотрительное использование плагина jQuery-File-Upload де..."
Отправлено уебмакак , 24-Окт-18 11:55 
это слишком сложно для типового девляпсика, у него КПИ горят, git clone, ansible-playbook -f 10000 , ляп, ляп, ляп.

И практически невозможно для обычного юзера с недосайтиком на шареном помойкохостинге - он уже заплатил 500 рублей мне, за сайтик, и совсем не собирается платить еще 1500 в месяц за хостинг с нормальными настройками (да и кто настраивать будет? Мы-то могем в php, nodejs и еще вот, пихон. nginx - не могем)


"Неосмотрительное использование плагина jQuery-File-Upload де..."
Отправлено Аноним , 23-Окт-18 23:15 
А с чего бы скрипту общего назначения что-то проверять по дефолту? Может ещё и сайт весь за разработчика написать?

"Неосмотрительное использование плагина jQuery-File-Upload де..."
Отправлено Аноним , 23-Окт-18 23:27 
В конечном счёте фильтрами всё и исправили:

https://github.com/blueimp/jQuery-File-Upload/commit/ad4aefd...

+ 'accept_file_types' => '/\.(gif|jpe?g|png)$/i',

В добавок и замену точек в имени файлов добавили:

+         'replace_dots_in_filenames' => '-',
+        // Replace dots in filenames to avoid security issues with servers
+        // that interpret multiple file extensions, e.g. "example.php.png":


"Неосмотрительное использование плагина jQuery-File-Upload де..."
Отправлено Аноним , 24-Окт-18 08:17 
Выпал в осадок. Править в этом случае надо серверсайд.

"Неосмотрительное использование плагина jQuery-File-Upload де..."
Отправлено уебмакак , 24-Окт-18 10:05 
ну вот, а вы ругались, что проблема в пехепе - видите же, автор все признал, покаялся перед партией и товарищами по цеху, и исправ...изуродовал свой скрипт так, чтобы альтернативно-одаренным жить стало проще. Странно, действительно, что не переименовал его в "jquery-jpsosmth-png-and-gif-only-upload".

то есть если даже и не во всем виноват js, то разработчики на нем - все равно *даки, как ни поверни.


"Неосмотрительное использование плагина jQuery-File-Upload де..."
Отправлено koblin_ , 23-Окт-18 23:31 
Это не забота плагина что-то фильтровать и почему он должен запрещать к загрузке какие-то типы файлов? Может пользователь хочет передать скрипт через шару. То что скрипты выполняются в директории для загрузки - это диагноз админу хоста.
Проблема высосана

"Неосмотрительное использование плагина jQuery-File-Upload де..."
Отправлено mihacoder , 21-Янв-19 12:02 
Точно. Считаю, что тот, кто ставит плагин к себе на сайт, и должен думать об этом. С другой стороны, разработчик плагина мог бы в документации указать на эту возможную опасность.

"Неосмотрительное использование плагина jQuery-File-Upload де..."
Отправлено Аноним , 24-Окт-18 00:17 
В молотке найдена поучительная уязвимость, показавшая беспечность изобретателя: можно ударить по пальцу или даже уронить его на ногу. По умолчанию молоток бьёт бойком по всему, что под него попадает, не различая гвоздь это или конечность идиота!

"Неосмотрительное использование плагина jQuery-File-Upload де..."
Отправлено Алконим , 24-Окт-18 00:23 
7843 форков? Кто все эти люди?

"Неосмотрительное использование плагина jQuery-File-Upload де..."
Отправлено КО , 24-Окт-18 11:19 
Вы исправление видели?
+ 'accept_file_types' => '/\.(gif|jpe?g|png)$/i',
Теперь всем тем, кому нужен будет pdf, придется делать форк. :)

"(с мобилки в гит смотреть неудобно)"
Отправлено трурль , 24-Окт-18 11:36 
Поясните, плиз, куда именно воткнули это «исправление»? В жс код, в пример жс кода или в пример серверного обработчика?
Бред какой, что «уязвимость», что новость.

"(с мобилки в гит смотреть неудобно)"
Отправлено уебмакак , 24-Окт-18 11:56 
в конфиг его воткнули, сюрпрайз.

"Неосмотрительное использование плагина jQuery-File-Upload де..."
Отправлено Sw00p aka Jerom , 24-Окт-18 00:32 
SECURITY FIX: Only allow image file types by default.

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


"Неосмотрительное использование плагина jQuery-File-Upload де..."
Отправлено пох , 24-Окт-18 10:15 
> смешно, превратили в jQuery-Image-Upload

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

Что говорит в пользу автора, #дак бы добавил антифильтр с .php, .php5, .php7, а потом "ой, а тут подсунули .py"
Но вот трансляцию надо было сделать нормально, а не . на - менять.


вообще-то хороший плагин, надо брать.


"Nginx"
Отправлено Игорь С. , 24-Окт-18 05:14 
В статье 0 про nginx с fpm, который тоже напрочь не слушает .htacces и как то без этого отлично безопасно работает. Лучше бы написали, что держать аплоадер без авторизации это плохо и все.

"Неосмотрительное использование плагина jQuery-File-Upload де..."
Отправлено anonymous , 24-Окт-18 05:56 
files ? Хм. Ну так нужно специально сделать обработчик пути files для начала чтобы можно было так обратиться ...

"Неосмотрительное использование плагина jQuery-File-Upload де..."
Отправлено Аноним , 24-Окт-18 07:27 
это косяк не разработчика плагина. больше тянет на разработчиков apache и может админов

"Неосмотрительное использование плагина jQuery-File-Upload де..."
Отправлено ну , 24-Окт-18 07:52 
по результатам голосования среди админов и разработчиков было решено, что виноват только автор плагина.

"Неосмотрительное использование плагина jQuery-File-Upload де..."
Отправлено 1 , 24-Окт-18 11:07 
автор apache же ... Он так злокозненно заменил умолчание в 2.4

"Неосмотрительное использование плагина jQuery-File-Upload де..."
Отправлено пох , 24-Окт-18 12:02 
> автор apache же ... Он так злокозненно заменил умолчание в 2.4

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

(там прикол что None, которое  нынче ваш новый стандарт, вообще отключает чтение htaccess - то есть ошибку не выдает, а просто молча его игнорирует)



"Неосмотрительное использование плагина jQuery-File-Upload де..."
Отправлено Нанобот , 24-Окт-18 07:58 
явная ошибка конфигурации веб-сервера, а крайним сделали разработчика плагина

"Неосмотрительное использование плагина jQuery-File-Upload де..."
Отправлено Аноним , 24-Окт-18 09:33 
ты еще скажи, что электрон это круто. ЖС должен умерет

"Неосмотрительное использование плагина jQuery-File-Upload де..."
Отправлено Аноним , 24-Окт-18 08:13 
> загружаемые файлы сохранялись на сервере под исходными именами

Воистину, неискоренима тупость... Какие фильтры? Какие ошибки конфигурации?

Сохранять пользовательские файлы под внутренним именем и делать связывание с пользовательским именем через БД или файл метаданных школоту так и не научили.


"Неосмотрительное использование плагина jQuery-File-Upload де..."
Отправлено Аноним , 24-Окт-18 11:29 
Шёл 21 век, ФС позволяла сохранять метаданные в себя…

"Неосмотрительное использование плагина jQuery-File-Upload де..."
Отправлено Аноним , 25-Окт-18 16:34 
Не надо метаданные в себя, ФС может оказаться разная.

"Неосмотрительное использование плагина jQuery-File-Upload де..."
Отправлено нах , 25-Окт-18 18:11 
> Не надо метаданные в себя, ФС может оказаться разная.

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


"Неосмотрительное использование плагина jQuery-File-Upload де..."
Отправлено Аноним , 24-Окт-18 15:50 
>> загружаемые файлы сохранялись на сервере под исходными именами
> Воистину, неискоренима тупость... Какие фильтры? Какие ошибки конфигурации?
> Сохранять пользовательские файлы под внутренним именем и делать связывание с пользовательским
> именем через БД или файл метаданных школоту так и не научили.

Да ;) Интересно как это работает на высоко нагруженных серверах? Что будет если два пользователя одновременно захотят сохранить файл "Noname.txt"?
А если пользователь "Аноним", то видимо необходимо "Сохранять пользовательские файлы под внутренним именем и делать связывание с пользовательским именем через БД или файл метаданных". Ну а если он вообще, среднестатистический "Аноним" без "печенек", то видимо можно по session_id (и что, по выходу времени сессии удалять это содержимое, а то как и главное кто сможет к этому содержимому позже обратится?).



"Неосмотрительное использование плагина jQuery-File-Upload де..."
Отправлено Аноним , 25-Окт-18 16:35 
> Да ;) Интересно как это работает на высоко нагруженных серверах? Что будет если два пользователя одновременно захотят сохранить файл "Noname.txt"?

Будут два файла abcd0001.dat и abcd0002.dat, и две записи в БД.

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


"Неосмотрительное использование плагина jQuery-File-Upload де..."
Отправлено нах , 25-Окт-18 18:07 
> Будут два файла abcd0001.dat и abcd0002.dat, и две записи в БД.

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

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

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


"Неосмотрительное использование плагина jQuery-File-Upload де..."
Отправлено ыы , 24-Окт-18 09:09 
Количество интеллекта в мире- величина постоянная, а население растет... (с)

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

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

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


"Неосмотрительное использование плагина jQuery-File-Upload де..."
Отправлено пох , 24-Окт-18 22:25 
аффтар попытался подложить соломки, как умел, примерно предвидя уровень "админов", которые это будут настраивать.

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


"Неосмотрительное использование плагина jQuery-File-Upload де..."
Отправлено Тот самый , 25-Окт-18 16:18 
>это какой-то паноптикум некомпетентности.

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

По поводу идиотского ограничения загружать только 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


"Неосмотрительное использование плагина..."
Отправлено arisu , 24-Окт-18 19:57 
в тексте новости досадная ошибка: не «беспечность», а «…зм».

"Неосмотрительное использование плагина jQuery-File-Upload де..."
Отправлено annual slayer , 09-Ноя-18 04:34 
лихо говнокодеры всех дырявых пыхобэкендов попытались спрыгнуть, что фронтенд библиотека браузерная не проверяла тип файлов на опасность против их прелестного пыха