Der Kern des Problems liegt darin, dass vom Nutzer übergebene Push-Optionen nicht ausreichend bereinigt wurden, bevor ihre Werte in den internen X-Stat-Header übernommen wurden. Da das interne Metadatenformat ein Semikolon als Trennzeichen nutzt, das ebenso in Nutzereingaben auftauchen kann, ließen sich über manipulierte Push-Optionen zusätzliche Metadatenfelder einschleusen. In der zugehörigen GitHub-Sicherheitsmeldung heißt es, ein Angreifer könne auf diesem Weg eigene Metadatenfelder durch präparierte Werte einbringen.
GitHubs Chief Information Security Officer Alexis Wales beschreibt die Folgen so: Durch das Verketten mehrerer eingeschleuster Werte hätten die Forscher gezeigt, dass ein Angreifer die Umgebung, in der der Push verarbeitet wird, überschreiben, die normalerweise greifenden Sandbox-Schutzmechanismen für die Ausführung von Hooks umgehen und letztlich beliebige Befehle auf dem Server ausführen kann.
Wiz bezeichnet die Lücke in einer abgestimmten Veröffentlichung als „bemerkenswert einfach" auszunutzen und betont, dass sie eine Remote-Code-Ausführung auf gemeinsam genutzten Speicherknoten erlaubt. Zum Zeitpunkt der Offenlegung waren demnach rund 88 Prozent der Instanzen angreifbar. Die Angriffskette für die Codeausführung kombiniert drei Injektionen.
„Mit nicht durch eine Sandbox eingeschränkter Codeausführung als der git-Nutzer hatten wir die volle Kontrolle über die GHES-Instanz, einschließlich Lese- und Schreibzugriff auf das Dateisystem sowie Einblick in die interne Dienstkonfiguration", erklärt Wiz-Sicherheitsforscher Sagi Tzadik.
Auf GitHub.com greift normalerweise ein Schalter für den Enterprise-Modus, der bei GitHub Enterprise Server auf „true" steht, auf GitHub.com hingegen auf „false" – wodurch der Pfad für benutzerdefinierte Hooks inaktiv bleibt. Da auch dieser Schalter im X-Stat-Header übergeben wird, lässt er sich mit demselben Mechanismus manipulieren, sodass sich Code ebenso auf GitHub.com ausführen ließ.
Verschärft wird das durch GitHubs mandantenübergreifende Architektur mit gemeinsam genutzter Backend-Infrastruktur: Laut dem Unternehmen eröffnete eine Codeausführung auf GitHub.com einen mandantenübergreifenden Zugriff, mit dem sich Millionen von Repositories auf einem gemeinsam genutzten Speicherknoten lesen ließen – unabhängig von Organisation oder Nutzer.
Wiz zieht daraus eine grundsätzliche Lehre: Ein einziges „git push"-Kommando habe genügt, um eine Schwachstelle in GitHubs internem Protokoll auszunutzen und Code auf der Backend-Infrastruktur auszuführen. Wenn mehrere, in unterschiedlichen Sprachen geschriebene Dienste Daten über ein gemeinsames internes Protokoll austauschen, würden die Annahmen jedes Dienstes über diese Daten zu einer kritischen Angriffsfläche. Teams, die solche Mehrdienst-Architekturen aufbauen, rät Wiz zu prüfen, wie nutzergesteuerte Eingaben durch interne Protokolle fließen – besonders dort, wo sicherheitskritische Konfiguration aus gemeinsam genutzten Datenformaten abgeleitet wird.
