Sicherheitshinweise

Speicherzugriff aufgrund eines Fehlers bei der Codegenerierung im Cranelift Modul

21. Mai 2021

Im Folgenden finden Sie ein Fastly Security Advisory (FSecA, Fastly Sicherheits- und Warnhinweise), in dem eine Untersuchung von CVE-2021-32629 beschrieben wird. Dabei handelt es sich um einen Fehler in 0.73.0 des Cranelift x64-Backends, das zur Erstellung von WebAssembly Modulen verwendet wird, darunter auch die Module, die von Fastly Kunden auf Compute@Edge verwendet werden. Dieser Fehler wurde durch eine kürzliche Veröffentlichung der Bytecode Alliance[1] aufgedeckt.


In diesem FSecA erklären wir, dass wir den Gültigkeitsbereich und die Auswirkungen dieser Untersuchung genau verstehen, und beschreiben die umgesetzten Abhilfemaßnahmen.


Gültigkeitsbereich


Diese Sicherheits- und Warnhinweise gelten für Kunden, die Compute@Edge verwenden und deren Module zwischen dem 8. März und 22. April 2021 hochgeladen wurden. Außerhalb dieses Zeitrahmens hochgeladene Module sind davon nicht betroffen.


Zusammenfassung


Der im Cranelift x64-Backend identifizierte Fehler führt eine Vorzeichenerweiterung anstelle einer Nullerweiterung für einen vom Stack geladenen Wert durch, wenn der Register-Allokator einen ganzzahligen Wert-Spill mit weniger als 64 Bit neu lädt. Dies wirkt sich negativ auf eine andere Optimierung aus: Der Befehlsselektor lässt einen Zero-Extend-Operator mit 32 bis 64 Bit aus, wenn wir aber doch wissen, dass ein Befehl, der einen 32-Bit-Wert erzeugt, die oberen 32 Bit des Zielregisters tatsächlich auf Null setzt. Daher verlässt sich der x64-Compiler auf diese auf Null gesetzten Bits, aber der Wertetyp ist immer noch i32 und der Spill/Reload stellt diese Bits als Vorzeichenerweiterung des MSB von i32 wieder her.


Der Fehler tritt also auf, wenn:



  • ein i32-Wert größer als oder gleich 0x8000_0000 ist,

  • der Wert vom Register-Allokator überlaufen und neu geladen wird, weil im Programm zwischen der Definition des Wertes und seiner Verwendung ein hoher Registerdruck herrscht,

  • der Wert durch einen Befehl erzeugt wird, von dem wir wissen, dass er insofern „speziell“ ist, als er die oberen 32 Bit des Ziels auf Null setzt: add, sub, mul, and, or,

  • der Wert dann per Zero-Extend auf 64 Bit erweitert wird,

  • der resultierende 64-Bit-Wert verwendet wird.


Unter diesen Umständen besteht die Möglichkeit einer Sandbox-Umgehung, wenn der i32-Wert ein Pointer ist. Der übliche Code, der für Heap-Zugriffe ausgestellt wird, setzt die WebAssembly Heap-Adresse auf Null, fügt sie zu einer 64-Bit-Heap-Basis hinzu und lädt die resultierende Adresse. Wenn die Nullerweiterung in eine Vorzeichenerweiterung umgewandelt wird, läuft das Programm möglicherweise rückwärts und greift auf Speicher bis zu 2 GiB vor Beginn des Heap zu.


Dies hat zur Folge, dass die Ausführung eines böswilligen Moduls höchstwahrscheinlich in einem Absturz resultieren würde (aufgrund einer Behauptung einer ungültigen LUCET_MAGIC), wenn der vorherige Instanz-Slot nicht ausgeführt wurde, oder der Prozess aufgrund einer Out-of-Bounds-Beschränkung komplett in sich zusammenbräche. Fastly hat herausgefunden, dass ein speziell entwickeltes WebAssembly Modul die anfällige Version des Cranelift Compilers im Erstellungsprozess auf Compute@Edge möglicherweise angreift. Wenn das geschieht, greift das WebAssembly Modul möglicherweise auf einen Speicher in einer anderen Sandbox zu oder behindert den Kontrollfluss im Compute@Edge Daemon.


Diese Anfälligkeit wurde bei einer routinemäßigen Überwachung von ungewöhnlichem Verhalten von WebAssembly Modulen auf Compute@Edge entdeckt und im Rahmen einer Analyse eines Moduls identifiziert, das vom Sicherheitswissenschaftler Javier Cabrera Arteaga vom KTH Royal Institute of Technology hochgeladen wurde. Im Zuge der Untersuchung dieses ungewöhnlichen Verhaltens bestätigten Fastly Entwickler den Fehler. Es wurde darüber hinaus erkannt, dass er absichtlich eingesetzt werden könne. Fastly hat daraufhin in Zusammenarbeit mit der Bytecode Alliance einen Offenlegungsprozess eingeleitet.


Abhilfemaßnahmen


Wir haben WebAssembly Module auf Compute@Edge überprüft und konnten bestätigen, dass keine der WebAssembly Module auf Compute@Edge dieses Fehlverhalten instrumentalisieren.


Es sind keine weiteren Maßnahmen von Compute@Edge Kunden erforderlich; das Problem wurde mit den folgenden Hinweisen vollständig behoben:



  • Keine der Kundenanfragen wurden von Modulen bedient, die von diesem Problem betroffen sind.

  • Die Schwachstelle wurde in der Compute@Edge Cranelift Implementierung gepatcht.

  • Alle von Kunden genutzten WebAssembly Module wurden mithilfe des aktualisierten Compilers neu kompiliert.


Danksagung


Dieser Fehler wurde von Fastly Entwicklern infolge eines gemeinschaftlichen Berichts von Javier Cabrera Arteaga, KTH Royal Institute of Technology, und des Projekts Trustful von Stiftelsen för Strategisk Forskning identifiziert.
Referenzen
[1] https://github.com/bytecodealliance/wasmtime/security/advisories/GHSA-hpqh-2wqx-7qp5


Kontaktinformationen


Sollten Sie weitere Fragen haben, wenden Sie sich bitte an Fastly Customer Engineering unter support@fastly.com oder an das Fastly Sicherheitsteam unter security@fastly.com

Melden Sie sich für die Sicherheitshinweise an.

Mit der Übermittlung Ihrer Anfrage erklären Sie sich damit einverstanden, dass Ihre personenbezogenen Daten zur Verarbeitung gemäß unserer Datenschutzrichtlinie an Fastly in den USA übermittelt werden.