Я посетил встречу Messaging, Malware and Mobile Anti-Abuse Working Group (m3aawg.org) в Бруклине, Нью-Йорк. Я ожидал лучшей погоды, чтобы побродить по городу, насладиться конференцией, и широким выбором еды на районе. Я настолько был уверен в ясности неба, что даже не взял с собой ничего от дождя. И всю неделю шел дождь. Это вынудило меня оставаться в моем номере в отеле с бесплатным WiFi и моим рабочим ноутбуком. Я решил потратить это время за исследованием Node.js и их сопутствующих пакетов, доступных на https://www.npmjs.com.
Там есть тысячи пакетов от пользователей, доступные для скачивания и установки в ваш проект. Я поискал в NPM по популярным названиям пакетов, таких как file, backup, download, или upload. Последний поисковый запрос показал мне проект под названием jQuery file upload от пользователя Blueimp. Его описание показалось достаточно интересным, чтобы скачать и исследовать его.
Виджет загрузки файлов для jQuery, с поддержкой выбора нескольких файлов, drag & drop, индикатора прогресса, валидации и предпросмотра изображений, аудио и видео. Поддерживает кросс-доменные запросы, частичный и возобновляемый механизм загрузки файлов с ресайзом изображений на клиентской стороне. Работает в любой серверной платформой (PHP, Python, Ruby on Rails, Java, Node.js, Go и т.д.), которая поддерживает стандартную загрузку файлов через HTML-форму.
Я начал смотреть на исходники пакета и остановил свое внимание на паре PHP-файлов в директории server/php. Файлы назывались upload.php и UploadHandler.php. upload.php вызывал UploadHandler.php, где находился основной код загрузки файлов. Я также заметил, что файлы загружались в директорию files/ в корне веб-сервера. Я написал простую команду с curl и примитивным PHP-скриптом, которые подтвердили мне, что я могу загрузить файл на сервер и затем использовать его, чтобы исполнять команды на сервере.
$ curl -F "files=@shell.php" http://example.com/jQuery-File-Upload-9.22.0/server/php/index.php
Где файл shell.php содержит:
<?php $cmd=$_GET['cmd']; system($cmd);?>
Открытие в браузере страницы с параметром cmd=id с тестового сервера вернуло мне id пользователя, от которого запускался процесс сервера. Я предположил, что эта уязвимость не прошла незамеченной и быстрый поиск в Google подтвердил мне, что другие проекты, которые использовали этот код или его производные, оказались уязвимы. Нашлось также и несколько видео, показывающих как атаковать похожие программные пакеты.
Я уведомил автора jQuery File Upload и начал документировать то, что я нашел, для присвоения номера CVE. Вскоре на следующий день несколько смущенный автор ответил мне, спрашивая больше информации, так как он не смог воспроизвести уязвимость в своем тестовом окружении.
После сравнения наших тестовых конфигураций по email, мы обнаружили, что разработчики Apache выключили поддержку .htaccess файлов начиная с версии 2.3.9. Оказывается, это было сделано для улучшения производительности, чтобы серверу не приходилось проверять этот файл каждый раз, когда он обращается к соответствующей директории. Более того, это изменение также было сделано для предотвращения переопределения пользователями настроек безопасности, которые были сконфигурированы на сервере.
Таким образом, Apache имели благие намерения при отключении .htaccess, но их изменения также подставили некоторых разработчиков и их проекты под удар, в частности, если они рассчитывали на настройки безопасности, сделанные в .htaccess.
В случае этой библиотеки, для правильной обработки этой ситуации и исправления уязвимости загрузки файлов CVE-2018-9206, разработчик изменил код так, чтобы он разрешал загружать только файлы изображений.
Эта проблема больше, чем одного проекта
Здесь также стоит заметить, что из-за изменений в Apache, часть из 7,800 остальных проектов могут быть уязвимы к проблеме с загрузкой файлов.
Большинство из этих форков все еще несут оригинальную уязвимость в своем коде. В некоторых случаях уязвимость остается даже после того, как разработчик отредактировал оригинальный код от Blueimp чтобы встроить его в свой проект, так что проекты все еще уязвимы к моему примеру атаки с небольшими вариациями.
Это значит, что если какой-то из этих проектов используется в продакшене, то он подвержен уязвимости загрузки файла с его последующим исполнением. Открывая возможности для кражи данных из приложения, инжекции malware, дефейсу и другим возможностям навредить.
К сожалению, нет возможности точно определить, сколько проектов, форкнутых от оригинального jQuery File Upload все еще активно поддерживаются и применяют изменения, сделанные в основном проекте. Также нет возможности определить, где именно форкнутые проекты используются в продакшене, если такие есть. Более того, старые версии проекта также были уязвимы для проблемы с загрузкой файлов, вплоть до 2010 года.
Заключение
Интернет опирается на множество механизмов защиты, чтобы держать наши системы, данные и транзакции в надежности и безопасности. Если один из этих механизмов внезапно пропадет, это может подвергнуть риску безопасность пользователей и разработчиков, рассчитывающих на него.
Для разработчиков будет хорошей идеей просматривать изменения в системах и библиотеках, на которых они базируют свой проект. В этой статье механизм безопасности, который удалили Apache, повлиял не только на Blueimp-овский Jquery file upload, но и на все его форки и ответвления. Уязвимость повлияла на множество проектов, которые зависят от него, начиная от самостоятельных веб-приложений и заканчивая плагинами к WordPress и другим CMS.
Комментариев нет:
Отправить комментарий