// HEISE ONLINE — CYBERSECURITY
Hinter kritischen GitLab-Lücken stecken Fehler in der Regex-Engine von Ruby
Die kritischen GitLab-Lücken der letzten Wochen gehen auf drei jetzt behobene Fehler in Rubys Regex-Engine zurück. CVE-Scanner schlagen auf sie nicht an.
Das Ruby-Team hat die Versionen 4.0.9, 3.4.12 und 3.3.13 veröffentlicht. Diese beheben drei Fehler in der Regex-Engine Onigmo, die zur Ausführung von Schadcode auf den betroffenen Servern führen können.
Der prominenteste Fall dafür sind die in den letzten Wochen bekannt gewordenen Lücken bei dem auf Ruby basierenden GitLab. Betroffen ist aber jede Ruby-Anwendung, die reguläre Ausdrücke aus fremden Eingaben erzeugt. Nur wer selbst geschriebene Muster verwendet, muss sich laut Ruby-Team keine Sorgen machen. Bevor Ruby ein Muster auf einen Text anwendet, übersetzt es das Muster in ein internes Programm. In diesem Schritt, dem Kompilieren, liegen die Fehler, nicht erst im Abgleich.
Das ist bei GitLab der Fall, denn der Dienst kompiliert reguläre Ausdrücke aus Nutzereingaben, etwa aus CI/CD-Konfigurationen. Der Sicherheitsforscher Johan Carlsson meldete über das Bug-Bounty-Programm vier Lücken: CVE-2026-89078 und CVE-2026-93577 mit einem CVSS-Wert von 9,9 sowie CVE-2026-97229 und CVE-2026-110264 mit dem Höchstwert 10,0, beide ohne Anmeldung ausnutzbar. GitLab schloss sie zwischen dem 23. September und dem 21. Oktober, indem es das mitgelieferte Ruby selbst patchte. Das jüngste Update betrifft alle GitLab-Versionen seit 7.0 aus dem Jahr 2014.
Das Ruby-Team ordnet die vier CVEs drei Fehlern zu: Hinter CVE-2026-89078 steckt eine doppelte Speicherfreigabe beim Einlesen eines Musters. Hinter CVE-2026-93577 und CVE-2026-97229 steckt ein Ganzzahlüberlauf bei der Berechnung der Größe des kompilierten Programms und hinter CVE-2026-110264 ein Überlauf interner Zähler bei Mustern mit sehr vielen Wiederholungen.
Keiner der drei Fixes ist neu. Die doppelte Speicherfreigabe ist seit Mai 2025 im Entwicklungszweig korrigiert und steckt seit Ruby 4.0.0 in einer Release-Version. Der Fix für die Zähler hinter CVE-2026-110264 folgte im April 2026, der für die Programmgröße im September 2026. In eine Release-Version schafften es letztere erst jetzt: Ruby 4.0.8 vom 22. Oktober brachte den Fix für die Programmgröße als Teil eines Routine-Updates, ohne ein Wort zur Sicherheit. Einen Tag später erschien 4.0.9 mit dem letzten fehlenden Fix, und die stabilen Zweige 3.4 und 3.3 bekamen alle drei auf einmal. Ruby 3.3 erhält eigentlich nur noch Sicherheitskorrekturen; 3.3.13 erscheint ausdrücklich als Ausnahme, weil GitLab CVEs vergeben hat. Für Ruby 3.2 und älter gibt es keine Updates mehr.
Wie eine Anwendung die gefährdete Stelle erreicht, zeigt eine Suchfunktion in einem Rails-Controller, die eine Liste von Titeln im Speicher filtert:
Der Parameter q stammt aus der Webanfrage. Mit der Eingabe Rechnung sucht die Anwendung beispielsweise nach diesem Wort, mit ^Rechnung.*2026$ nach Titeln mit passendem Anfang und Ende. Damit kontrollieren Nutzer aber auch das Muster, das Ruby kompiliert, und ein Angreifer kann hier ein präpariertes übergeben. Auf einen Titel angewendet werden muss es dafür nicht: Der Speicherfehler passiert in der ersten Zeile, in Regexp.new. Dasselbe gilt für Regexp.union und für ein interpoliertes Literal wie /#{params[:q]}/.
Im schlimmsten Fall läuft dann Code des Angreifers mit den Rechten des Ruby-Prozesses, also mit allem, auf das die Anwendung selbst Zugriff hat: Datenbank, Secrets aus der Umgebung, Dateisystem. Wahrscheinlicher ist bei einem einzelnen Versuch ein Absturz des Prozesses, der die Anfrage bearbeitet. Wiederholt wird daraus ein Denial of Service ohne Anmeldung. Aktive Angriffe meldet bislang weder GitLab noch Ruby.
Oft braucht so eine Suche die Regex-Engine gar nicht. Wer nur den eingegebenen Text finden will, vergleicht Zeichenketten, und die Eingabe kommt bei Regexp.new nie an: