CiberLab
Logotipo Ciência Embarcada Ciência Embarcada
Relatório técnico de análise de vulnerabilidade

GitLab: regex que executa código

Estouro de inteiro no motor de expressões regulares do Ruby, CVE-2026-97229 e CVE-2026-110264

Em outubro de 2026, o GitLab corrigiu duas falhas de nota máxima, 10.0, com a mesma raiz: um estouro de inteiro no Onigmo, o motor de expressões regulares embutido no Ruby. Uma expressão regular passa pela validação do GitLab e, ao ser recompilada em outra codificação, gera instruções inválidas que o atacante usa para executar comandos no servidor como o usuário git. A primeira falha, alcançada pelo arquivo de CI/CD, foi explorada contra a instância pública da Alpine Linux e entrou no catálogo de vulnerabilidades exploradas da CISA. A segunda afeta todas as versões desde a 7.0, de 2014. Como a correção está no Ruby, quem roda GitLab com Ruby próprio continua vulnerável depois de atualizar o GitLab: foi o que aconteceu com a Alpine.

Objeto analisado GitLab, CVE-2026-97229 e CVE-2026-110264
Severidade avaliada Crítica
Classificação TLP:CLEAR
Base de evidência OSINT verificado
Data de emissão 2 de novembro de 2026
Versão 1.0

00Sumário

  1. 01Sumário executivo
  2. 02Identificação do objeto analisado
  3. 03Contexto técnico: o Onigmo dentro do Ruby
  4. 04Mecanismo das vulnerabilidades e causa raiz
  5. 05O ataque à Alpine Linux
  6. 06Verificação: a exposição do CiberLab
  7. 07Detecção
  8. 08Mitigação e resposta a incidentes
  9. 09Indicadores de comprometimento
  10. 10Limitações da análise
  11. 11Referências
Achado central

Uma expressão regular passa pela validação do GitLab enquanto está guardada como US-ASCII; quando é avaliada contra um caminho de repositório em UTF-8 especialmente formado, o Onigmo a recompila, e um estouro no cálculo do tamanho do programa gera instruções inválidas que quebram a integridade do fluxo de controle e levam à execução de comandos como o usuário git [3]. As duas falhas foram relatadas pelo pesquisador joaxcar e receberam CVSS 3.1 10.0, com escopo alterado [1] [2]. A correção é um conjunto de patches no Ruby que o GitLab aplica nos pacotes e imagens oficiais; com Ruby próprio, atualizar o GitLab não basta [1] [4] [5].

01Sumário executivo

A CVE-2026-97229, corrigida em 12 de outubro de 2026, permite que um usuário sem autenticação execute código no servidor GitLab por meio de uma expressão regular construída na configuração de CI/CD [1]. A CVE-2026-110264, corrigida em 21 de outubro, é um segundo estouro de inteiro no compilador de expressões regulares, alcançável sob certas condições também sem autenticação, e afeta todas as versões a partir da 7.0 [2]. Ambas valem para as edições Community e Enterprise em instalação própria; o GitLab.com e o GitLab Dedicated já estavam corrigidos na divulgação [1] [2].

10.0 pontuação CVSS 3.1 das duas falhas, com escopo alterado [1] [2]
25.766 hosts vulneráveis à CVE-2026-97229 contados pela Censys em 13 de outubro [7]
8 quedas de trabalhadores provocadas pelo atacante na instância da Alpine [4]
7.0 primeira versão afetada pela CVE-2026-110264, de 2014 [2] [6]

O pré-requisito prático da CVE-2026-97229 é enviar um .gitlab-ci.yml malicioso a um projeto público; em instâncias onde qualquer pessoa pode se cadastrar e criar projetos, isso não exige credencial nenhuma [3]. Foi exatamente o caminho usado contra a Alpine Linux: em 20 e 21 de outubro, um atacante criou uma conta, enviou configurações de CI construídas e derrubou os trabalhadores do GitLab oito vezes; em quatro delas, avançou além da primeira etapa do exploit [4]. A CISA incluiu a falha no catálogo KEV em 29 de outubro, com prazo federal de três dias [3] [5].

