Aikido

Enviar um e-mail para o GitLab, fazer push para main

Escrito por
Joe Leon

resumo

O GitLab fornece um endereço de email privado para criar problemas. Se for divulgado, qualquer pessoa que o tenha pode enviar código, executar tarefas CI/CD e ignorar restrições de IP em todos os seus projetos públicos e privados. Isto afeta todas as contas do GitLab.com e servidores GitLab auto-hospedados que permitem aos utilizadores criar problemas por email.

O que precisa de verificar

​Passo 1: A funcionalidade está ativada?

  • GitLab.com: Sim, para todas as contas. Não pode desativá-la.
  • GitLab auto-hospedado: Talvez. 
    • Abra uma das listas de itens de trabalho do seu projeto e clique em ⋮. Se vir "Enviar item de trabalho por email para este projeto" ou algo semelhante, está ativado.
  • GitLab Dedicated: Não. 

Passo 2: Alguém partilhou um destes endereços?

O endereço só é perigoso se alguém que não seja o seu proprietário o tiver. Procure nos seus repositórios, documentos, centro de ajuda e wikis por `@incoming.gitlab.com` (os utilizadores auto-hospedados devem procurar pelo domínio no seu próprio endereço). Uma ocorrência é perigosa se o endereço tiver um token antes de `-issue` ou `-merge-request`: 

  • Perigoso: incoming+project-id-glimt-XXXXXXXXXXXXXX-issue@incoming.gitlab.com 
  • Seguro: incoming+group-project-12346426-issue-@incoming.gitlab.com

O Betterleaks (gratuito, de código aberto) e a detecção de segredos do Aikido encontram estes endereços nos seus repositórios automaticamente, incluindo formatos mais antigos.

Passo 3: Redefinir endereços divulgados

O proprietário de um endereço de email divulgado deve aceder a User settings > Personal access tokens > Incoming email token e clicar em redefinir (link direto para o GitLab.com). Isto altera todos os endereços de email dos seus projetos de uma só vez e os antigos deixam de funcionar.

Verifique os commits recentes, especialmente as alterações a .gitlab-ci.yml, e as execuções recentes de pipelines para detetar qualquer atividade de que o proprietário do endereço de email não se lembre.

A história completa

Os projetos no GitLab têm um botão com a etiqueta "Enviar item de trabalho por e-mail para este projeto".

‍

Página «Itens de trabalho» do GitLab com o menu de expansão aberto, mostrando «Exportar como CSV» e a opção «Enviar por e-mail o item de trabalho para este projeto» destacada

Se clicar nele, o GitLab mostra-lhe um endereço de e-mail privado. Envie qualquer e-mail para esse endereço e aparecerá uma nova issue nesse projeto, criada por si.

incoming+project-id-glimt-XXXXXXXXXXXXXX-issue@incoming.gitlab.com

A string glimt- no meio desse endereço é uma credencial. É um token de longa duração associado à sua conta e nunca expira. 

Também faz consideravelmente mais do que registar bugs. Qualquer pessoa na posse desse endereço pode enviar código e executar tarefas de CI/CD em todos os projetos a que a sua conta tenha acesso.

Testámos isto contra um projeto privado protegido pelas restrições de IP do GitLab, configurado para aceitar ligações apenas a partir de um endereço específico que não era o nosso. O GitLab bloqueou o nosso browser e rejeitou o git clone. No entanto, aceitou o e-mail e o commit foi integrado na branch main.

Inofensivo no papel na UI

Criar issues por e-mail é uma funcionalidade comum. Trello, Todoist e Monday.com incluem uma versão da mesma e todas a limitam da mesma forma. O e-mail enviado para um endereço único cria uma unidade de trabalho num projeto. Assim, os utilizadores chegam ao GitLab à espera do mesmo.

E a UI do GitLab confirmou isso. A janela modal indicava aos utilizadores que o endereço pertence apenas a si e que adiciona itens a este projeto. 

A janela modal do GitLab «Criar novo item de trabalho por e-mail» apresenta um endereço de e-mail privado de entrada, com texto sublinhado a indicar que qualquer pessoa que o possua pode criar itens de trabalho como se fosse você.
Captura de ecrã da janela modal de itens de trabalho tirada a 28 de julho de 2026. A versão atualizada inclui agora "criar itens de trabalho e merge requests"

A página de Personal access tokens (em `User settings`) descartava qualquer outra hipótese. O GitLab afirmava que o token de e-mail de entrada o autentica quando cria uma nova issue por e-mail e que "não pode ser utilizado para aceder a quaisquer outros dados".

