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

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

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

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

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

Категории

Все категории
Loading categories
CVE-2026-42089 — Локальный помощник установки пакетов слишком доверял именам пакетов, передаваемым вызывающей стороной. В yeoman-environment отсутствующие генераторы могли устанавливаться без подтверждения пользователя, превращая управляемые атакующим метаданные проекта в путь установки пакета и выполнения кода. | Kitploit
Инструменты/GitHubGitHub/0xmrma/cve-2026-42089
Анализ уязвимостейАнализ КодаЭксплуатацияБезопасность Цепочки ПоставокСтатьи и ИсследованияОбучение и Образование
GitHub0xmrma/cve-2026-42089

CVE-2026-42089

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

Популярное

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

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

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

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

Смотреть все инструменты →

Описание

Локальный помощник установки пакетов слишком доверял именам пакетов, передаваемым вызывающей стороной. В yeoman-environment отсутствующие генераторы могли устанавливаться без подтверждения пользователя, превращая управляемые атакующим метаданные проекта в путь установки пакета и выполнения кода.

Поделиться

CVE-2026-42089

Локальный помощник установки пакетов слишком доверял именам пакетов, предоставленным вызывающей стороной. В yeoman-environment отсутствующие генераторы могли быть установлены без подтверждения пользователя, превращая управляемые атакующим метаданные проекта в путь установки пакетов и выполнения кода.

Введение

Я обнаружил эту проблему при проверке generator-jhipster с простым вопросом безопасности:

Могут ли управляемые атакующим метаданные проекта заставить инструмент разработчика загрузить и выполнить сторонний код до того, как пользователь явно запросил это?

В данном случае ответ был «да».

То, что изначально выглядело как проблема JHipster, оказалось глубокой первопричиной в yeoman-environment.

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

Эта проблема стала CVE-2026-42089.

yeoman-environment: yeoman-environment на GitHub
Пакет: yeoman-environment (npm)
CVE: CVE-2026-42089

Это затронуло yeoman-environment — слой выполнения, лежащий в основе загрузки и начальной загрузки генераторов Yeoman. Официальный проект описывает его как компонент, управляющий жизненным циклом и обнаружением генераторов, и по состоянию на 26 июня 2026 г. на странице пакета npm значилось 1 466 426 еженедельных загрузок, что делает этот пакет широко распространённым в экосистеме инструментов JavaScript.

photo0

Цепочка атаки

конфигурация проекта, управляемая атакующим -> имена пакетов генераторов, предоставленные вызывающей стороной -> yeoman-environment молча устанавливает отсутствующие пакеты -> потребитель загружает установленный код генератора -> установка пакетов и выполнение кода во время начальной загрузки CLI


Что делает yeoman-environment

yeoman-environment — это среда выполнения и слой загрузки генераторов, лежащий в основе инструментов на базе Yeoman.

Среди прочего он обрабатывает:

  • поиск генераторов
  • управление локальным репозиторием
  • установку пакетов для отсутствующих генераторов
  • регистрацию и загрузку генераторов

То есть он находится прямо на границе доверия.

Соответствующий вопрос не в том, является ли Yeoman «просто локальным инструментом».

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

В данном случае — мог.


Почему эта поверхность стоила внимания

Я не искал здесь повреждения памяти или ошибки только с аварийным завершением.

Более сильной целью была поверхность расширения и разрешения пакетов.

Любая система, которая:

  • принимает имена пакетов от другого слоя,
  • устанавливает их автоматически,
  • а затем делает их доступными для загрузки,

заслуживает пристального внимания.

Это особенно верно, когда потребитель может извлекать эти имена пакетов из локальных данных проекта.

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

Там и следовало искать.


Граница, на которой я сосредоточился

Сначала я воспроизвел поведение через generator-jhipster.

Важный путь был таким:

  • локальный файл .yo-rc.json проекта объявляет пакет blueprint
  • JHipster считывает эту запись blueprint при начальной загрузке CLI
  • отсутствующие пакеты blueprint передаются в путь установки Yeoman
  • Yeoman устанавливает их молча
  • последующий код импортирует модули CLI blueprint

Это означало, что даже такая безобидная команда, как:

jhipster --help

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

Это реальный сбой границы доверия.

Триггер со стороны потребителя помог выявить это, но небезопасное поведение по умолчанию было в Yeoman.


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

Ошибка была простой.

В yeoman-environment уязвимый метод выглядел так:

async installLocalGenerators(packages) {
    const entries = Object.entries(packages);
    const specs = entries.map(([packageName, version]) => `${packageName}${version ? `@${version}` : ''}`);
    const installResult = await this.repository.install(specs);
    const failToInstall = installResult.find(result => !result.path);
    if (failToInstall) {
        throw new Error(`Fail to install ${failToInstall.pkgid}`);
    }
    await this.lookup({ packagePaths: installResult.map(result => result.path) });
    return true;
}

Этот метод устанавливал имена пакетов, предоставленные вызывающей стороной, напрямую через:

this.repository.install(specs)

без предварительного запроса пользователя.

Это и есть основная уязвимость.

Почему это эксплуатируемо

Потому что имена пакетов не обязательно поступают из доверенного источника.

Если потребитель извлекает их из управляемых атакующим метаданных проекта, цепочка эксплуатации становится прямой:

  • атакующий косвенно управляет именами пакетов
  • потребитель передает их в Yeoman
  • Yeoman устанавливает их молча
  • последующий код продолжает работу с новым установленным пакетом, доступным для загрузки

Это не просто «установка пакета произошла».

Это недоверенный ввод, пересекающий границу установки пакетов без явного согласия.


Что делает это проблемой безопасности, а не просто поведением инструмента

Важное различие — молчаливая установка из недоверенного ввода.

Есть реальная разница между:

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

Это различие становится ещё более важным, когда пакет становится загружаемым сразу после этого.

Проблема была не в том, что существуют сторонние генераторы.

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

Это делает небезопасные предположения доверия у потребителей материально хуже.

Именно поэтому исправление добавило шлюз подтверждения.


PoC

Я использовал два уровня доказательств, потому что они демонстрируют как первопричину, так и реальное влияние на потребителя.

PoC 1: стандартный триггер потребителя

Первое доказательство использовало немодифицированный generator-jhipster.

Я создал проект с корневым .yo-rc.json, который ссылался на пакет blueprint, ещё не установленный, а затем выполнил:

jhipster --help

Это заставило JHipster передать отсутствующий blueprint в поток локальной установки генераторов Yeoman до завершения справки.

Важный результат:

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

Это чётко установило реальное условие срабатывания.

PoC 2: контролируемый путь выполнения пакета

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

Это было важно, потому что я хотел показать более сильную историю:

  • локальные метаданные проекта влияют на выбор пакета
  • Yeoman устанавливает пакет молча
  • последующий код загружает установленные модули CLI blueprint
  • выполнение кода становится достижимым во время начальной загрузки

Это была самая сильная цепочка доказательств, поскольку она вывела проблему за рамки:

«неожиданная попытка установки»

и перешла к:

«установка плюс последующий путь загрузки кода действительно достижимы»

Это та точка, где сбой границы доверия становится гораздо труднее игнорировать.


Почему PoC были выбраны именно так

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