A ação é: atualize para 19.5.1, 19.4.3, 19.3.6, 19.2.9, 19.1.9, 19.0.10 ou 18.11.13, que cobrem as duas falhas, e, se o GitLab roda sobre um Ruby que não é o do pacote oficial, atualize também o Ruby para 3.3.13, 3.4.12 ou 4.0.9 [2] [4]. A seção 6 registra que o CiberLab não usa GitLab.

02Identificação do objeto analisado

Natureza da evidência

Não houve submissão a sandbox, execução de exploit nem análise de amostra. O CiberLab não reproduziu as falhas. Os metadados vêm dos avisos oficiais do GitLab [1] [2]; a mecânica da CVE-2026-97229, da análise e da prova de conceito da Rapid7 [3]; o incidente, do relato da própria Alpine Linux [4] e da SecurityWeek [5]. A CVE-2026-110264 tem menos detalhe público, e o que se diz sobre o seu caminho de ataque vem de fontes secundárias [6].

Tabela 1. Ficha técnica das vulnerabilidades
CampoCVE-2026-97229CVE-2026-110264
Título oficialInteger Overflow issue in CI/CD Regular Expression Compiler impacts GitLab CE/EE [1]Integer Overflow issue in Regular Expression Compiler impacts GitLab CE/EE [2]
Classe de fraquezaCWE-190, estouro de inteiro [3]CWE-190, estouro de inteiro [6]
Vetor CVSS 3.1AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:H [1]AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:H [2]
Ponto de entradaExpressão regular na configuração de CI/CD [1] [3]Expressão regular compilada pelo servidor; o GitLab cita rajadas de erro de renderização Org mode como sinal [2]
Correção12 de outubro de 2026 [1]21 de outubro de 2026 [2]
Créditojoaxcar, via HackerOne [1]joaxcar, via HackerOne [2]
ExploraçãoConfirmada; KEV em 29 de outubro [3] [5]Sem exploração nem prova de conceito pública conhecidas [6]
Tabela 2. Versões afetadas e corrigidas
RamoCVE-2026-97229 corrigida emCVE-2026-110264 corrigida em
19.5Não afetado na publicação [1]19.5.1 [2]
19.419.4.2 [1]19.4.3 [2]
19.319.3.5 [1]19.3.6 [2]
19.219.2.8 [1]19.2.9 [2]
19.1, 19.0 e 18.11Fora da faixa afetada [1]19.1.9, 19.0.10 e 18.11.13 [2]
7.0 a 18.10Fora da faixa afetada [1]Afetados, sem versão corrigida no ramo [2]
A versão de 12 de outubro não cobre a segunda falha

Quem atualizou para 19.4.2, 19.3.5 ou 19.2.8 em 12 de outubro fechou a CVE-2026-97229, mas continua exposto à CVE-2026-110264 [1] [2]. Confira a versão contra a terceira coluna da tabela 2, e não só contra a segunda.

03Contexto técnico: o Onigmo dentro do Ruby

3.1Expressões regulares que viram programa

O GitLab é escrito em Ruby, e o Ruby usa o Onigmo como motor de expressões regulares [3] [5]. Para avaliar uma expressão regular, o Onigmo a compila num pequeno programa de instruções e o executa numa máquina virtual própria [3]. O tamanho desse programa é calculado antes da compilação; se o cálculo estiver errado, o programa gerado não cabe no espaço reservado ou contém instruções que o motor não deveria emitir [3].

3.2Onde o GitLab aceita expressões regulares

O arquivo .gitlab-ci.yml aceita expressões regulares em regras de pipeline, por exemplo para decidir em quais ramos ou caminhos um job roda [1] [3]. Qualquer pessoa que consiga enviar esse arquivo a um projeto consegue entregar uma expressão regular ao servidor. Em instâncias com cadastro aberto, isso inclui qualquer visitante [3].

3.3Codificação e recompilação

O Ruby associa uma codificação a cada texto. Uma expressão regular guardada como US-ASCII pode ser recompilada como UTF-8 quando é comparada com um texto UTF-8 que contém caracteres fora do ASCII [3]. A validação do GitLab examina a versão US-ASCII; a recompilação que acontece depois não passa pela mesma validação [3].

