Aikido

As chaves API do Google continuam a funcionar mesmo depois de as eliminar

Escrito por
Joe Leon

Resumo: Quando se elimina uma chave da API do Google, é indicado que a eliminação é imediata. Os nossos testes revelam que o processo demora cerca de 23 minutos. Durante esse período, um invasor que tenha obtido uma chave que vazou mantém acesso aos seus dados e às APIs ativadas (incluindo o Gemini). Não há forma de revogar a chave mais rapidamente nem de confirmar quando esta deixa de funcionar. O Google arquivou a nossa denúncia com a indicação «não será corrigido».

Quando se elimina uma chave API, espera-se que o acesso termine imediatamente. 

As chaves API do Google não funcionam assim. A revogação propaga-se gradualmente pela infraestrutura do Google. Alguns servidores rejeitam a chave em poucos segundos, enquanto outros continuam a aceitá-la durante 23 minutos.

Um invasor que possua a sua chave eliminada pode continuar a enviar pedidos até que um deles chegue a um servidor que ainda não tenha sido atualizado. Se o Gemini estiver ativado no projeto, ele pode descarregar os ficheiros que carregou e extrair conversas armazenadas em cache.

A consola do GCP não mostra a chave e não indica se esta ainda está a funcionar. Está a confiar que a infraestrutura do Google acabará por se atualizar.

A autenticação não deve ser apenas consistente a longo prazo

Muitos dos serviços Cloud Google Cloud são, por definição, consistentemente diferidos. Neste modelo, as atualizações propagam-se gradualmente pelos servidores, em vez de de uma só vez. Esta escolha permite ao Google expandir-se globalmente e manter a rapidez e, na maioria dos serviços, o atraso é impercetível. No entanto, no que diz respeito à autenticação, essa escolha é mais difícil de justificar.

Os atrasos na revogação de credenciais são vulneráveis a ataques. Há alguns meses, Eduard Agavriloae revelou um atraso de 4 segundos que permitia que chaves de acesso da AWS eliminadas criassem novas credenciais. Quatro segundos foram suficientes para causar problemas na AWS. 

Tendo em conta a atenção que tem sido dada recentemente às chaves API do Google utilizadas para aceder ao Gemini, decidimos avaliar durante quanto tempo permanece aberto o período de revogação das chaves API do Google.

O que é um período de revogação?

O período de revogação é o intervalo de tempo entre o momento em que se elimina uma chave e a última autenticação bem-sucedida. 

O período de revogação é o intervalo de tempo entre a eliminação da chave e o último pedido aceite

Se esse intervalo for de alguns microssegundos, o comportamento corresponde ao que os utilizadores esperam. Se for mais longo, cada segundo adicional dá aos atacantes mais tempo para utilizar indevidamente uma chave roubada.

Determinar o período de revogação

Para avaliar o prazo de revogação das chaves API do Google, realizámos 10 testes ao longo de dois dias.

Em cada teste, criámos uma chave API, eliminámo-la e enviámos 3 a 5 pedidos autenticados por segundo até não obtermos nenhuma resposta válida durante vários minutos.

Escolhemos essa taxa porque não controlamos a forma como o Google encaminha os nossos pedidos para os diferentes servidores de autenticação espalhados pelo mundo. O objetivo era distribuir o volume pelo maior número possível desses servidores em cada teste, respeitando sempre a infraestrutura do Google. Não podemos afirmar se uma taxa de pedidos mais elevada prolongaria o intervalo observado. Um atacante não tem motivos para limitar o tráfego da forma como o fizemos, pelo que vale a pena referir que os nossos números podem não representar o pior cenário possível.

Para garantir a exaustividade, também verificámos aleatoriamente o nosso trabalho algumas semanas mais tarde, para nos certificarmos de que o comportamento observado não se devia a problemas de rede pontuais.

23 minutos

Em dez testes, o intervalo mais longo foi de quase 23 minutos! É um período de tempo incrivelmente longo durante o qual uma chave eliminada ainda consegue autenticar-se com sucesso.

O intervalo mais curto foi de quase 8 minutos, e a mediana situou-se em cerca de 16 minutos. Ao longo dos ensaios, a taxa de sucesso revelou-se altamente imprevisível: um minuto após a eliminação, num ensaio 79 % dos pedidos foram bem-sucedidos, enquanto noutro apenas 5 %.

Este gráfico apresenta a percentagem de pedidos autenticados bem-sucedidos por minuto para cada teste.

Um invasor que possua uma chave roubada não observa um corte abrupto nem um declínio previsível. O acesso continua a funcionar, de forma irregular, até que, por fim, simplesmente cessa. 

Rastrear um único teste na consola do GCP

