Skip to content
KitploitKITPLOIT
ИнструментыБлог
Отправить
ИнструментыБлог
Отправить

Инструменты для хакинга, пентеста и кибербезопасности — ваш арсенал защиты!

Kitploit — это каталог инструментов для хакинга, кибербезопасности и пентестинга. Находите последние обновления проектов для поиска уязвимостей, анализа систем, автоматизации тестирования и усиления вашей безопасности.

··Ленты·Контакты·Конфиденциальность·© 2026 Kitploit

Каталог инструментов

Категории

Все категории
Loading categories
CVE-2026-38360 — Уведомление: CVE-2026-38360 — обход пути (CWE-22) в dash-uploader (Python/PyPI) | Kitploit
Инструменты/GitHubGitHub/a1ohadance/cve-2026-38360
Анализ уязвимостейАнализ КодаЭксплуатацияВеб-безопасностьТестирование на ПроникновениеОбучение и Образование
GitHuba1ohadance/cve-2026-38360

CVE-2026-38360

Уведомление: CVE-2026-38360 — обход пути (CWE-22) в dash-uploader (Python/PyPI)

Репозиторий
234 месяцев назадЕщё не проверено

Популярное

Смотреть все →

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

Изучить все инструменты

Просмотрите нашу коллекцию инструментов

Смотреть все инструменты →
Поделиться

CVE-2026-38360: Обход пути в dash-uploader

CVE NVD CWE Severity Patch Auth Version PyPI Downloads

Total Downloads
License

Неаутентифицированный обход пути в fohrloop/dash-uploader (Python, PyPI), позволяющий произвольную запись файлов и приводящий, помимо прочего, к удалённому выполнению кода (RCE), перезаписи исходного кода приложения, хранимому XSS и установке постоянного бэкдора.

⚠️ Патч недоступен и никогда не будет выпущен

Репозиторий был архивирован 2025-07-19, активного мейнтейнера нет. Все опубликованные версии (с 0.1.0 по 0.7.0a2) уязвимы и останутся таковыми. Пакет по-прежнему скачивается примерно 28 000 раз в месяц.

Каждому, кто использует dash-uploader в продакшене, необходимо самостоятельно применить меры по смягчению уязвимости. Рекомендуемое решение — перейти на встроенный компонент dcc.Upload из Plotly Dash. Полный список вариантов см. в разделе Меры по смягчению.

Идентификатор CVECVE-2026-38360 (NVD)
УязвимостьОбход пути (CWE-22)
CVSS 3.19.8 / Критический (AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H)
Продуктdash-uploader
Затронутые версии0.1.0 – 0.7.0a2 (все 18 релизов)
Исправленная версияотсутствует (проект архивирован 2025-07-19)
Вектор атакиУдалённый, без аутентификации
ОбнаружилMuhammad Fitri Bin Mohd Sultan
ПрисвоенMITRE, 2026-05-07
СвязанныеCVE-2026-38361 (DoS в той же библиотеке)

Описание

Три управляемых пользователем параметра из request.form.get() в dash_uploader/httprequesthandler.py передаются напрямую в os.path.join() и os.makedirs() без какой-либо очистки или проверки:

  1. upload_id (строки 57 → 161, BaseHttpRequestHandler.get_temp_root): управляет целевым каталогом. Атакующий может отправить upload_id=../../../../usr/local/lib/python3.10/site-packages, и файлы будут записаны в каталог пакетов Python.

  2. resumableFilename (строки 51 → 108, BaseHttpRequestHandler._post): управляет итоговым именем файла. Атакующий может выйти за пределы каталога загрузки через имя файла даже при легитимном upload_id.

  3. resumableIdentifier (строки 54 → 64, BaseHttpRequestHandler._post): используется с os.makedirs() для создания временного каталога. Атакующий может создавать произвольные каталоги в любом месте файловой системы.

