- Discord ist eine Electron-basierte Desktop-App und läuft intern als Chromium-Fenster, sodass sich die Web-Entwicklertools öffnen lassen und dadurch clientseitige Codeänderungen möglich sind
- Einige modifizierte Clients und Plugins schalten einen Teil der Funktionen frei, für die eigentlich ein kostenpflichtiges Nitro-Abonnement nötig ist
- Der Kern der Methode besteht darin, in durch Webpack-Code Splitting aufgeteilte Module Code über die Variable
webpackChunkdiscord_appeinzuschleusen, um interne Funktionen zu durchsuchen und zu ersetzen - Die Prüffunktion für die Qualität der Bildschirmübertragung wird nur auf dem Client validiert und kann daher umgangen werden, Premium-Themes werden jedoch zusätzlich durch serverseitige Synchronisationsprüfung kontrolliert
- Alle gezeigten Demo-Techniken verstoßen gegen die Discord-Nutzungsbedingungen und bergen das Risiko einer Kontosperrung sowie eines Kontodiebstahls durch die Ausführung nicht verifizierten Codes
Überblick
- Es gibt zahlreiche modifizierte Discord-Clients, die das Erscheinungsbild verändern oder Funktionen hinzufügen, und einige Plugins schalten sogar Funktionen frei, für die ein kostenpflichtiges Nitro-Abonnement erforderlich ist
- Hier wird anhand einer Analyse der Client-Struktur das technische Prinzip erklärt, das ein solches Verhalten ermöglicht
Entwicklertools aktivieren
- Discord wurde mit dem Electron-Framework entwickelt, mit dem plattformübergreifende Apps auf Basis von Web-Technologien erstellt werden, und ähnelt daher einer Website, die in einem Webbrowser läuft
- Da es im Kern ein Chromium-Fenster ist, lassen sich die Entwicklertools öffnen, sie sind jedoch standardmäßig deaktiviert
- Das wurde gesperrt, nachdem viele Nutzer durch Social Engineering von Angreifern zum Einfügen bösartiger Befehle verleitet wurden und ihre Konten kompromittiert wurden
- Wer die Risiken versteht, kann in der Konfigurationsdatei
%appdata%/discord/settings.jsonden WertDANGEROUS_ENABLE_DEVTOOLS_ONLY_ENABLE_IF_YOU_KNOW_WHAT_YOURE_DOINGauftruesetzen, um sie zu aktivieren- Danach lässt sich die Entwicklerkonsole mit
ctrl + shift + iöffnen
- Danach lässt sich die Entwicklerkonsole mit
Discord-Funktionen patchen
- Zur Optimierung des initialen Ladens wird der Code in mehrere Chunks aufgeteilt und parallel oder verzögert geladen (lazy-loaded); verwendet wird dabei Webpacks Code-Splitting
- Alle geladenen Chunks werden in der Variable
webpackChunkdiscord_appgespeichert - Um Code auszuführen, der Discord-Variablen oder -Funktionen verwendet, muss man Code in diese Variable injizieren
a.cist ein Objekt, das alle Module enthält; jedes Modul besteht auschunk_id,loadedundexportsexportsenthält die vom Modul exportierten Funktionen, Objekte und primitiven Werte
- Mit einer
find-Funktion, die mehrere JavaScript-Module durchläuft, lassen sich bestimmte Funktionen suchen und aufrufen- Beispiel: die Funktion
getCurrentUser()finden und aufrufen
- Beispiel: die Funktion
- Da sich die Originalfunktion durch eine andere Funktion ersetzen lässt, kann das Verhalten direkt verändert werden
Hochwertiges Streaming freischalten
- Ab hier verstößt der Inhalt eindeutig gegen die Discord-Nutzungsbedingungen und kann zu einer Kontosperrung führen; man trägt also das volle Risiko
- Direkt vor dem Auswahlbildschirm für die Bildschirmfreigabequalität werden die beiden Funktionen
canStreamMidQualityundcanStreamHighQualityaufgerufen, die den Abonnementstatus des Nutzers prüfen- Erzwingt man bei beiden Funktionen den Rückgabewert
true, kann man auch ohne Nitro-Abonnement Bildschirmfreigabe in Originalauflösung mit 60 FPS auswählen
- Erzwingt man bei beiden Funktionen den Rückgabewert
- Derzeit scheint Discord serverseitig nicht zu prüfen, ob der übertragene Stream die Grenzen für Nicht-Abonnenten tatsächlich einhält
- Allerdings verwendet Discord noch keine Ende-zu-Ende-Verschlüsselung (End-to-End encryption), sodass eine Erkennung möglich bleibt
- Dem referenzierten Beitrag zufolge analysiert Discord bereits Audio- und Videoinhalte der Nutzer und könnte künftig vor der Bildschirmfreigabe eine serverseitige Prüfung ergänzen
Premium-Themes freischalten
- Wenn man den Rückgabewert der Funktion
canUseClientThemes, die angibt, ob ein Nutzer Nitro-Themes verwenden darf, auftrueändert, wird die Schaltfläche zur Auswahl von Premium-Themes freigeschaltet - Das Theme wird jedoch nur kurz angewendet und springt dann sofort wieder auf das Standard-Theme zurück
- Der Client versucht zwar, die Theme-Änderung zu speichern, aber der Server prüft die fehlende Berechtigung und wendet nach Erhalt der Antwort das Standard-Theme erneut an
- Wenn man die Funktion
shouldSyncso patcht, dass sie beim Wertappearancefalsezurückgibt und damit nur die Synchronisation der Darstellungseinstellungen blockiert, bleibt die Theme-Änderung erhalten - Themes werden vollständig clientseitig verwaltet, und auch das direkte Anpassen von CSS ist jederzeit möglich, weshalb Discord das nur schwer verhindern kann
Fazit
- Es gibt Code, mit dem sich die demonstrierten Hacks leicht anwenden lassen, doch vor Änderungen am Client oder der Nutzung von Mods ist große Vorsicht geboten
- Discord kann Konten, die gegen die Nutzungsbedingungen verstoßen, jederzeit sperren, und die Ausführung nicht verifizierten Codes mit Zugriff auf das Konto ist äußerst riskant
- Kodierte Nachricht im Artikel: "Füge keinen Code in die Entwicklerkonsole ein, den du nicht verstehst — das ist der einfachste Weg, dein Konto stehlen zu lassen"
1 Kommentare
Meinungen auf Hacker News
Wenn es so funktioniert, dass ein simples Base64-codiertes Blob am Ende ausgeführt wird und dadurch alle Funktionen aktiviert werden, könnte das ein ziemlich einfacher Angriffsvektor sein
Ich wollte dem Autor nichts unterstellen; ich habe es gerade dekodiert und bin reingelegt worden
base64 --decodezu mühsam ist, hier das Ergebnis:// Here's a cake if you thought about inspecting the code before executing it:let css = 'font-size: 36px; font-weight: bold; color: red';console.log("%cNEVER paste code you don't understand into the development console.", css);console.log("%cThis is the best way to compromise your account.", css);„Derzeit scheint Discord serverseitig nicht zu prüfen, ob der gesendete Stream tatsächlich die Kriterien für Nicht-Abonnenten einhält“ – da frage ich mich, wer das für eine gute Implementierung gehalten hat
Clientseitige Prüfung wirkt wie ein wirklich banaler Anfängerfehler
Ich nutze Discord seit Jahren und höre zum ersten Mal überhaupt von einem Versuch, die Zugriffsstruktur von Nitro zu umgehen. Wenn das nicht weit verbreitet ist, scheint es auch keinen Grund zu geben, sich groß darum zu kümmern
Nebenbei habe ich allein diesen Monat meinen fünften neuen Job angefangen; mit Projektmanagern scheine ich einfach nicht klarzukommen
Wie viele Leute verstehen so einen Hack und wären gleichzeitig bereit, für Nitro zu zahlen? Es gibt sicher Tausende, vielleicht Zehntausende, die verschiedene Discord-Client-Mods nutzen, die einige oder alle Nitro-Funktionen freischalten, aber fraglich ist, wie viel tatsächlicher Umsatz entstünde, wenn man das unterbindet
Persönlich würde ich, wenn ich die Funktionen brauche oder will, lieber 10 Dollar im Monat zahlen. Das ist deutlich weniger Aufwand, als ständig Mods hinterherzulaufen, die bei jedem Discord-Update kaputtgehen, und darauf zu hoffen, dass der Maintainer keinen Schadcode einschleust
Die Channels sind nur im Client versteckt. Um es klarzustellen: Die Inhalte der Nachrichten in diesen Channels kann man trotzdem nicht sehen
Die Voice-Server fragen bei der API nur ab, ob man die Berechtigung zum Beitritt hat, und verhalten sich danach wie ein One-to-many-Paket-Broadcaster
Das ist ziemlich nah am klassischen Hacker im neugierigen und versierten Sinn
Es gibt keinen ernsthaften Schaden und es erinnert einen daran, dass Apps keine Magie sind und Code cool ist
Dann können sie nämlich ohne Widerstand versuchen, noch mehr Geld aus uns herauszupressen
Zur Erinnerung: Alles, was man an Discord sendet, einschließlich DMs, wird bei Discord im Klartext gespeichert und ist für Discord sowie für denjenigen zugänglich, der das Unternehmen kauft
Eine Zeit lang sah es so aus, als würde Microsoft es kaufen, inzwischen scheint es eher Richtung IPO zu gehen
Schon allein ein Konto zu haben normalisiert private Unterhaltungen, die leicht für Data Mining für KI oder durch Discord- sowie Datenbank-/Systemadministratoren genutzt werden können. Section 702 des FISA Amendments Act (FAA702) erlaubt Bundesermittlungsbehörden, ohne Durchsuchungsbefehl auf solche Daten zuzugreifen
Allein die Möglichkeit von Front-Running bei Kryptowährungen dürfte zig Millionen Dollar pro Tag wert sein
Freunde lassen Freunde keine Chat-Systeme ohne Ende-zu-Ende-Verschlüsselung benutzen. Seien wir nicht der Honig in der Falle
Das ist zu erwarten, sofern man nicht einen der wenigen Dienste nutzt, die ein echtes Zero-Trust-Modell implementieren, bei dem Nutzer ihre Schlüssel selbst verwalten. Nachrichten werden gespeichert, damit Nutzer später wieder darauf zugreifen können
Es gibt Dienste wie Matrix, die Ende-zu-Ende-verschlüsseltes Gruppen-Messaging auf relativ benutzerfreundliche Weise hinbekommen, aber das ist eher die Ausnahme. Es ist nicht fair, Discord als besonders bösartig hinzustellen, nur weil es das gleiche Modell nutzt wie 95 % aller elektronischen Kommunikationsplattformen
Das heißt nicht, dass es gut ist, aber in manchen Communitys hat man keine Wahl außer nicht teilzunehmen
Es ist sogar schlimmer als früher bei „alle nutzen WhatsApp“. Damals hatte man die Nummer der anderen Person und konnte sie leicht anders kontaktieren; der Reiz von Discord sind aber nicht private Gespräche, sondern Communitys mit halböffentlichen Räumen. Öffentlich heißt hier nicht, dass sie allen offenstehen, sondern eher, dass ungefähr 100 Leute mitlesen
Wenn man eine Nachricht löscht, wird sie nicht mehr in der Datenbank gespeichert
Vor Kurzem hat OpenAI den Discord für Beta-Tester plötzlich deaktiviert, sodass wir nicht mehr sehen können, mit wem wir was besprochen hatten
Ich habe mich gefragt, ob es eine Möglichkeit gibt, Chats zu exportieren, damit ein Server-Administrator nicht einfach die Community auseinanderreißen kann, ohne eine Möglichkeit zu lassen, die Historie zu durchsuchen
Es gibt einige Chrome-Erweiterungen zum Exportieren von Discord-Chats, aber die meisten scheinen bestimmte Funktionen hinter einer Paywall zu sperren
Wie sich herausstellte, war es sehr einfach, den Extension-Quellcode aus dem Chrome-Ordner zu kopieren, Boolean-Prüfungen wie
is_proin JavaScript anzupassen und ihn dann wieder als entpackte Erweiterung zu ladenDas ist ein eigenständiges Programm, das die API auf nicht standardmäßige Weise nutzt, aber ich habe noch von niemandem gehört, der dafür gesperrt wurde
Es wird zwar korrekt davor gewarnt, dass man für solche Tricks gesperrt werden kann, aber gibt es einen Präzedenzfall, dass Discord Nutzer wegen so etwas gesperrt hat?
Sie unterbinden auch die Nutzung alternativer Clients. Wenn dir dein Account wichtig ist, solltest du Discord besser nicht anfassen
„Client-Modifikationen verstoßen gegen die Nutzungsbedingungen von Discord.“
Allerdings scheint Discord dem ziemlich gleichgültig gegenüberzustehen, und es gibt keine bekannten Fälle, in denen jemand nur wegen der Nutzung eines Client-Mods gesperrt wurde. Solange man also keine Plugins verwendet, die missbräuchliches Verhalten implementieren, sollte es im Allgemeinen in Ordnung sein. Man muss sich wohl keine Sorgen machen, denn die eingebauten Plugins sollen alle sicher sein
Dass manche Themes auf diese Weise aktiviert werden, kann ich nachvollziehen, aber dass man die Streaming-Qualität per clientseitiger Prüfung statt serverseitig festlegen lässt, ist ziemlich schwer zu verstehen
Man braucht keinen Zugriff auf das eigentliche Video; selbst wenn es vollständig verschlüsselt wäre, könnte man anhand der übertragenen Datenmenge erkennen, in welcher Qualität gestreamt wird
Die große Grundregel des Frontend-Engineerings bewahrheitet sich wieder einmal
„Vertraue niemals, wirklich niemals dem Client“
Seit ich gesehen habe, dass sich das rein clientseitig erledigen lässt, nutze ich ständig die Developer Tools und den 1080p60-Streaming-Button, und es funktioniert tatsächlich
Ich weiß nicht, seit wie vielen Jahren das schon so ist, aber bei Discord scheint es niemanden zu kümmern
Ich wollte diesen Weg früher schon einmal gehen, habe aber letztlich aufgegeben, weil ich keine Möglichkeit fand, den Client konsistent zu patchen, besonders nach Updates
Diese Methode weckt in mir aber wieder den Drang, „das Ding aufzuschrauben und darin herumzustochern“
Gibt es eine einfache Möglichkeit, die auf diese Weise verfügbaren APIs zu durchstöbern? Ich hatte versucht, alles zu loggen, aber durch Maps, Internationalisierung und Ähnliches wurde es ein ziemliches Chaos. Ich frage mich, ob sich jemand die Mühe gemacht und so etwas wie eine Reverse-Engineering-Dokumentation erstellt hat