Hi!
Mein Name ist Moritz Zwerger oder Bixilon
Softwareentwickler aus München
Fühl dich frei mir etwas Nettes zu schreiben:
LabyMod Sicherheitsfehler
Zurück zur StartseiteVorgeschichte:
In LabyMod gibt es sogenannte Daily Coins. Irgendwie wollte ich diese einfach haben, zudem hatte ich nicht viel zu tun. Also erst mal geschaut wie das funktioniert: Jeden Tag muss man Minecraft starten und sich im LabyMod Dashboard anmelden. Dort muss man auf den Button "Abholen" klicken und schon hat man 5 Coins mehr (5 sind nicht viel, Umgerechnet sind 1000 Coins 1€). Nach gewissen "login streaks" (10 Tage, 30, 100, ...) bekommt man einen Boni. Um ehrlich zu sein, bin ich viel zu faul mich jeden Tag anzumelden und auf diesen Button zu drücken, außerdem vergesse ich das oft:). Also ging das weiter zum Bot:
Der Bot (und der Begin)
Los gegangen ist es mit Wireshark: Erstmal alle Pakete von und zu LabyMod gesnifft. Dort ist mir gleich aufgefallen, dass unverschlüsselte Verbindungen gesendet werden (mehr dazu später). Den Bot habe ich letzendlich geschrieben, in dem mir JD-GUI geholfen hat LabyMod zu dekompilieren und dann alles von net.labymod.labyconnect zu kopieren. Jetzt alles von der GUI raus und den References zu den anderen Klassen, Debug Output, eigentlich schon fertig. Jetzt nur noch einen Timer um 4 Uhr morgens und bei Mojang automatisch anmelden. Done. 2 Anmerkungen: 1. Ich würde liebend gerne den Bot Open Source zur Verfügung stellen, darf das allerdings nicht, da ich LabyMod nicht um Erlaubnis gebeten habe und nicht beten werde (ca. 90% des Codes stammt von LabyMod). 2. Der Bot ist nicht im Fokus dieses Blogsartikels und wird deswegen auch nicht groß erwähnt.
Die ersten Lücken
Wireshark: Ein sehr wichtiges Tool. Sofort sind bei mir die Alarmglocken auf rot gewesen, als dort der Updater an dl.labymod.net angefragt hat nach einem Download. http wird nicht verschlüsselt und nicht signiert. Das heißt: Jeder Hacker, der eine Man in the Middle Attacke macht (Ist nicht sehr schwer), kann diese Daten manipulieren, ein fake Update an den Client schicken. Der Hacker kann jedes x beliebige Java Programm (naja fast zumindest) schicken: Easy Remote Code Execution.
Zusätzlich habe ich auch gesehen, dass Cape Daten, ... auch geschickt werden (nicht weiter schlimm, geht aber trotzdem niemanden an, was für Daten ein Client abfragt).
Schnell ein Issue auf LabyMod eröffnet und weiter gemacht (Zusätzlich habe ich eine Email geschickt um darauf speziell aufmerksam zu machen).
Was mich dann richtig aus der Fassung gebracht hat, war, dass die Socketverbindung unverschlüsselt ist! D.h. Ein Hacker kann ALLE Chatnachrichten lesen, den Client auf fremde Server schicken (Danke LabyParty), sich auf das Dashboard anmelden (Danke an das QuickLogin Zeug im Client), Freundschaften beenden, annehmen, ...
Da schon eine Antwort in der zwischen Zeit da war (Zitat: Wenn es wichtig wäre, hätte LabyMod das ja gemacht,...) habe ich die Situation klargestellt und auf die nächsten Lücken aufmerksam gemacht. Ich habe noch eine 2. Antwort geschickt, die ich im nachhinein gelöscht habe: Mir war nicht klar, wie die Authentifizierung läuft und habe behauptet, dass es keine gäbe und man damit keine mitm Attacke machen müsse: Aber Achtung: Fake News von mir!
LabyMod Version 3.6.7
Chaneglog: "Fixed some important security issues". So: Ich muss sagen: Fake news! Ungeheuerlich! Das einzige was behoben wurde ist (ein kleiner Schritt und immer noch viel zu wenig) die Remote Code Execution im LabyMod Client. Der Updater (der, der zum Updaten ausgeführt wird) fragt immer noch bei dl.labymod.net nach...Unverschlüsselt! Absolut unnötig dieses Update! Allerdings wurde mein Issue schon als erledigt makiert. Zudem ist mein Issue schon seit Tagen nicht mehr gelistet.
LabyMod Version 3.6.8
Im Changelog steht nichts brauchbares (zumindest für mich), allerdings hat LabyStudio auf mein Issue geantwortet und behauptet, dass jetzt alles gefixt wurde und sich bedankt für meine Hilfe. Ob das stimmt, lässt sich sehr schnell herausfinden und: Ja, die Remote Code Execution wurde gefixt (jetzt sendet auch der Updater die Anfragen verschlüsselt). Optifine schickt noch unverschlüsselt, Forge auch (OptiFine issue, Forge issue). LabyMod schickt immer noch eine Anfrage unverschlüsselt: disabled_addons.json: Diese Datei enthält eine Liste (sieht gehasht aus, habe aber aktuell keine Zeit, das heraus zu finden) von gebannten LabyMod Addons. Wenn ein Addon gebannt ist, löscht der Client dieses Addon (ich glaube sogar mit Configs). D.h. Wir können bei LabyMod Usern Addons löschen. Wie cool:)
Zusätzlich ist das Protokoll immer noch nicht verschlüsselt und der Changelog ist fehlerhaft.
kleines Update: Die Anfrage wurde anscheinend gefixt, es ist nicht mehr möglich. Komisch, dass ich eine solche Anfrage mitschneiden konnte. Auch wird das Protokoll teilweise verschlüsselt: Es wird ein symmetrischer Schlüssel von LabyMod verwendet und die Signatur vom originalen Server wird nicht überprüft. Die Verschlüsselung startet nach der Authentifizierung, was ich für falsch halte. Die Verbindung sollte vom Anfang an per RSA verschlüsselt sein.
Temporärer Fix
Da ich nicht ganz lebensmüde bin und einen simplen eigenen Fix wollte: Einfach diese Zeile in die Hosts Datei eintragen (Unter Linux: /etc/hosts; Unter Windows: C:\Windows\System32\drivers\etc\hosts):
0.0.0.0 dl.labymod.net mod.labymod.net
Das originale Issue
...ist hier zu finden: labymod.net. Im Falle, dass LabyMod das Issue löscht, hier ein Link von web.archive.org.
Die Lösung
- LabyMod muss das unverschlüsselte Protokoll auf mod.labymod.net:30336 sofort einstellen
Die Clients müssen "gezwangs" updatet werden- dl.labymod.net darf nicht mehr auf http Requests antworten
- Der Client und der Updater, ... müssen von Haus aus nur noch an https schicken (Jungs: Das ist einmal Ctrl + R drücken und fast alle Vorkommen ersetzen^^)
- Das Socket Protokoll muss mit RSA verschlüsselt und signiert werden
Updates
Updates werde ich hier jederzeit hineinschreiben. Auch werde ich jedes neue Update von LabyMod umgehend testen und weiter meinen Senf dazugeben.
@LabyMod: Was ihr falsch gemacht habt
- Ich habe euch am 18.4.20 eine Email geschickt: Von euch: Keine Reaktion. Auch keine Reaktion auf das Issue. Ich erwarte eine Stellungsnahme dazu!
- Das Issue ist seit längerem auf privat gestellt (d.h. ungelistet). Nachdem es gelöst ist, solltet ihr es eigentlich anpinnen und wieder listen! Es ist eine Schande, dass ein so großes Sicherheitsproblem bei einem Client auftritt (und schon seit Tag 1 present ist) und dann noch verheimlicht wird! Ich erwarte von einem Team aus 34 Menschen (davon 4 Admins und 10 Developer), dass es zu seinen Fehlern steht und die Nutzer darüber informiert, dass solche Sicherheitsfehler aufgetreten sind! Auch finde ich die Nachricht "Fixed some important security issues" definitiv zu harmlos! Dieses "some" hättet ihr euch echt sparen können!
- Über den gescheiterten Patch brauchen wir ja nicht zu reden, dass habt ihr ja mitbekommen unter "LabyMod Version 3.6.7"
- Allgemein sollte man, wenn man ein Projekt hat, dass so groß ist (3+ Millionen User), erwarten, dass alle kritischen Punkte von mehreren Menschen geprüft wird! Mir ist das sofort aufgefallen, indem ich nur Wireshark gestartet habe (das auf den Sockets nicht, dass wird teilweise mit Gzip komprimiert, deswegen bin ich davon ausgegangen, dass eine Verschlüsselung verwendet wird, habe das Gegenteil jedoch während dem Programmieren von meinem Bot festgestellt). Das kann nicht sein, dass so ein simpler Fehler seit fast 3 Jahre existiert!
Kleiner Sache: Ich werde den Blog weiter updaten, aber jetzt reicht es erst mal mit Frust und Wut.