04Mecanismo das vulnerabilidades e causa raiz

4.1CVE-2026-97229: validada em ASCII, explorada em UTF-8

A expressão regular do atacante passa pela validação do GitLab enquanto está em US-ASCII [3]. Quando é avaliada contra um caminho de repositório em UTF-8 especialmente formado, o Onigmo a recompila, e um estouro no cálculo do tamanho do programa gera instruções de expressão regular inválidas [3]. Essas instruções quebram a integridade do fluxo de controle e dão ao atacante operações controladas na máquina virtual do Onigmo, dentro do processo Ruby, até a execução de comandos do sistema como o usuário git [3].

A Rapid7 reproduziu a execução de código numa imagem oficial do GitLab CE 19.4.1 (Linux amd64, com ASLR ligado), e a mesma entrada não executou contra a 19.4.2 [3]. O pré-requisito é enviar um .gitlab-ci.yml malicioso com um caminho de repositório UTF-8 a um ramo de um projeto público [3].

4.2CVE-2026-110264: o segundo estouro

O aviso de 21 de outubro descreve um estouro de inteiro ao compilar uma expressão regular construída, que permite a um usuário sem autenticação, sob certas condições, executar código arbitrário no servidor [2]. As notas de versão incluem um patch de Ruby para estouro de identificador de repetição (repeat ID overflow) nos ramos 19.2 a 19.5, mas não o associam explicitamente à CVE [2]. Fontes secundárias situam o caminho de ataque na renderização de arquivos Org mode, o que é coerente com o sinal de detecção que o próprio GitLab publica [2] [6].

4.3A correção está no Ruby

As correções são patches no interpretador Ruby que acompanha os pacotes Omnibus e as imagens oficiais (CNG) do GitLab: um patch de tamanho de programa e um de liberação dupla em faixas de repetição, para Ruby 3.3 e 3.4, em 12 de outubro [1]. O Ruby oficial publicou as correções em 3.3.13, 3.4.12 e 4.0.9, em 22 e 23 de outubro [4] [5].

Atualizar o GitLab pode não atualizar o Ruby

Quem roda GitLab a partir do código-fonte ou numa imagem própria usa o Ruby do sistema, e não o Ruby corrigido do pacote oficial. Nesse caso, a versão nova do GitLab chega sem a correção [4] [5]. Não considere a instância corrigida pela versão do GitLab: confira o Ruby com ruby -v e exija 3.3.13, 3.4.12, 4.0.9 ou superior [4].

05O ataque à Alpine Linux

A Alpine Linux publicou um relato detalhado do ataque à sua instância pública do GitLab, que mostra como uma correção mal aplicada mantém o servidor exposto [4].

Tabela 3. Linha do tempo do incidente na Alpine Linux, em 2026
DataEvento
12 de outubroO GitLab publica a correção da CVE-2026-97229 [4]
13 de outubroA Alpine atualiza, por engano, para 19.3.4, e não para 19.3.5, que tinha a correção [4]
20 de outubroO atacante cria uma conta e começa a sondar [4]
21 de outubroAtaque principal; trabalhadores caem, com erros 502 e jobs de CI falhando [4]
22 de outubroAtualização para 19.3.6, que não corrige a instância, porque a imagem da Alpine usa Ruby padrão [4]
23 de outubroConta do atacante bloqueada; Ruby 3.3.13, 3.4.12 e 4.0.9 publicados [4]
24 de outubroaports, pacotes e versões de 21 de outubro verificados contra registros externos [4]
25 e 26 de outubroO atacante tenta voltar, sem sucesso; a Alpine descobre que a instância seguia vulnerável [4]
27 de outubroAcesso restrito a desenvolvedores e servidores de build; reconstrução iniciada; imagem 19.3.6 com Ruby 3.3.13 publicada [4]
28 de outubroReconstrução concluída, senhas redefinidas e chaves secretas do GitLab trocadas [4]
29 de outubroInstância reaberta, já em 19.3.7; a CISA inclui a CVE no KEV [3] [4]

