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

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

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

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

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

Категории

Все категории
Loading categories
CVE-2026-40176 — Дифференциальный proof-of-concept для CVE-2026-40176, демонстрирующий внедрение команд ОС в драйвер Perforce в Composer через вредоносный URL-адрес репозитория, с автоматическим A/B-тестированием против уязвимых и исправленных версий. | Kitploit
Инструменты/GitHubGitHub/ikarolaborda/cve-2026-40176
Анализ уязвимостейЭксплуатацияЭксплуатация веб-приложенийТестирование на ПроникновениеКомандование и УправлениеОбучение и Образование
GitHubikarolaborda/cve-2026-40176

CVE-2026-40176

Дифференциальный proof-of-concept для CVE-2026-40176, демонстрирующий внедрение команд ОС в драйвер Perforce в Composer через вредоносный URL-адрес репозитория, с автоматическим A/B-тестированием против уязвимых и исправленных версий.

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

Популярное

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

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

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

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

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

CVE-2026-40176 — Внедрение команд в драйвере Perforce Composer (Proof of Concept)

Автономное, объектно-ориентированное PHP-подтверждение концепции, которое демонстрирует и дифференциально проверяет уязвимость внедрения команд в драйвере репозитория Perforce для Composer.

PoC запускает один и тот же вредоносный composer.json с двумя бинарными файлами Composer — уязвимой версией (2.9.5) и исправленной версией (2.9.6) — и доказывает наличие ошибки, наблюдая за побочным эффектом (файл-маркер, созданный внедренной командой оболочки), который срабатывает на уязвимой версии, но не на исправленной.

⚠️ Только для авторизованных исследований безопасности и защитного тестирования. См. Ответственное использование.


