2 Punkte von GN⁺ 2023-08-24 | 1 Kommentare | Auf WhatsApp teilen
  • 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_app einzuschleusen, 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.json den Wert DANGEROUS_ENABLE_DEVTOOLS_ONLY_ENABLE_IF_YOU_KNOW_WHAT_YOURE_DOING auf true setzen, um sie zu aktivieren
    • Danach lässt sich die Entwicklerkonsole mit ctrl + shift + i öffnen

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_app gespeichert
  • Um Code auszuführen, der Discord-Variablen oder -Funktionen verwendet, muss man Code in diese Variable injizieren
    • a.c ist ein Objekt, das alle Module enthält; jedes Modul besteht aus chunk_id, loaded und exports
    • exports enthä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
  • 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 canStreamMidQuality und canStreamHighQuality aufgerufen, 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
  • 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, auf true ä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 shouldSync so patcht, dass sie beim Wert appearance false zurü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

 
GN⁺ 2023-08-24
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

    • Für alle, denen base64 --decode zu 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

    • Vermutlich war es weniger „das ist eine großartige Implementierung“ als eher „wenn jemand herausfindet, wie man es knackt, patchen wir es dann“
      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
    • Aus der Perspektive von jemandem, der nur fertige Features exakt in der gewünschten Endform implementiert und dann PRs einreicht, habe ich überhaupt keine Ahnung, warum sie das so gemacht haben
      Nebenbei habe ich allein diesen Monat meinen fünften neuen Job angefangen; mit Projektmanagern scheine ich einfach nicht klarzukommen
    • Wenn man bedenkt, wie leichtfertig Menschen heutzutage, besonders Kinder, Geld ausgeben, könnte das schon ausreichen
      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
    • Über die API kann man auch Namen, Themen und den Zeitpunkt der letzten Nachricht von versteckten Channels sehen
      Die Channels sind nur im Client versteckt. Um es klarzustellen: Die Inhalte der Nachrichten in diesen Channels kann man trotzdem nicht sehen
    • Das liegt daran, dass es sich nicht um eine Komponente der Discord-API handelt, sondern um die Voice-Server, von denen weltweit Hunderte verteilt sind
      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

    • Vielleicht eher ein „Cracker“, aber ich stimme zu, dass es genau die Art von Wissen ist, von der Unternehmen lieber hätten, dass wir sie nicht besitzen
      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

    • Zur Erinnerung: Alles, was man in Foren sendet, einschließlich DMs, wird im Klartext gespeichert und ist für Administratoren zugänglich
      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
    • „Schon ein Konto zu haben normalisiert es“ – aber es ist längst normalisiert, und Discord hat gewonnen
      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
    • Zum Glück hat Discord spurloses Löschen von Nachrichten
      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_pro in JavaScript anzupassen und ihn dann wieder als entpackte Erweiterung zu laden

    • DiscordChatExporter: https://github.com/Tyrrrz/DiscordChatExporter
      Das 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?

    • Discord hat keinerlei Hemmungen, Leute aus beliebigen Gründen zu sperren
      Sie unterbinden auch die Nutzung alternativer Clients. Wenn dir dein Account wichtig ist, solltest du Discord besser nicht anfassen
    • In der README von Vencord, einem der beliebtesten Mods, steht Folgendes:
      „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

    • Vor allem, weil man dafür nur die Ein- und Ausgabe-Bitrate prüfen müsste
      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