O atacante enviou configurações de CI com expressões regulares maliciosas, derrubou os trabalhadores oito vezes e, em quatro delas, avançou além da primeira etapa antes de falhar [4]. Também baixou a imagem de contêiner do GitLab da Alpine, o que sugere que ajustava o exploit à compilação exata [4]. Mais tarde, fez tentativas de login com senhas vazadas de outros sites [4] [5].

A Alpine não encontrou evidência de execução de código, mas não pôde descartá-la: parte dos registros do dia do ataque faltava e não havia registro de conexões de saída [4]. Por isso tratou a instância como comprometida e a reconstruiu [4]. As chaves de assinatura de pacotes nunca ficaram no servidor do GitLab, e a verificação de commits, pacotes e imagens contra 45 servidores de build não mostrou adulteração [4].

O que estaria exposto

A Alpine listou o que um exploit bem-sucedido teria alcançado: e-mails, nomes e IPs de usuários, hashes de senha, segredos de 2FA, variáveis de CI/CD e tokens de runners, credenciais de webhooks, integrações e espelhos, hashes de tokens de acesso pessoal e repositórios, issues e merge requests privados [4]. Um servidor GitLab comprometido é uma porta para a cadeia de suprimento de software de toda a organização.

06Verificação: a exposição do CiberLab

O repositório da plataforma CiberLab fica num servidor Gitea próprio, e não num GitLab. O Gitea é escrito em Go e não usa Ruby nem o Onigmo. A conclusão é que a plataforma não é afetada por nenhuma das duas falhas.

Tabela 4. Verificação do CiberLab contra as falhas do GitLab
Ponto verificadoEstadoResultado
Hospedagem do códigoRemoto git.lucasrguerra.dev.br, servidor GiteaNão afetado
Ruby na aplicaçãoAplicação Next.js em imagem Node.js, sem interpretador RubyNão afetado
Pipeline de CISem .gitlab-ci.yml no repositórioNão se aplica

A lição da seção 5 vale para qualquer servidor de código: o Gitea é exposto ao mesmo tipo de risco se o cadastro aberto permitir que estranhos criem repositórios e disparem automações. Mantenha o cadastro fechado e o servidor atualizado.

07Detecção

7.1Versões do GitLab e do Ruby

ShellCompilado de [4] [7]
# Ruby embutido no pacote Omnibus
/opt/gitlab/embedded/bin/ruby -v

# Resumo de versoes do GitLab e do Ruby
sudo gitlab-rake gitlab:env:info

# Em conteiner
docker exec <conteiner> ruby -v

7.2Sinais publicados pelo GitLab

O GitLab publicou duas detecções para instâncias próprias: queda de trabalhador nativo do Onigmo e rajada de erros de renderização Org mode [2]. A primeira cobre o padrão visto na Alpine; a segunda, o caminho associado à CVE-2026-110264 [2] [4].

7.3Sinais de abuso de CI

  1. Contas novas que enviam CI: contas criadas há pouco que fazem push de .gitlab-ci.yml em projetos públicos [3] [4].
  2. Expressões regulares longas ou com caracteres não ASCII: em regras de pipeline, combinadas com caminhos de repositório em UTF-8 incomuns [3].
  3. Quedas repetidas de trabalhadores: erros 502 e jobs de CI falhando em série logo após um push [4].
  4. Download da imagem do servidor: o atacante baixou a imagem de contêiner da instância para ajustar o exploit [4].
  5. Logins com senhas vazadas: tentativas automatizadas depois da exploração [4] [5].

7.4Regra Sigma para registros do GitLab

Sigma, categoria applicationDerivada de [2] [4], não validada em produção
title: Quedas de trabalhador do GitLab apos push de configuracao de CI
id: 5d2b8e31-7c4f-4a90-b6e2-1f3a9c0d7e58
status: experimental
description: Falhas de segmentacao em trabalhadores Puma ou Sidekiq do GitLab,
    padrao da exploracao da CVE-2026-97229 e da CVE-2026-110264
author: CiberLab (Ciência Embarcada)
references:
    - https://docs.gitlab.com/releases/patches/patch-release-gitlab-19-5-1-released/
    - https://alpinelinux.org/posts/GitLab-security-incident-CVE-2026-97229.html
logsource:
    product: gitlab
    category: application
