LuaRocks.org wurde über als Bytecode geladene Rockspecs übernommen
LuaRocks.org, das Paketverzeichnis der Sprache Lua, hat einen Bericht über eine Schwachstelle zur Codeausführung aus der Ferne veröffentlicht, die auf dem Server ausgenutzt wurde. Gemeldet wurde sie laut Bericht am 25. September, koordiniert über die CISA, behoben am 26. September - und die Untersuchung ergab, dass sie seit dem 9. Juli mehrfach ausgenutzt worden war. Die Seite läuft jetzt auf einem neu aufgesetzten Server, und alle Zugangsdaten des alten wurden widerrufen.
Lehrreich ist der Mechanismus. Eine Rockspec ist eine Lua-Datei; beim Hochladen führt die Seite sie aus, um Felder wie Paketname und Version zu lesen. Um das sicher zu tun, lud sie die Datei mit loadstring, führte sie in einer leeren Umgebung aus und begrenzte die Zahl der Instruktionen. In Lua 5.1 und LuaJIT nimmt loadstring jedoch standardmäßig zwei Eingabearten an: Quellcode und vorkompilierten Bytecode. Der Parser erwartete nur Quellcode, wies loadstring aber nie an, Bytecode abzulehnen. LuaJIT prüft Bytecode nicht; eine präparierte Datei kann Speicher außerhalb ihrer eigenen Daten lesen und schreiben, den echten Lua-Zustand finden und die Funktionen aufrufen, die die Sandbox verbergen sollte. Jeder registrierte Nutzer konnte das per Upload einer Rockspec auslösen.
Die Korrektur übergibt loadstring den Nur-Text-Modus und lehnt zudem jede Datei ab, die mit dem Bytecode-Markierungsbyte beginnt, weil PUC Lua 5.1 den Modus ignoriert. Der Code, der Manifeste von anderen Servern liest, hatte denselben Fehler. Das Projekt fand drei eigens angelegte Konten, die Shell-Befehle ausführten und am 7. August drei Schadpakete veröffentlichten - bcrcewon, 7e0b94029db0 und 7e0b9402f9c8 -, inzwischen entfernt; wer sie installiert hat, sollte die Maschine als kompromittiert behandeln. Ein Abgleich der gespeicherten Dateien mit einem täglichen Spiegel außerhalb des Servers ergab keinen Hinweis, dass bestehende Pakete verändert wurden.
Nutzer sollen neue API-Schlüssel anlegen, sich neu anmelden, Passwörter ändern (die bcrypt-Hashes gelten als offengelegt), die Zwei-Faktor-Anmeldung neu einrichten und den LuaRocks-Client auf 3.12 oder neuer aktualisieren - ältere Clients laden Rockspecs und Manifeste auf dieselbe Weise und würden unter LuaJIT oder Lua 5.1 Bytecode ausführen, den ein Server schickt.

Was das bedeutet
"Die fremde Datei in leerer Umgebung ausführen" klingt nach Sandbox, begrenzt aber nur, welche Namen der Code nachschlagen kann. Bytecode braucht keine Namen. Die Lehre gilt für jede Sprache mit einem Lader, der mehr als ein Format annimmt: das erwartete Format angeben und die anderen ausdrücklich ablehnen.
Der Bericht ist zudem ein Vorbild im Umgang mit einem Einbruch: Zeitablauf, genauer Mechanismus, benannte Schadpakete, offengelegte Daten und ein externer Spiegel, mit dem sich die Integrität gegen eine Kopie prüfen ließ, an die der Angreifer nicht herankam.