Painel de definições do token de e-mail de entrada do GitLab, com texto sublinhado a indicar que o token o autentica ao criar uma issue por e-mail e não pode ser utilizado para aceder a quaisquer outros dados.
Captura de ecrã da página de personal access tokens tirada a 28 de julho de 2026. A versão atualizada inclui agora "criar issues e merge requests".

Este é o modelo mental com que os utilizadores do GitLab ficam. É um endereço de e-mail para criar issues num projeto específico e deve ser mantido privado.

Nota: Após eu contactar o GitLab, estes adicionaram o texto "and merge requests" a ambos os elementos da UI.

O meu endereço de e-mail é um PAT?

O GitLab tem razão ao afirmar que o deve manter privado, mas estão a desvalorizar o risco. O token contido neste endereço de e-mail é essencialmente um personal access token granular com acesso significativo aos seus projetos no GitLab.

Acesso a toda a conta

Abra "Enviar item de trabalho por e-mail para este projeto" em cinco projetos diferentes e o GitLab fornece-lhe cinco endereços diferentes. O token glimt- incorporado em cada um é idêntico, mesmo em projetos privados.

Dois projetos do GitLab, um privado e outro público, que apresentam endereços de e-mail diferentes, mas que contêm o mesmo token «glimt-».

A interface apresenta o endereço como sendo limitado ao projeto, mas a credencial no seu interior não é. Esse token pertence a toda a sua conta e acede a todos os projetos a que tem acesso, sejam públicos ou privados.

O remetente não importa

O GitLab não verifica o remetente. Em princípio, verificar se o endereço de envio corresponde ao e-mail do proprietário do token adicionaria uma camada de defesa, mas o GitLab não faz isto (embora estejam agora a ponderá-lo). Qualquer caixa de correio na internet pode enviar para esse endereço e o GitLab processa a mensagem como sendo do proprietário do token. Se tiver o endereço, tem tanto a autenticação como a autorização.

Uma lista de cinco e-mails provenientes de diferentes endereços de remetente, incluindo um endereço falsificado, cada um com a indicação «ACEITO COMO SE FOSSE VOCÊ», acompanhada de uma nota a informar que qualquer endereço de remetente é autenticado como sendo o seu.

De issues para código

Altere o sufixo -issue no endereço de e-mail para -merge-request, e o GitLab abrirá um merge request.

Um endereço de e-mail de entrada do GitLab, cujo sufixo foi alterado de «issue» para «merge-request», indicava que o mesmo token permite agora abrir pedidos de fusão.

Isso por si só não é muito, uma vez que um atacante não consegue direcionar o merge request para uma bifurcação maliciosa que controle. No entanto, os e-mails de merge request aceitam um anexo git .patch, e o GitLab aplica essas alterações à branch de origem. Se o patch afetar o ficheiro .gitlab-ci.yml e a função da vítima o permitir, o GitLab executa a tarefa do atacante.

O caminho completo, do início ao fim:

  1. A vítima publica ou expõe o endereço de issue-por-e-mail de um projeto.
  2. O atacante substitui -issue@ por -merge-request@.
  3. O atacante escreve um patch que adiciona uma tarefa ao .gitlab-ci.yml, sem qualquer conhecimento do repositório de destino.
  4. O atacante envia o patch por e-mail, indicando o nome da branch de origem na linha de assunto. O GitLab faz o push para essa branch se ela existir e cria-a se não existir.
Um e-mail endereçado a um endereço de receção de pedidos de fusão do GitLab, com o assunto «main», que inclui um ficheiro .patch do Git como anexo.
  1. O GitLab executa a tarefa no projeto da vítima, como se fosse a vítima.

A execução de CI/CD é um dos resultados. O outro é um commit em qualquer branch para a qual a vítima possa fazer push, incluindo a main, criada por ela. Qualquer pessoa que compile a partir desse repositório obtém o código do atacante.

Os e-mails contornam as restrições de IP

Restringimos um projeto privado a um único endereço IP que não era o nosso. 

A definição «Restringir o acesso por endereço IP» do GitLab está configurada para permitir um único endereço IP.

O GitLab bloqueou o nosso navegador e rejeitou os nossos comandos git clone. No entanto, continuou a aceitar um e-mail de merge request. 