detection:
    selection:
        message|contains:
            - 'Segmentation fault'
            - 'SIGSEGV'
        message|contains|all:
            - 'onig'
    condition: selection
falsepositives:
    - Defeitos nativos sem relacao com ataque
level: high
tags:
    - attack.initial_access
    - attack.t1190
    - cve.2026-97229
    - cve.2026-110264

08Mitigação e resposta a incidentes

8.1Correção definitiva

Atualize para 19.5.1, 19.4.3, 19.3.6, 19.2.9, 19.1.9, 19.0.10 ou 18.11.13, fora do ciclo normal [2] [3]. A versão inclui migrações de banco: instâncias de nó único terão indisponibilidade, e as de vários nós podem usar o procedimento sem parada [2]. Se o GitLab roda com Ruby próprio, atualize o Ruby para 3.3.13, 3.4.12, 4.0.9 ou superior; o Ruby 3.2 está fora de suporte e, segundo um relato, não receberá correção [4] [7]. Usuários da imagem alpinelinux/gitlab devem baixar de novo a etiqueta 19.3.6, reconstruída em 27 de outubro [4].

8.2Medidas temporárias

Restrinja o acesso anônimo a projetos públicos e impeça que usuários não confiáveis criem projetos ou escrevam neles [3]. Desligue o cadastro aberto. Essas medidas bloqueiam o caminho de entrega demonstrado, mas não corrigem o compilador [3].

8.3Resposta a um comprometimento

Uma instância que ficou vulnerável e exposta ao cadastro aberto, com quedas de trabalhadores sem explicação, deve ser tratada como a Alpine tratou a sua: restrinja o acesso, reconstrua a partir de imagem limpa, redefina todas as senhas e troque as chaves secretas do GitLab [4]. Gire também variáveis de CI/CD, tokens de runners, credenciais de webhooks, integrações e espelhos, e tokens de acesso pessoal, que estavam ao alcance do processo [4]. Verifique a integridade dos repositórios e dos artefatos publicados contra cópias externas [4]. Órgãos sujeitos à diretiva da CISA devem fazer triagem forense antes de atualizar [7].

Não espere o registro que falta

A Alpine não tinha registro de conexões de saída e perdeu parte dos registros do dia do ataque, por isso não pôde provar que o exploit falhou [4]. Habilite e guarde fora do servidor os registros de rede de saída do GitLab antes do próximo incidente, e não depois dele.

8.4Mapeamento de técnicas MITRE ATT&CK

IDs e nomes conferidos na base oficial do MITRE ATT&CK for Enterprise [8]:

Tabela 5. Mapeamento de táticas e técnicas conforme MITRE ATT&CK
TécnicaNomeRelação com o caso
T1190Exploit Public-Facing ApplicationExpressão regular maliciosa enviada ao GitLab exposto [1] [3]
T1059.004Command and Scripting Interpreter: Unix ShellComandos do sistema como o usuário git [3]
T1588.005Obtain Capabilities: ExploitsExploit ajustado à imagem de contêiner baixada da vítima [4]
T1078Valid AccountsTentativas de login com senhas vazadas de outros sites [4] [5]
T1499.004Endpoint Denial of Service: Application or System ExploitationOito quedas de trabalhadores, com erros 502 e CI interrompido [4]

09Indicadores de comprometimento

A Alpine não divulgou IPs, nomes de usuário nem arquivos do atacante, e nenhuma outra fonte publicou indicadores de rede [4]. Os indicadores abaixo são de exposição e de comportamento:

Tabela 6. Indicadores de comprometimento e artefatos de detecção
TipoIndicadorSeveridadeContexto e ação
Vulnerabilidade CVE-2026-97229 Crítica RCE pelo CI/CD, no KEV desde 29/10. Atualize GitLab e Ruby [1] [4].
Vulnerabilidade CVE-2026-110264 Crítica RCE no compilador de regex, desde a 7.0. Atualize para as versões de 21/10 [2].
Versão ruby -v abaixo de 3.3.13, 3.4.12 ou 4.0.9 Crítica Em instalação com Ruby próprio, a instância segue vulnerável [4].
Registro queda de trabalhador nativo do Onigmo Alta Detecção publicada pelo GitLab [2].
Registro rajada de erros de renderização Org mode Alta Detecção publicada pelo GitLab [2].
Comportamento conta nova com push de .gitlab-ci.yml Alta Padrão de entrega do ataque à Alpine [3] [4].
Comportamento download da imagem do servidor por conta externa Média Sinal de ajuste do exploit à compilação da vítima [4].