Para ilustrar a inconsistência na infraestrutura do Google, monitorizámos um dos nossos testes utilizando o gráfico «Tráfego por credencial» no GCP. A linha inferior (azul) mostra as autenticações bem-sucedidas e reflete a duração do período de revogação.

Este gráfico apresenta o número de pedidos por segundo durante o nosso período de testes. A linha superior mostra os pedidos de API inválidos e a linha inferior mostra os pedidos válidos.

Não esperávamos ver mais nenhum dado, mas apareceu uma segunda linha. A linha superior (verde) representa os pedidos rejeitados e está identificada como apikey:DESCONHECIDO. Tínhamos (erradamente) assumido que os pedidos inválidos seriam simplesmente descartados sem qualquer atribuição a um projeto. Em vez disso, o GCP inclui-os neste gráfico.

Para compreender melhor o misterioso apikey:DESCONHECIDO valor, tentámos autenticar-nos com uma chave API eliminada há alguns dias. Surpreendentemente, essas solicitações apareceram no mesmo gráfico, agrupadas na mesma apikey:DESCONHECIDO grupo.

A nossa melhor suposição é que o Google mantém a atribuição do projeto mesmo após a eliminação da chave, para o caso de os utilizadores decidirem restaurar a credencial. 

Captura de ecrã do botão «Restaurar credenciais eliminadas» no GCP

Para as equipas de resposta a incidentes que investigam uma fuga de credenciais, o apikey:DESCONHECIDO Este valor pode ser confuso. Qualquer pedido efetuado com uma chave da API do Google eliminada é agrupado na mesma categoria «UNKNOWN», o que torna difícil distinguir quais os pedidos que se relacionam com uma credencial específica. Um pedido nessa categoria pode significar que um agente malicioso continua a tentar autenticar-se com a chave eliminada, ou pode tratar-se de um serviço legítimo a funcionar com uma chave desatualizada e sem relação com o caso.

Se estiver dentro do período de 23 minutos para revogação, verifique se existem autenticações válidas que utilizem a chave que foi divulgada. Se estiver fora desse período, o risco parece ser extremamente baixo.

Diferenças regionais em termos de consistência

Realizámos a primeira experiência a partir de um endereço IP residencial na Costa Leste dos EUA. A nossa hipótese era que a realização de uma experiência semelhante em máquinas virtuais (VM) em diferentes regiões do GCP poderia revelar inconsistências adicionais.

Criámos uma máquina virtual em três regiões: us-east1, Europa Ocidental 1, e sudeste-asiático1. Em seguida, realizámos 5 testes. Em cada um deles, eliminámos uma única chave API e enviámos pedidos a partir de cada uma das três máquinas virtuais em paralelo.

Dois aspetos chamaram a atenção. Em primeiro lugar, imediatamente após a eliminação de uma chave, as máquinas virtuais em diferentes regiões registaram taxas de sucesso na autenticação muito diferentes. A tabela abaixo apresenta a percentagem de pedidos válidos no primeiro minuto, por região.

Esta tabela apresenta a percentagem de pedidos de autenticação válidos no primeiro minuto dos testes, em todas as 5 séries de ensaios, discriminados por região.

Veja a tentativa 1: us-east1 82%, Europa Ocidental 1 60%, sudeste-asiático1 32%. As máquinas virtuais mais distantes dos EUA detetaram a eliminação mais rapidamente, o que é o oposto do que seria de esperar. Não podemos determinar com exatidão a razão para tal a partir do exterior. O encaminhamento de pedidos do Google é mais complexo do que a simples equação «região da máquina virtual = região do servidor», e uma máquina virtual em Singapura não comunica necessariamente com servidores em Singapura. No entanto, o padrão manteve-se consistente ao longo dos ensaios, o que sugere que a diferença se deve a algum fator relacionado com a infraestrutura regional, o armazenamento em cache ou a afinidade de encaminhamento.

Em segundo lugar, a diferença entre as regiões não se limitou apenas aos primeiros minutos. Ao longo de todo o período, sudeste-asiático1 apresentou uma taxa média de sucesso na autenticação de pedidos de 22%, enquanto us-east1 e Europa Ocidental 1 ambos ficaram na casa dos 49%. A Ásia manteve-se em baixa minuto a minuto, e não apenas no início.

Seja qual for a causa destas diferenças, a localização do servidor influencia claramente o comportamento de uma chave após a sua eliminação.

Outras credenciais do Google

Em todos os nossos testes, utilizámos chaves com acesso ao Gemini, mas observámos o mesmo comportamento com chaves limitadas a outras APIs do GCP, como o BigQuery e o Maps. O atraso é uma característica do tipo de credencial, e não das APIs ativadas no projeto.

Para completar, testámos outros dois tipos de credenciais do Google:

  • Novas chaves API Gemini (prefixo AQ.). A eliminação foi propagada em cerca de 1 minuto. 
  • Chaves da conta de serviço do Google. A eliminação foi propagada em cerca de 5 segundos.  

