Share
Beitragsbild zu Salesforce: Kritische SOQL-Injection wird zur 0-Day-Sicherheitslücke

Salesforce: Kritische SOQL-Injection wird zur 0-Day-Sicherheitslücke

24. Juni 2025

Wie eine scheinbar harmlose Schwachstelle zur Gefahr für Millionen von Datensätzen wurde + Im Juni 2025 stieß ein Sicherheitsforscher auf eine schwerwiegende Sicherheitslücke in der Cloud-Plattform von Salesforce. Die entdeckte Schwachstelle: eine SOQL-Injection (Salesforce Object Query Language) in einem Standard-Aura-Controller – einem zentralen Bestandteil der Salesforce-Architektur. Obwohl zunächst als nicht ausnutzbar eingestuft, entwickelte sich der Fund schnell zu einer echten 0-Day-Lücke, die potenziell Tausende von Salesforce-Instanzen und Millionen von Benutzerdatensätzen betraf.

Ein Risiko aus dem Baukasten

Die Sicherheitslücke wurzelte in der Art und Weise, wie dynamische Abfragen innerhalb der Plattform verarbeitet werden. Entwickler verwenden oft flexible, dynamisch aufgebaute Abfragen – ein Ansatz, der in Verbindung mit unzureichender Validierung ein erhebliches Einfallstor für Angriffe darstellen kann.

Forschung trifft Praxis

Der Forscher analysierte gezielt sogenannte Aura-Controller – JavaScript-basierte Endpunkte, die in der Datei „app.js“ von Salesforce definiert sind. Mit einem eigens entwickelten Parser und Fuzzer testete er systematisch verschiedene Eingabevarianten. Dabei entdeckte er eine bislang unerkannte Möglichkeit, manipulierte Eingaben in dynamische SOQL-Abfragen einzuschleusen – mit potenziell verheerenden Auswirkungen.

Ein Weckruf für die Cloud-Welt

Die Enthüllung unterstreicht einmal mehr die Bedeutung sicherer Codierungspraktiken, insbesondere bei der Entwicklung von Komponenten auf weit verbreiteten Cloud-Plattformen wie Salesforce. Sie zeigt auch, wie selbst unscheinbare Schwachstellen in Standardkomponenten zum Einfallstor für groß angelegte Angriffe werden können – wenn sie nicht frühzeitig erkannt und behoben werden.

Eine angenehme Überraschung

Anfang dieses Jahres testete ich eine auf Salesforce basierende Anwendung und stellte schnell fest, dass ich zusätzlich zu manuellen Tests eine Möglichkeit benötigte, die Hunderte (wenn nicht Tausende) von Aura-Controllern zu fuzzen, die sowohl in der Anwendung als auch standardmäßig in Salesforce vorhanden sind. Aura-Controller sind einfach eine Möglichkeit, mit der Salesforce verschiedene Endpunkte in der Anwendung definiert. Sie sind praktischerweise in der Datei app.js definiert, die in allen Salesforce-Instanzen zu finden ist. Hier definieren die verschiedenen Deskriptoren den Controller und die Aktion sowie die Argumente, die zum Aufrufen eines bestimmten Endpunkts erforderlich sind. Diese klare Definition machte es recht einfach, einen Parser und Fuzzer zu erstellen, der alle diese Endpunkte mit verschiedenen Mutationen der Eingabeparameter testen konnte.

Schnell wurde mir klar, dass der vom Benutzer an aura://CsvDataImportResourceFamilyController/ACTION$getCsvAutoMap übergebene Parameter contentDocumentId unsicher in eine SOQL-Abfrage eingebettet wurde, wodurch eine Injektion möglich war und möglicherweise sensible Daten aus der Datenbank exfiltriert werden konnten.

Umgehung von SOQL-Einschränkungen und Datenextraktion

SOQL ähnelt zwar SQL, unterliegt jedoch mehreren Einschränkungen, die die Ausnutzung erschweren: keine UNION-basierten Angriffe, begrenzte Unterabfragen und strenge Einschränkungen für Verknüpfungen und Mehrfachabfragen.