Конечная точка загрузки (по умолчанию /API/dash-uploader) не требует аутентификации. Хук http_request_handler, добавленный в v0.5.0, позволяет выполнять проверки перед запросом через post_before(), но уязвимый метод _post() читает все параметры напрямую из request.form после возврата из хука. Хук не может очистить параметры до того, как библиотека их обработает. Разработчик, добавивший аутентификацию через хук, по-прежнему уязвим к обходу пути со стороны аутентифицированного пользователя.

Уязвимый код

root@kitploit:~
# dash_uploader/httprequesthandler.py
def _post(self):
    resumableFilename = request.form.get("resumableFilename", default="error", type=str)
    resumableIdentifier = request.form.get("resumableIdentifier", default="error", type=str)
    upload_id = request.form.get("upload_id", default="", type=str)
    ...
    temp_root = self.get_temp_root(upload_id)                          # upload_id flows in here
    temp_dir = os.path.join(temp_root, resumableIdentifier)            # raw user input -> os.path.join
    if not os.path.isdir(temp_dir):
        os.makedirs(temp_dir)                                          # raw user input -> os.makedirs

def get_temp_root(self, upload_id):
    return os.path.join(self.upload_folder, upload_id)                 # no sanitization: ../../ escapes upload_folder

Три независимых небезопасных места (sink) имеют одну и ту же первопричину: значения формы достигают os.path.join и os.makedirs без проверки.

Векторы атаки

Неаутентифицированный удалённый атакующий отправляет HTTP POST multipart-запрос на конечную точку загрузки. Внедряя последовательности обхода пути (../) в параметр формы upload_id, атакующий получает контроль над целевым каталогом для загружаемого файла. Например, upload_id=../../../../usr/local/lib/python3.10/site-packages записывает файлы в каталог пакетов Python, что позволяет выполнить код (RCE) при следующем запуске интерпретатора за счёт автоматического выполнения .pth.

Ни аутентификация, ни сессионный токен, ни CSRF-токен не требуются. Два дополнительных параметра (resumableFilename и resumableIdentifier) предоставляют независимые векторы обхода через ту же конечную точку. Конфигурация библиотеки по умолчанию, показанная в официальной документации quickstart, эксплуатируется одной командой curl.

Воздействие

Произвольная запись файлов в любой каталог, доступный для записи процессу сервера. Это приводит к удалённому выполнению кода (RCE) с помощью нескольких хорошо известных примитивов:

Примитивы RCE

  • Файл Python .pth, записанный в site-packages. Выполняет код, предоставленный атакующим, при следующем запуске интерпретатора.
  • Внедрение sitecustomize.py или usercustomize.py. Выполняется при каждом запуске Python.
  • Перезапись импортируемого Python-модуля в каталоге пакетов приложения. Выполняется при следующем импорте или перезапуске воркера.
  • Перезапись точки входа WSGI/ASGI (например, app.wsgi, wsgi.py). Выполняется при следующей перезагрузке воркера.
  • Drop-in-файл cron (/etc/cron.d/, /etc/cron.hourly/, пользовательский crontab-spool) при наличии у процесса необходимых привилегий. Выполнение по расписанию.
  • Drop-in-файл systemd или пользовательского юнита (/etc/systemd/system/, ~/.config/systemd/user/). Выполняется при следующем запуске службы или перезагрузке.
  • Внедрение в /etc/ld.so.preload, если процесс запущен от root. Предзагружает код атакующего при каждом последующем выполнении бинарных файлов.
  • Перезапись стартового файла оболочки (~/.bashrc, ~/.profile, ~/.bash_profile). Выполняется при следующем интерактивном входе пользователя приложения.
  • Добавление записи в ~/.ssh/authorized_keys. Предоставляет постоянный SSH-доступ к хосту от имени пользователя приложения.

Воздействие на веб-уровень

  • Хранимый межсайтовый скриптинг (XSS) в домене хоста путём перезаписи отдаваемого JavaScript (например, JS-файлов фреймворка Dash в site-packages). Затрагивает каждого пользователя при каждой загрузке страницы до перезапуска приложения.
  • Перезапись исходного кода приложения (тихий постоянный бэкдор, который переживает обычные деплои, если механизм развёртывания не полностью перезаписывает затронутые пути).

Воздействие на файловую систему

  • Создание произвольных каталогов в любом месте, доступном процессу, через os.makedirs() с неочищенным параметром resumableIdentifier (можно использовать для исчерпания inode или для поэтапной записи в несуществующие ветви каталогов).
  • Замена файлов других пользователей в общих каталогах загрузки, что приводит к отравлению данных между арендаторами одного приложения.

Затронутый компонент

  • dash_uploader/httprequesthandler.py
  • BaseHttpRequestHandler.get_temp_root()
  • BaseHttpRequestHandler._post()

Меры по смягчению

⚠️ Патча нет, а проект архивирован

Варианты для пользователей, у которых уже развёрнут этот пакет, в порядке предпочтения:

  1. Перейдите на dcc.Upload — официальный компонент загрузки, поставляемый с Plotly Dash. Файлы приходят в callback в виде base64-строки; обработчик, записывающий в файловую систему, не предоставляется, и путь назначения не контролируется клиентом, поэтому данный класс ошибок здесь неприменим. Лучше всего подходит для небольших и средних файлов. Для очень больших загрузок см. пункт 2.
  2. Реализуйте небольшой обработчик загрузки на Flask, используя werkzeug.utils.secure_filename() и жёстко заданный серверный каталог назначения. Никогда не принимайте значения upload_id, имени файла или идентификатора, предоставленные клиентом, как компоненты пути.
  3. Если вы продолжаете использовать dash-uploader, поместите конечную точку загрузки за аутентификацией И проверяйте upload_id, resumableFilename и resumableIdentifier по строгому списку разрешённых значений (например, только UUID) на уровне, который переписывает или отклоняет запрос до того, как его увидит обработчик библиотеки. Хук http_request_handler библиотеки НЕ предотвращает обход пути, поскольку параметры читаются из request.form уже после возврата из хука; очистка должна выполняться выше библиотеки.
  4. На уровне обратного прокси или WAF отклоняйте любые запросы к конечной точке загрузки, в которых какое-либо поле формы содержит .., закодированные варианты (%2e%2e, ..%2f, %2e%2e%2f) или абсолютные пути.

Хронология раскрытия

ДатаСобытие
2026-03-17Уязвимость обнаружена в ходе исследования безопасности продакшен-развёртывания.
2026-03-19Запрос на получение CVE отправлен в MITRE.
2026-05-07MITRE присвоил CVE-2026-38360.
2026-05-07Опубликован публичный бюллетень (advisory).
2026-05-09Запись CVE опубликована в базе CVE MITRE и в NVD.

Контекст пакета

  • Примерно 28 000 загрузок в месяц на PyPI (27 756 за 30 дней до 2026-05-07, с устойчивым ежедневным объёмом, несмотря на архивацию репозитория). Источник: pypistats.org.
  • Последняя опубликованная версия: 0.6.1 (стабильная линия). Пререлизы доходят до 0.7.0a2.
  • Обязательная зависимость: dash. Необязательная зависимость: pyyaml. Лицензия: MIT.
  • 11 зависимых пакетов, 6 зависимых репозиториев.
  • 153 звезды на GitHub.
  • Репозиторий архивирован 2025-07-19 (Issue #153).
  • Ранее CVE не присваивались (проверено по NVD, GitHub Advisory Database, Snyk, OSV 2026-03-19).

Ссылки

  • https://www.cve.org/CVERecord?id=CVE-2026-38360
  • https://nvd.nist.gov/vuln/detail/CVE-2026-38360
  • https://github.com/fohrloop/dash-uploader
  • https://pypi.org/project/dash-uploader/
  • https://pypistats.org/packages/dash-uploader
  • https://github.com/fohrloop/dash-uploader/blob/stable/dash_uploader/httprequesthandler.py
  • https://github.com/fohrloop/dash-uploader/blob/dev/dash_uploader/httprequesthandler.py
  • https://github.com/fohrloop/dash-uploader/issues/153
  • https://cwe.mitre.org/data/definitions/22.html

Обнаружил

Muhammad Fitri Bin Mohd Sultan

Скачать инструмент