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.
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].
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].
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.
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].
| Campo | CVE-2026-97229 | CVE-2026-110264 |
|---|---|---|
| Título oficial | Integer 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 fraqueza | CWE-190, estouro de inteiro [3] | CWE-190, estouro de inteiro [6] |
| Vetor CVSS 3.1 | AV: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 entrada | Expressã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ção | 12 de outubro de 2026 [1] | 21 de outubro de 2026 [2] |
| Crédito | joaxcar, via HackerOne [1] | joaxcar, via HackerOne [2] |
| Exploração | Confirmada; KEV em 29 de outubro [3] [5] | Sem exploração nem prova de conceito pública conhecidas [6] |
| Ramo | CVE-2026-97229 corrigida em | CVE-2026-110264 corrigida em |
|---|---|---|
| 19.5 | Não afetado na publicação [1] | 19.5.1 [2] |
| 19.4 | 19.4.2 [1] | 19.4.3 [2] |
| 19.3 | 19.3.5 [1] | 19.3.6 [2] |
| 19.2 | 19.2.8 [1] | 19.2.9 [2] |
| 19.1, 19.0 e 18.11 | Fora da faixa afetada [1] | 19.1.9, 19.0.10 e 18.11.13 [2] |
| 7.0 a 18.10 | Fora da faixa afetada [1] | Afetados, sem versão corrigida no ramo [2] |
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.
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].
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].
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].
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].
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].
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].
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].
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].
| Data | Evento |
|---|---|
| 12 de outubro | O GitLab publica a correção da CVE-2026-97229 [4] |
| 13 de outubro | A Alpine atualiza, por engano, para 19.3.4, e não para 19.3.5, que tinha a correção [4] |
| 20 de outubro | O atacante cria uma conta e começa a sondar [4] |
| 21 de outubro | Ataque principal; trabalhadores caem, com erros 502 e jobs de CI falhando [4] |
| 22 de outubro | Atualização para 19.3.6, que não corrige a instância, porque a imagem da Alpine usa Ruby padrão [4] |
| 23 de outubro | Conta do atacante bloqueada; Ruby 3.3.13, 3.4.12 e 4.0.9 publicados [4] |
| 24 de outubro | aports, pacotes e versões de 21 de outubro verificados contra registros externos [4] |
| 25 e 26 de outubro | O atacante tenta voltar, sem sucesso; a Alpine descobre que a instância seguia vulnerável [4] |
| 27 de outubro | Acesso restrito a desenvolvedores e servidores de build; reconstrução iniciada; imagem 19.3.6 com Ruby 3.3.13 publicada [4] |
| 28 de outubro | Reconstrução concluída, senhas redefinidas e chaves secretas do GitLab trocadas [4] |
| 29 de outubro | Instâ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].
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.
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.
| Ponto verificado | Estado | Resultado |
|---|---|---|
| Hospedagem do código | Remoto git.lucasrguerra.dev.br, servidor Gitea | Não afetado |
| Ruby na aplicação | Aplicação Next.js em imagem Node.js, sem interpretador Ruby | Não afetado |
| Pipeline de CI | Sem .gitlab-ci.yml no repositório | Nã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.
# 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
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].
.gitlab-ci.yml em projetos públicos [3] [4].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
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].
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].
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].
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.
IDs e nomes conferidos na base oficial do MITRE ATT&CK for Enterprise [8]:
| Técnica | Nome | Relação com o caso |
|---|---|---|
| T1190 | Exploit Public-Facing Application | Expressão regular maliciosa enviada ao GitLab exposto [1] [3] |
| T1059.004 | Command and Scripting Interpreter: Unix Shell | Comandos do sistema como o usuário git [3] |
| T1588.005 | Obtain Capabilities: Exploits | Exploit ajustado à imagem de contêiner baixada da vítima [4] |
| T1078 | Valid Accounts | Tentativas de login com senhas vazadas de outros sites [4] [5] |
| T1499.004 | Endpoint Denial of Service: Application or System Exploitation | Oito quedas de trabalhadores, com erros 502 e CI interrompido [4] |
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:
| Tipo | Indicador | Severidade | Contexto 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]. |
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.