Der Forscher nutzte jedoch eine Technik zur Ausnutzung von Antwortdiskrepanzen – ähnlich wie bei einer fehlerbasierten blinden SQL-Injection –, um Daten aus der Datenbank abzuleiten.

Beispielsweise durch Senden einer manipulierten contentDocumentId wie:

text069TP00000HbJbNYAV' AND OwnerId IN (SELECT Id FROM User WHERE Email LIKE ‚a%25‘) AND ContentDocumentId != '

Der Forscher konnte anhand der Antwort feststellen, ob eine Unterabfrage übereinstimmte.

Wenn die Unterabfrage erfolgreich war, wurde ein gültiges Dokument zurückgegeben, andernfalls wurde ein Fehler generiert.

Dies ermöglichte sensible Benutzer- und Dokumentinformationen systematisch auszulesen – selbst ohne direkten Zugriff auf andere Datenbanktabellen.

Besonders brisant: Mithilfe eigens entwickelter Skripte konnte der Forscher gültige contentDocumentId-Werte erzeugen. Dabei nutzte er die Vorhersagbarkeit von Salesforce-ID-Strukturen aus. Auf diese Weise war es möglich, per Brute-Force-Angriff Dokumentdetails wie Eigentümerinformationen über die gesamte Salesforce-Umgebung hinweg aufzuspüren und aufzulisten.

Die entdeckte Sicherheitslücke hätte es Angreifern ermöglicht, je nach Systemkonfiguration auf sensible Nutzerdaten zuzugreifen – darunter E-Mail-Adressen, Namen, Wohnadressen sowie Passwort-Hashes. Der entdeckende Sicherheitsforscher informierte Salesforce über das Problem. Das Unternehmen schloss die Schwachstelle zwar, verzichtete jedoch darauf, eine öffentliche Sicherheitsempfehlung oder eine CVE-Kennung herauszugeben. Dieses Vorgehen ist bei großen Anbietern nicht unüblich, um potenzielle Aufmerksamkeit für Sicherheitsprobleme gering zu halten.

Zur Vermeidung von SOQL-Injektionen raten sowohl Salesforce selbst als auch die Apex-Entwicklergemeinschaft dazu, auf dynamische Abfragen zu verzichten und stattdessen statische Abfragen mit Bindungsvariablen zu nutzen. Ein Beispiel für unsicheren Code wäre eine dynamisch zusammengesetzte Abfrage, in der Benutzereingaben direkt in die Abfragezeichenfolge eingefügt werden. Sichere Alternativen binden die Eingaben über Platzhalter ein – das reduziert das Risiko, dass schädliche Eingaben in die Datenbank gelangen. Dieser präventive Ansatz gilt als bewährte Praxis in der Entwicklung mit Apex.

Zusammenfassung

Unabhängig davon, ob dieser Fehler eine Schwachstelle in einem der integrierten Controller von Salesforce ist, kann die von mir vorgestellte Technik sehr nützlich sein, um Auswirkungen in einer ansonsten nicht ausnutzbaren SOQL-Injection zu finden. Wenn Sie in einer Salesforce-basierten Anwendung eine Stelle gefunden haben, an der eine SOQL-Injection möglich ist, aber keine Möglichkeit finden, Informationen direkt aus der Datenbank zu extrahieren, versuchen Sie Folgendes:

  • Gibt es Unstimmigkeiten in den Antworten basierend auf Ihrer Eingabe?
  • Welche anderen Objekte können Sie mithilfe einer Unterabfrage nutzen? (d. h. auf welche Tabellen können Sie zugreifen?)
  • Gibt es mehrere injizierte Parameter, die bessere Injektionspunkte bieten?

Suchen Sie immer nach Möglichkeiten, Daten mithilfe von Zeichenfolgen- und Booleschen Operationen abzuleiten. Die Antwortzeit und der Inhalt können sehr effektive Möglichkeiten sein, um eine blinde SOQL-Injektion zu nutzen. Und vergessen Sie nicht, dass Sie jederzeit Identifikatoren für Salesforce-Objekte generieren können. Nutzen Sie dies zu Ihrem Vorteil, um Daten über Objekte offenzulegen, die Sie eigentlich nicht sehen sollten!


Bild/Quelle: https://depositphotos.com/de/home.html

Teile diesen Beitrag: