Die Ursache der Schwachstelle liegt laut Rails darin, dass verschiedene Bibliotheken und Funktionen Dateien auf unterschiedliche Weise interpretieren. Rails selbst kann sich auf den vom Client gelieferten Inhaltstyp verlassen, um einen Blob als Bild zu behandeln. libvips hingegen bestimmt den Dateityp anhand der Magic Bytes.
Genau diese Diskrepanz lässt sich ausnutzen: Ein Angreifer präpariert eine Datei und deklariert sie als MATLAB Level 5. libvips wählt daraufhin den MATLAB-Loader, die Datei landet bei libmatio, das in einem Headerfeld MAT 7.3 erkennt und sie an HDF5 weitergibt.
„Die External File List von HDF5 erlaubt es, die Bytes eines Datensatzes in einer anderen Datei liegen zu lassen, die über Pfad und Offset benannt wird. Beim Rendern des ‚Bildes‘ wird also eine vom Angreifer gewählte Datei auf dem Server gelesen und ihr Inhalt als Pixel zurückgegeben. Dieselbe Verwechslung, zweimal, auf zwei Ebenen, die die Felder der jeweils anderen nicht sehen können", erläutert Rails.
Damit kann ein nicht authentifizierter Angreifer alles auslesen, worauf der Rails-Prozess Zugriff hat — einschließlich der Datenbank mit Zugangsdaten und der Storage-Schlüssel. Mit den erbeuteten Geheimnissen lassen sich anschließend Sitzungen fälschen, weitere Systeme erreichen und beliebiger Code aus der Ferne ausführen.
Besonders unangenehm ist ein Befund, den VulnCheck bei Tests auf einem gepatchten Server der Version 8.1.3.1 erhob: „Der Fix blockiert zwar das Auslesen von Dateien über libvips, neutralisiert aber nicht die Marshal-Deserialisierung des Variation Key: Das RCE-Gadget wird auf einem gepatchten Server weiterhin ausgeführt, sofern eine gültige Signatur vorliegt."
Betreiber betroffener Anwendungen sollten damit sowohl den Patchstand prüfen als auch die von Rails veröffentlichten forensischen Werkzeuge einsetzen, um bereits erfolgte Ausnutzungsversuche zu identifizieren.