Ambos funcionam à escala do Google e ambos são revogados muito mais rapidamente do que os 23 minutos que medimos para as chaves da API do Google. 

Divulgação ao Google

Comunicámos esta situação à Google. A Google arquivou a notificação com a indicação «não será corrigido». A posição da equipa, tal como a entendemos, é que o atraso de propagação é uma característica conhecida do sistema e não constitui um problema de segurança.

Embora o Google indique publicamente que a sua API IAM é «eventualmente consistente», não documenta especificamente este comportamento no que diz respeito às chaves de API do Google.

[Legenda: Captura de ecrã da página de documentação da API IAM do Google.]

Expectativas dos utilizadores não correspondidas

Os sistemas distribuídos à escala do Google são complexos, e isto não constitui uma crítica à equipa de IAM do GCP. No entanto, um intervalo de revogação de 23 minutos está em total contradição com o que os utilizadores esperam de um botão de eliminação. A discrepância entre essa expectativa e o comportamento do Google põe em evidência quatro problemas:

1. A interface do utilizador é extremamente enganadora. 

Quando se elimina a chave, o Google retira-a da sua vista e informa que «uma vez eliminada, já não pode ser utilizada para efetuar pedidos à API». Essa afirmação é manifestamente falsa. O utilizador não tem como saber se a chave ainda está ativa, não tem como acelerar a revogação e não tem como confirmar quando esta deixou de funcionar por completo. 

Captura de ecrã da caixa de diálogo atual do Google para a eliminação de chaves de API. Indica que, uma vez eliminadas, as chaves já não podem ser utilizadas para efetuar pedidos à API. No entanto, é possível restaurar as suas credenciais a partir da página de credenciais eliminadas.

2. A Google implementou um processo de revogação mais rápido para outros tipos de credenciais. 

As revogações de credenciais de contas de serviço são propagadas em cerca de 5 segundos. O formato mais recente de chaves API do Gemini é propagado em cerca de um minuto. Ambos funcionam à escala do Google. Ambos sugerem que isto também é tecnicamente viável para as chaves API do Google. 

3. Janelas de consistência longas não são compatíveis com a autenticação. 

Quando se elimina uma credencial, espera-se que esta deixe de existir. Mesmo um atraso de apenas alguns segundos é significativo, como demonstrou a investigação sobre a AWS realizada por Eduard no ano passado.

4. Os longos períodos de revogação prejudicam a emissão de credenciais Just-in-Time. 

Um prestador de serviços que pretenda gerar chaves da API do Google de forma dinâmica tem de prever um intervalo de 23 minutos após a revogação antes de se ter a garantia de que a chave está inutilizada. Isso é incompatível com o modo como JIT funcionar.

Trabalhar à volta da janela

Até que o Google implemente um sistema de revogação mais rápido, a responsabilidade de colmatar esta lacuna recai sobre os utilizadores. Há duas coisas que podem ajudar.

1. Considere a eliminação de uma chave como uma operação que demora 30 minutos, e não como algo instantâneo. 

Se estiver a lidar com uma chave de API do Google que tenha sido divulgada, considere que a chave permanecerá ativa durante 30 minutos após clicar em «Apagar». Isso proporciona uma margem de segurança adicional em relação ao máximo de 23 minutos que observámos. Planeie o resto da sua resposta ao incidente tendo em conta esse intervalo de tempo.

2. Acompanhe a utilização durante o período em questão. 

Na secção «APIs e serviços ativados» da consola do GCP, analise os pedidos de API por credencial. Se detetar uma utilização inesperada dessa credencial após a sua eliminação, é possível que alguém a esteja a explorar ativamente.

Janelas de consistência eventual de grande duração são uma escolha de design inadequada para a revogação de credenciais. Até que a Google altere isso, considere cada eliminação de chave como uma operação com duração de 30 minutos e esteja atento à janela para evitar abusos.

Compartilhar:

https://www.aikido.dev/blog/google-api-keys-deletion

Assine para receber notícias

4.7/5
Cansado de falsos positivos?

Experimente Aikido como 100 mil outros.
Começar Agora
Obtenha um tour personalizado

Confiado por mais de 100 mil equipes

Agende Agora
Escaneie seu aplicativo em busca de IDORs e caminhos de ataque reais

Confiado por mais de 100 mil equipes

Iniciar Escaneamento
Veja como o pentest de IA testa seu aplicativo

Confiado por mais de 100 mil equipes

Iniciar Testes

Fique seguro agora

Proteja seu código, Cloud e runtime em um único sistema centralizado.
Encontre e corrija vulnerabilidades rapidamente de forma automática.

Não é necessário cartão de crédito | Resultados da varredura em 32 segundos.