Security Advisory

x2gowebrpc Unauthenticated OS Command Injection

Durch das Ausnutzung einer Argument-Injection Schwachstelle können unauthentifizierte Angreifer beliebige Betriebssystem Befehle ausführen.

Advisory ID: MLSA-2023-001
CVE: Keine
CVSS: CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H
Kritikalität: critical
Betroffene Versionen: alle Versionen
Behoben in: nicht behoben
Gefunden von: Hans-Martin Münch

Produktbeschreibung (englisch)

The x2gorpc.cgi CGI script connects to the X2Go server using SSH and starts sessions, resumes sessions, starts SSH tunnels and so on in response to requests from the browser. This involves using SSH to run x2golistsessions, run x2gostartagent, start a tunnel using SSH’s -N and -L arguments, run x2goruncommand, and run x2gowswrapper.

Details

Wenn eine X2Go-Sitzung gestartet wird, führt das Skript x2gorpc.cgi einen SSH-Befehl mit den vom Benutzer übergebenen Argumenten aus. Die Argumente für den SSH-Befehl werden im oberen Teil des Skripts definiert. In den erweiterten Einstellungen des HTML-Clients kann der Benutzer die Verwendung einen Proxy-Server festlegen. Wenn diese Option ausgewählt ist, verwendet der SSH-Befehl ein ProxyCommand-Argument, das selbst einen SSH-Befehl enthält. Innerhalb des ProxyCommand werden dabei die vom Angreifer kontrollierten Parameter “$proxyuser” und “$proxy” verwendet:

 1
 2$action = $q->param('action');
 3$user = $q->param('user');
 4$pass = $q->param('pass');
 5$server = $q->param('server');
 6$proxy=$q->param('proxy');
 7$proxyuser=$q->param('proxyuser');
 8$proxypass=$q->param('proxypass');
 9
10my @sshparams;
11
12if($proxy)
13{
14   @sshparams=('-o', 'UserKnownHostsFile=/dev/null', '-o', "ProxyCommand=ssh -W %h:%p -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no  -l $proxyuser $proxy", '-o', 'StrictHostKeyChecking=no',   '-l', "$user", "$server");
15}
16else
17{
18   @sshparams=('-o', 'StrictHostKeyChecking=no', '-o', 'UserKnownHostsFile=/dev/null',  '-l', "$user", "$server");
19}

Die vom Benutzer übergebenen Befehlszeilenargumente für den ProxyCommand werden nicht als Array übergeben werden, sondern als Strings aneinandergehängt sind. Dies macht den Befehl anfällig für Argument-Injections und erlaubt es, zusätzliche Argumente an den zweiten ssh-Aufruf zu übergeben. Angreifer können dies missbrauchen, um ein eigenes “ProxyCommand”-Argument zum Aufruf hinzuzufügen und so beliebige Betriebssystembefehle auszuführen.

Workarounds

Auskommentieren der Proxy-Unterstützung im CGI Skript.

Coordinated Disclosure Zeitverlauf

  • 02/01/2023 Initialer Kontakt über die Mailingliste der x2go Entwickler, Frage nach einem Security-Ansprechpartner
  • 02/01/2023 Auto-Response der Mailingliste, unsere Nachricht muss erst von einem Moderator geprüft werden.
  • 24/01/2023 Response der Mailingliste, die Nachricht wird blockiert bis die Liste aboniert wurde.
  • 26/01/2023 Kontakt durch die x2go Entwickler, Fragen nach Details zur Schwachstelle
  • 26/01/2023 Antwort von MOGWAI LABS, Versenden der Details, inklusive Proof of Concept Exploit. Nachfrage ob eine CVE angefordert wird.
  • 26/01/2023 Rückmeldung von x2go, das Projekt befindet sich noch in Entwicklung, daher wird keine CVE beantragt.
  • 26/01/2023 Rückmeldung von x2go, der Entwickler hat den Webclient mit einer entsprechenden Warnung versehen, wird sich das Problem weiter anschauen.