As equipas ativam restrições de IP acreditando que definiram um perímetro de segurança em torno de um projeto, frequentemente na borda de uma VPN corporativa. O perímetro funciona para HTTP e SSH, mas não para e-mails recebidos. Um atacante que não consiga aceder ao projeto a partir da rede pode aceder-lhe através do canal de correio eletrónico.

O que um único endereço proporciona a um atacante

Um único endereço de e-mail divulgado pode comprometer seriamente a conta GitLab de um utilizador ou organização. Confirmámos cada um destes vetores de ataque em projetos sob o nosso controlo:

  • Fazer push de código para uma branch protegida num repositório privado protegido por uma lista de permissões de IP.
  • Exfiltrar código-fonte de projetos privados protegidos por uma lista de permissões de IP.
  • Ler variáveis de CI/CD e Secrets a partir de projetos privados.
  • Aceder a issues confidenciais em projetos privados (através da ação rápida /move)
  • Utilizar o CI_JOB_TOKEN disponível em tarefas de CI/CD para aprofundar o acesso na conta.

Um endereço de e-mail de entrada do GitLab contém um token que funciona como um token de acesso pessoal granular com permissões significativas.

Detalhes do token do GitLab que mostram um `incoming_email_token` de nível detalhado que nunca expira, com âmbito para todos os grupos e projetos, e nove permissões, incluindo «Criação de Pedido de Fusão», «Atualização do Repositório» e «Atualização do Ramo Protegido».

A distinção mais importante é que, em vez de aceder ao GitLab via API, os utilizadores devem publicar dados através de e-mails. Na perspectiva de quem faz a defesa, se isso pode resultar no mesmo comprometimento da conta, interessa saber se se trata de um pedido HTTP ou de um e-mail? 

Restrições do atacante

Há dois factores que limitam um atacante de posse do endereço:

1. O token herda as permissões da vítima e nenhum elemento no fluxo de e-mail as eleva.

As permissões da vítima limitam os danos. Um endereço de Convidado (Guest) divulgado é praticamente inútil. Um endereço de Mantenedor (Maintainer) divulgado pode atingir branches protegidos e variáveis de CI/CD. Nada no fluxo de e-mail define esse limite, apenas o papel da vítima.

2. O encaminhamento exige saber qual o projecto a atacar.

O GitLab resolve o destino a partir de dois valores contidos no endereço de e-mail de entrada: o slug do caminho do projecto e o ID do projecto. Para aceder a um segundo projecto, um atacante deve fornecer o caminho e o ID de um projecto diferente juntamente com o token roubado. Para projectos públicos, o GitLab publica ambos os valores. Para projectos privados, o atacante precisa de uma fuga de informação que indique o nome do projecto (o ID é fácil de adivinhar).

Uma dúzia, publicados de propósito

Tudo o resto depende de um atacante conseguir obter um endereço de e-mail. Passámos uma tarde a pesquisar na documentação pública e encontrámos facilmente uma dúzia de endereços de e-mail de entrada activos em READMEs, guias de contribuição e páginas de suporte. Quase todos tinham sido publicados deliberadamente, por um mantenedor que indicava aos utilizadores para onde enviar relatórios de erros! Alguns pertenciam a projectos open source muito populares. 

Um link do software «Reportar um bug ou outro problema» que revela um endereço «mailto» que contém um token ativo de e-mail de entrada do GitLab «glimt-».

Isto não é um erro do utilizador. Um endereço de e-mail é o único identificador que existe para ser partilhado. O GitLab chama a isto um endereço de e-mail, formata-o como tal e disponibiliza um botão para o copiar. Nada nele se assemelha a uma credencial.

A janela modal refere para o manter privado e avisa que qualquer pessoa na posse do endereço pode criar itens de trabalho em seu nome. Esse aviso descreve spam. Não descreve envios de código (pushes) e execuções de pipelines em todos os projectos da conta.

Notificámos as contas afectadas antes da publicação. Infelizmente, o GitLab não dispõe de um mecanismo para revogar estes tokens em massa ou notificar os utilizadores, pelo que os nossos esforços tiveram resultados mistos.

Quem é afectado

Todas as contas GitLab.com e todas as instâncias autoalojadas (self-managed) com o e-mail de entrada activado. O GitLab restringe a documentação de e-mail de entrada a instâncias Self-Managed e GitLab.com, pelo que o GitLab Dedicated não aparenta ser afectado. Não conseguimos testar isso directamente.