Содержание

  • Краткое описание
  • Уязвимость
  • Как работает PoC
  • Внедряемая нагрузка (объяснение)
  • Требования
  • Настройка
  • Использование
  • Ожидаемый вывод
  • Интерпретация результата
  • Структура проекта
  • Примечания к дизайну
  • Ограничения и известные проблемы
  • Ответственное использование
  • Ссылки

  • Краткое описание

    CVECVE-2026-40176
    КомпонентComposer — драйвер репозитория/VCS Perforce (perforce)
    КлассВнедрение команд ОС через URL репозитория, контролируемый атакующим
    Поверхность атакиcomposer.json, содержащий сконструированную запись repositories с type: perforce
    Уязвимая версияComposer 2.9.5
    Исправленная версияComposer 2.9.6
    ТриггерРазрешение/обновление зависимостей (composer update) на основе вредоносного манифеста
    ВоздействиеПроизвольное выполнение команд на машине, запускающей Composer
    Язык PoCPHP (один файл, без внешних зависимостей)

    Уязвимость

    Composer может разрешать пакеты из нескольких систем контроля версий. Для Perforce репозиторий идентифицируется URL-адресом p4://, который кодирует хост, порт и пользователя/поток. Когда драйвер Perforce в Composer формирует базовую командную строку p4, поля, взятые из контролируемого атакующим URL, недостаточно очищаются перед передачей оболочке.

    Поскольку автор манифеста полностью контролирует URL репозитория, атакующий, который может заставить жертву выполнить composer update/composer install на основе вредоносного composer.json (например, отравленная зависимость, враждебный репозиторий или задание CI, обрабатывающее непроверенные файлы проекта), может выйти за пределы предполагаемого вызова p4 и выполнить произвольные команды ОС с привилегиями процесса Composer.

    Это относится к тому же семейству, что и исторические проблемы внедрения аргументов в драйверах VCS Composer, где значения URL/ветки/потока попадают в команды оболочки без экранирования. Composer 2.9.6 ужесточает драйвер Perforce, так что внедренная нагрузка больше не выполняется.

    Авторитетным описанием поведения, демонстрируемого здесь, является исходный код PoC (CVE202640176Test.php); за подробностями исправления обращайтесь к официальному уведомлению и журналу изменений Composer.


    Как работает PoC

    PoC представляет собой один класс CVE202640176Test, который выполняет контролируемый A/B (дифференциальный) эксперимент:

    1. Предварительная проверка — запрашивает --version у обоих бинарных файлов Composer (уязвимой 2.9.5 и исправленной 2.9.6) и прерывает выполнение, если один из них не может быть вызван.
    2. Запуск на уязвимой версии (2.9.5)
      • Создает изолированную временную директорию в системной временной папке.
      • Записывает composer.json, раздел repositories которого содержит запись perforce с вредоносным URL p4://, несущим внедренную команду оболочки.
      • Выполняет composer update в этой директории.
      • Проверяет результат.
    3. Запуск на исправленной версии (2.9.6) — повторяет те же шаги с исправленным бинарным файлом.
    4. Восстановление — блок finally всегда восстанавливает исходный composer.json в директории проекта.
    5. Вердикт — выводит PASS только тогда, когда запуск на уязвимой версии показывает побочный эффект, а на исправленной — нет.

    Проверка (что считается "эксплуатацией")

    Для каждого запуска validateRun() проверяет три условия:

    ПроверкаЧто доказывает
    Файл-маркер существует и содержит идентификатор запускаВнедренная нагрузка touch/echo действительно выполнилась — то есть внедрение команд удалось.
    Вывод Composer упоминает p4Был достигнут путь кода драйвера Perforce (нагрузка обработана правильным компонентом, а не каким-то другим шагом).
    Распознанная версия Composer соответствует ожидаемойЗапущен правильный бинарный файл (2.9.5 или 2.9.6).

    Запуск считается "OK" только при выполнении всех трех условий. Общий тест проходит, когда запуск на уязвимой версии OK, а на исправленной — нет — точный признак реальной уязвимости, которая впоследствии была исправлена.


    Внедряемая нагрузка (объяснение)

    Вредоносный URL репозитория создается в writeComposerJson():

    root@kitploit:~
    p4://127.0.0.1:1666:attacker_user;touch <маркер> && echo '<id_запуска>' > <маркер>:client_test
    

    Разберем по частям:

    • p4://127.0.0.1:1666:attacker_user — корректно выглядящий URL Perforce (хост, порт 1666, пользователь).
    • ;touch <маркер> && echo '<id_запуска>' > <маркер> — внедренные команды оболочки. Ведущий ; завершает предполагаемую команду p4; touch создает файл-маркер, а echo '<id_запуска>' > <маркер> записывает в него уникальный идентификатор запуска, чтобы PoC мог подтвердить, что нагрузка (а не какой-то другой процесс) создала этот файл.
    • :client_test — завершающий текст для сохранения правдоподобности разбора URL.

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

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


    Требования

    • PHP 7.4+ (разработано/протестировано с PHP 8.x CLI). Сам PoC использует только встроенные функции — для запуска тестовой обвязки не требуется пакетов Composer.
    • Два бинарных файла Composer, доступные как PHAR:
      • Composer 2.9.5 (уязвимая версия)
      • Composer 2.9.6 (исправленная версия)
    • Окружение с оболочкой, подобной POSIX (exec() запускает cd … && php …). Разработано для Linux/macOS.
    • Базовый composer.json в директории проекта (он считывается при запуске, копируется в каждый временный запуск и восстанавливается после).

    Вам обычно не нужен работающий сервер Perforce: уязвимость заключается в том, как Composer формирует командную строку p4, и внедренная нагрузка выполняется до/вместо любого реального подключения p4. Composer может выдать ошибку подключения Perforce — это ожидаемо и не влияет на доказательство через файл-маркер.


    Настройка

    1. Клонируйте / разместите PoC в рабочей директории.

    2. Предоставьте composer.json в той же директории, что и PoC. Минимального достаточно:

      root@kitploit:~
      {
        "name": "research/cve-2026-40176-poc",
        "description": "Базовый манифест для дифференциального PoC CVE-2026-40176",
        "require": {}
      }
      
    3. Получите два бинарных файла Composer и разместите их там, где ожидает PoC (по умолчанию показаны):

      root@kitploit:~
      /usr/local/bin/composer-2.9.5.phar   # уязвимая версия
      /usr/local/bin/composer-2.9.6.phar   # исправленная версия
      

      Вы можете скачать конкретные версии Composer из официального архива, например:

      root@kitploit:~
      curl -Lo /usr/local/bin/composer-2.9.5.phar https://getcomposer.org/download/2.9.5/composer.phar
      curl -Lo /usr/local/bin/composer-2.9.6.phar https://getcomposer.org/download/2.9.6/composer.phar
      

      Если ваши пути отличаются, отредактируйте два аргумента конструктора внизу CVE202640176Test.php.


    Использование

    root@kitploit:~
    php CVE202640176Test.php
    

    Тестовая обвязка запускает обе версии Composer по очереди и выводит окончательный вердикт. Исходный composer.json восстанавливается автоматически, даже если один из запусков завершается неудачей (работа происходит во временных директориях, которые удаляются).


    Запуск в Docker (рекомендуется)

    Репозиторий содержит контейнеризованную лабораторию, которая точно воспроизводит среду: среда выполнения PHP CLI плюс две зафиксированные версии Composer по путям, которые ожидает PoC, с полной сетевой изоляцией во время выполнения.

    root@kitploit:~
    docker compose run --rm poc
    

    Эта команда собирает образ cve-2026-40176-lab:latest (загружая Composer 2.9.5 и 2.9.6 и проверяя каждый --version во время сборки) и запускает дифференциальный тест внутри непривилегированного контейнера без возможности исходящих подключений.

    Что гарантирует лаборатория:

    • Настоящие бинарные файлы. Обе версии Composer загружаются из официального архива и проверяются на соответствие версии во время сборки — сборка завершится ошибкой, если зафиксированная версия недоступна.
    • Изоляция. Сервис poc работает во внутренней сети bridge (нет доступа к хосту/интернету), с cap_drop: ALL и no-new-privileges. Внедренная нагрузка остается внутри контейнера.
    • Настройка не требуется на хосте. Не нужно размещать PHAR-файлы на хосте или вручную редактировать пути.

    Перезафиксировать версии (они должны соответствовать двум путям в конструкторе PoC) можно через аргументы сборки:

    root@kitploit:~
    docker compose build --build-arg COMPOSER_AFFECTED_VERSION=2.9.5 --build-arg COMPOSER_FIXED_VERSION=2.9.6
    

    Опционально — работающий сервер Perforce. Сервис p4d доступен в профиле full-lab (docker compose --profile full-lab up). Доказательство на основе маркера не требует его; он существует для исследователей, которым нужна работающая конечная точка p4://. Обратите внимание, что нагрузка PoC нацелена на 127.0.0.1:1666, поэтому маршрутизация через отдельный контейнер p4d требует указания в URL PoC хоста p4d.


    Статус воспроизведения (наблюдаемый)

    Честный результат: в отношении реальных, опубликованных Composer 2.9.5 и 2.9.6 PoC в настоящее время не срабатывает, и лаборатория сообщает НЕОПРЕДЕЛЕННО / НЕУДАЧА.

    Запуск уязвимого Composer (2.9.5) с вредоносным манифестом PoC вызывает внутри Composer до создания любой команды p4/оболочки:

    root@kitploit:~
    In PerforceDriver.php line 40:
      [ErrorException]
      Undefined array key "depot"
    

    PerforceDriver::initialize() первым делом читает $this->repoConfig['depot'], но запись репозитория в PoC содержит только type и url (без ключа depot). Драйвер аварийно завершается на этом этапе, поэтому внедренная нагрузка ;touch <маркер> в URL никогда не достигается, и маркер не создается. Сетевая изоляция не является причиной — та же ошибка возникает при полном доступе к сети.

    Что это означает:

    • Сама Docker-лаборатория корректна и надежно запускает дифференциальную обвязку с настоящими уязвимыми/исправленными бинарными файлами. Результат НЕОПРЕДЕЛЕННО является свойством нагрузки PoC, а не окружения.
    • Чтобы пройти по фактическому пути построения команд Perforce, конфигурация репозитория в PoC должна включать хотя бы ключ depot (и, реалистично, работающую конечную точку p4d в профиле full-lab). Уточнение нагрузки до этого уровня является разработкой эксплойта, выходящей за рамки «запустить лабораторию», и намеренно оставлено за пределами данной работы.

    «Ожидаемый вывод» ниже — это предполагаемый/идеализированный результат PoC, сохраненный для справки; это не то, что текущая нагрузка производит с реальным драйвером.


    Ожидаемый вывод

    Успешная демонстрация выглядит примерно так (пути и идентификаторы будут различаться):

    root@kitploit:~
    === CVE-2026-40176 PoC started ===
    - Composer 2.9.5 version: 2.9.5
    - Composer 2.9.6 version: 2.9.6
    Prepared temp dir: /tmp/cve20264176_5_20260610_142233
    Written malicious composer.json to /tmp/cve20264176_5_20260610_142233
    Running Composer in /tmp/cve20264176_5_20260610_142233…
    - Parsed Composer version: 2.9.5
    - Marker /tmp/cve20264176_5_.../poc_marker_5.txt created with expected ID.
    - Output shows Perforce driver activity.
    - Affected run exit code: 1
    Prepared temp dir: /tmp/cve20264176_6_20260610_142233
    Written malicious composer.json to /tmp/cve20264176_6_20260610_142233
    Running Composer in /tmp/cve20264176_6_20260610_142233…
    - Parsed Composer version: 2.9.6
    ✘ Marker file /tmp/cve20264176_6_.../poc_marker_6.txt not found.
    - Output shows Perforce driver activity.
    - Fixed   run exit code: 1
    
    === CVE-2026-40176 PoC finished ===
    === TEST RESULT: PASS (affected succeeded, fixed failed) ===
    

    Ненулевой код завершения Composer — это нормально — composer update в конечном итоге не может получить (поддельный) пакет. Доказательством является файл-маркер, а не статус завершения Composer.


    Интерпретация результата

    РезультатЗначение
    ПРОЙДЕН (уязвимая версия сработала, исправленная — нет)Подтверждено: 2.9.5 выполнила внедренную команду, 2.9.6 — нет. Воспроизведены как уязвимость, так и ее исправление.
    НЕОПРЕДЕЛЕННО / НЕУДАЧАОдна или несколько проверок не сошлись. Проверьте строки ✓/✗ для каждого запуска: неверный путь к бинарному файлу, несоответствие версии, отсутствие маркера у уязвимой версии (различия в окружении/экранировании) или неожиданное создание маркера исправленной версией.

    Распространенные причины неопределенного результата:

    • Драйвер аварийно завершается на PerforceDriver.php:40 с Undefined array key "depot" — в конфигурации репозитория отсутствует ключ depot, поэтому Composer никогда не доходит до пути построения команды p4. Это именно то, что происходит с текущей нагрузкой PoC на реальных 2.9.5/2.9.6 (см. Статус воспроизведения).
    • Неверные пути к бинарным файлам Composer или PHAR-файлы на самом деле не являются версиями 2.9.5 / 2.9.6.
    • Оболочка хоста или PHP exec() изолирована/отключена.
    • Вывод Composer не содержит буквальной строки p4 (путь драйвера не был достигнут).

    Структура проекта

    root@kitploit:~
    CVE2026-40176/
    ├── CVE202640176Test.php   # PoC: класс CVE202640176Test + точка входа
    ├── composer.json          # Базовый манифест, который PoC читает/восстанавливает во время выполнения
    ├── Dockerfile             # Образ лаборатории: PHP CLI + зафиксированные Composer 2.9.5 и 2.9.6
    ├── docker-compose.yml     # Запуск `poc` (+ опциональный `p4d` в профиле full-lab)
    ├── .dockerignore          # Уменьшает контекст сборки
    ├── README.md              # Этот файл
    └── .gitignore             # Исключает локальное состояние агента/инструментов
    

    Весь PoC состоит из одного файла:

    • __construct() — сохраняет два пути к бинарным файлам, создает идентификатор запуска с меткой времени, снимает снимок исходного composer.json.
    • run() — управляет предварительной проверкой, запуском на уязвимой версии, запуском на исправленной версии, восстановлением и вердиктом.
    • prepareTempDir() — создает изолированную рабочую директорию для каждого запуска.
    • writeComposerJson() — создает вредоносный манифест с внедренным URL p4://.
    • runComposer() — выполняет composer update (аргументы экранированы с помощью escapeshellarg()) и захватывает вывод и код завершения.
    • validateRun() — проверяет версию, файл-маркер и активность драйвера Perforce.
    • preflightVersion() — читает --version из заданного бинарного файла.

    Примечания к дизайну

    • Изоляция и очистка. Каждый запуск использует собственную временную директорию; исходный composer.json восстанавливается в блоке finally независимо от результата.
    • Экранирование обвязки и нагрузки. Обвязка экранирует свои собственные аргументы оболочки с помощью escapeshellarg() (чтобы PoC случайно не внедрился в собственные вызовы exec()). Уязвимость находится на уровень глубже — в том, как сам Composer формирует команду p4, — именно на это и нацелена нагрузка.
    • Дифференциальное доказательство. Запуск как уязвимого, так и исправленного бинарных файлов за один проход устраняет неоднозначность: одни и те же входные данные приводят к разному поведению, что является гораздо более сильным доказательством, чем единичное положительное наблюдение.
    • Безвредная нагрузка. Внедренные команды только создают маркер (touch/echo) в уникальном временном файле, что делает PoC безопасным для многократного запуска без побочных эффектов для хоста.

    Ограничения и известные проблемы

    • Жестко заданные пути к бинарным файлам. Два пути к PHAR-файлам передаются в коде внизу файла. Отредактируйте их для вашего окружения (или переработайте для чтения из аргументов CLI / переменных окружения).
    • Предположение POSIX. Шаблон exec("cd … && php …") и нагрузка с ;/&& предполагают оболочку, подобную Unix; Windows как есть не поддерживается.
    • Гонка mkdir / права доступа. Временные директории создаются с режимом 0777; ужесточите при работе в общем окружении.
    • Определение версии на основе регулярного выражения. Парсит Composer X.Y.Z из вывода; необычные баннеры Composer могут помешать сопоставлению.

    Ответственное использование

    Этот репозиторий существует для понимания и защиты от CVE-2026-40176.

    • Запускайте его только на системах и установках Composer, которыми вы владеете или на тестирование которых у вас есть явное разрешение.
    • Вывод для защитников: обновите Composer до версии 2.9.6 или новее и никогда не запускайте composer install/update на непроверенных файлах composer.json (например, в конвейерах CI, обрабатывающих исходный код сторонних проектов) без изоляции.
    • Не используйте технику внедрения против систем, которыми вы не управляете. Несанкционированная эксплуатация незаконна и неэтична.

    Ссылки

    • Composer — официальный проект
    • Архив релизов Composer (для загрузки конкретных PHAR-файлов 2.9.5 / 2.9.6)
    • Официальное уведомление CVE-2026-40176 и журнал изменений Composer 2.9.6 (обратитесь к трекеру безопасности вашего дистрибутива / GitHub Advisory Database для получения авторитетных сведений об исправлении)
    • Предыстория внедрения аргументов в драйверы VCS Composer (тот же класс уязвимостей), например CVE-2021-29472

    Автор: Ikarolaborda · PoC от 2026-06-10.

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