10Limitações da análise

  1. Ausência de detonação: o CiberLab não reproduziu as falhas nem executou a prova de conceito da Rapid7. A mecânica vem das referências [1] a [7].
  2. Detalhe escasso da CVE-2026-110264: o GitLab não descreve o caminho de ataque, e a ligação com o Org mode vem de fontes secundárias e do sinal de detecção publicado [2] [6].
  3. Contagem da Censys anterior à correção: os 25.766 hosts vulneráveis são de 13 de outubro e vêm de fonte secundária [7]; o número atual é menor.
  4. Regra derivada: a regra Sigma da seção 7.4 foi deduzida dos sinais publicados e não foi testada; o formato das mensagens de queda varia entre versões.

11Referências

  1. [1] GitLab Critical Patch Release: 19.4.2, 19.3.5, 19.2.8. GitLab, 12 de outubro de 2026. Aviso oficial da CVE-2026-97229, vetor CVSS, crédito e patches do Ruby. https://docs.gitlab.com/releases/patches/patch-release-gitlab-19-4-2-released/
  2. [2] GitLab Critical Patch Release: 19.5.1, 19.4.3, 19.3.6, 19.2.9, 19.1.9, 19.0.10, 18.11.13. GitLab, 21 de outubro de 2026. Aviso oficial da CVE-2026-110264, versões, detecções publicadas e impacto da atualização. https://docs.gitlab.com/releases/patches/patch-release-gitlab-19-5-1-released/
  3. [3] CVE-2026-97229: Critical Unauthenticated Remote Code Execution in GitLab. Rapid7, atualizado em 30 de outubro de 2026. Causa raiz na recompilação UTF-8, pré-requisitos, reprodução em 19.4.1 e inclusão no KEV. https://www.rapid7.com/blog/post/etr-cve-2026-97229-critical-unauthenticated-remote-code-execution-in-gitlab/
  4. [4] GitLab security incident (CVE-2026-97229). Alpine Linux, outubro de 2026. Relato de primeira mão do ataque, cronologia, verificações, dados potencialmente expostos e recomendações. https://alpinelinux.org/posts/GitLab-security-incident-CVE-2026-97229.html
  5. [5] Max Severity GitLab Vulnerability Exploited Against Alpine Linux. SecurityWeek, 30 de outubro de 2026. Resumo do incidente, versões do Ruby e inclusão no KEV com prazo de três dias. https://www.securityweek.com/max-severity-gitlab-vulnerability-exploited-against-alpine-linux/
  6. [6] GitLab Critical Patch Release Fixes 10.0 CVSS Remote Code Execution Flaw and 11 Other Bugs. SecurityOnline, outubro de 2026. CWE, faixa de versões desde a 7.0 e ausência de exploração conhecida da CVE-2026-110264. https://securityonline.info/gitlab-critical-patch-release-cve-2026-110264/
  7. [7] GitLab CVE-2026-97229: CVSS 10.0 Joins CISA KEV. Tech Insider, outubro de 2026. Contagem da Censys, comandos de verificação do Ruby, prazo federal e situação do Ruby 3.2. https://tech-insider.org/gitlab-cve-2026-97229-cvss-10-cisa-kev-ruby-patch-2026/
  8. [8] MITRE ATT&CK Enterprise. The MITRE Corporation. Fonte dos IDs e nomes de técnica da tabela 5, conferidos em 2 de novembro de 2026. https://attack.mitre.org/

GitLab: regex que executa código, CVE-2026-97229 e CVE-2026-110264. Relatório técnico de análise de vulnerabilidade, versão 1.0, emitido em 2 de novembro de 2026.
CiberLab, uma iniciativa do Ciência Embarcada.
Classificado TLP:CLEAR: distribuição livre, sem restrição de compartilhamento.