Nenhum desses utilizadores consegue desativar esta funcionalidade. Não existe nenhuma definição para desativar a criação de issues por e-mail, nenhuma definição para desativar a criação de merge requests por e-mail, nem qualquer forma de exigir que o remetente coincida com um endereço verificado. O token não expira. O único controlo que o GitLab faculta é a hiperligação de reinicialização na página de tokens de acesso pessoal, sendo que reiniciá-lo invalida todos os endereços de projecto que possui.

Divulgação ao GitLab

Esta não é uma "vulnerabilidade" típica. Trata-se de expectativas violadas dos utilizadores a dobrar e predefinições inseguras a triplicar. Reportámos o caso através do HackerOne em maio de 2026, mas foi encerrado como comportamento pretendido (sem surpresa). Submetemos um problema confidencial no repositório do GitLab em junho de 2026, o qual obteve uma resposta mais detalhada.

A posição do GitLab, tal como a entendemos, é que este é um token como qualquer outro e que qualquer token divulgado conduz a maus resultados. Isso descreve o comportamento de qualquer credencial assim que um atacante a detém, o que está correcto. No entanto, evita o que torna este caso diferente. O GitLab criou uma credencial que atinge todos os projectos da conta e ignora restrições de IP, apresentando-a posteriormente como um endereço de e-mail.

‍

Um pedido de fusão no GitLab intitulado «Alinhar a funcionalidade de tokens de e-mail recebidos na interface do utilizador e na documentação».

Em resposta ao nosso relatório, o GitLab implementou uma atualização com três alterações:

  1. Removeu a frase "Não pode ser utilizado para aceder a quaisquer outros dados" da interface de utilizador.
  2. Adicionou "e merge requests" onde a interface de utilizador indicava anteriormente que o endereço apenas podia criar itens de trabalho.
  3. Documentou que o e-mail de entrada não está sujeito a restrições de IP.

Essa é uma resposta justa ao que reportámos, mas as actualizações continuam a não transmitir a totalidade do risco. Um utilizador que leia "merge requests" não fica a saber que o endereço transporta um token que envia código, executa tarefas de CI/CD e funciona a partir do exterior de uma lista de permissões de IP. Nada em nenhuma das interfaces indica que esse token alcança todos os projectos na conta. 

O GitLab também manteve o mecanismo subjacente inalterado. A maior redução individual da superfície de ataque seria exigir que o endereço do remetente coincidisse com o da conta do GitLab. Nesse caso, um atacante necessitaria de acesso à conta de e-mail da vítima e não apenas a um endereço.

Como os detetamos

Adicionámos cobertura adicional ao Betterleaks para identificar todos os tipos de tokens de email de receção do GitLab, incluindo:

  • tokens com o prefixo `glimt-`
  • tokens com prefixos personalizados
  • tokens gerados antes da existência do prefixo `glimt-`
Um pedido de integração (pull request) do Betterleaks, intitulado «detecção adicional de tokens de e-mail recebidos no GitLab», com uma descrição que explica que este adiciona a detecção de prefixos de tokens personalizados e de tokens mais antigos encontrados em endereços de e-mail públicos.

O Betterleaks identifica agora mais formatos de tokens de email de entrada do GitLab do que qualquer outro scanner de secrets, incluindo o GitLab.

A detecção de segredos do Aikido aplica a mesma cobertura que o Betterleaks nos seus repositórios e merge requests. Se surgir algum resultado, faça a rotação das suas credenciais imediatamente.

Um endereço de email do GitLab comprometido apresenta outro vetor para os agentes de ameaças enviarem código malicioso e comprometerem a cadeia de fornecimento. Considere executar o Safe Chain ou a Device Protection do Aikido para evitar que você (ou a sua equipa) instalem acidentalmente pacotes comprometidos. O Safe Chain é uma CLI open-source que encapsula o npm, o pip e outros gestores de pacotes para bloquear malware conhecido antes da sua instalação. A Device Protection faz o mesmo para as equipas, bloqueando pacotes maliciosos, registando instalações a nível organizacional e aplicando políticas de aprovação. Nenhum deles impede que o detentor de um token envie código, mas ajudam a evitar que uma dependência maliciosa adicionada através de um commit comprometido seja executada na máquina de um programador ou numa compilação.

Compartilhar:

https://www.aikido.dev/blog/gitlab-email-push-to-main

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

Torne-se seguro hoje,
de forma rápida e gratuita.

Proteja o seu código, a cloud e o runtime num sistema central.
Conecte um repositório para descobrir o que os agentes de raciocínio encontram na sua base de código.

Não é necessário cartão de crédito | Resultados do teste em 32 segundos.
Confiado por mais de 150 mil orgs