Missbrauch von falsch konfigurierten Salesforce-Communitys für Spionage und Datendiebstahl

Datensicherheit, IT-Experten

Executive Summary

Falsch konfigurierte Salesforce-Communitys können dazu führen, dass sensible Salesforce-Daten für jedermann im Internet zugänglich sind. Anonyme Benutzer können Objekte abfragen, die sensible Informationen wie Kundenlisten, Supportfälle und E-Mail-Adressen von Mitarbeitern enthalten.

Unser Forschungsteam hat zahlreiche öffentlich zugängliche Salesforce-Communitys entdeckt, die falsch konfiguriert sind und sensible Informationen preisgeben.

Dies ist nicht das erste- und wird auch nicht das letzte Mal sein, dass eine SaaS-Konfiguration zu einem potenziellen Sicherheitsproblem führt. Dies unterstreicht die Notwendigkeit für Sicherheitsteams,  kontinuierlich ihre SaaS-Exposition zu bewerten.

Dieser Leitfaden erklärt, wie ein Angreifer diese Fehlkonfiguration ausnutzen kann, und gibt Salesforce-Administratoren detaillierte Schritte an die Hand:

  1. Vergewissern Sie sich, dass die Berechtigungen Ihres Gastprofils Nichts preisgeben, was Sie nicht preisgeben möchten (Kontodaten, Mitarbeiterkalender usw.).
  2. Deaktivieren Sie den API-Zugriff für Ihr Gastprofil
  3. Legen Sie den Standardeigentümer für Datensätze fest, die von Gastbenutzern erstellt werden
  4. Aktivieren Sie den sicheren Gastbenutzerzugriff

Die Auswirkungen

Mindestens ein bösartiger Akteur könnte diese Fehlkonfiguration nutzen, um für eine Spear-Phishing-Kampagne Erkundungen durchzuführen. Schlimmstenfalls könnten sensible Informationen über das Unternehmen, seine Abläufe, Kunden und Partner gestohlen werden.

In einigen Fällen kann ein raffinierter Angreifer lateral vorgehen und Informationen von anderen Diensten abrufen, die in dem Salesforce-Konto integriert sind.

Was sind Salesforce-Communitys?

Mit einer Salesforce-Community-Seite können Ihre Kunden und Partner von außerhalb Ihres Unternehmens auf Ihre Salesforce-Instanz zugreifen. Sie können Support-Tickets öffnen, Fragen stellen, ihre Abonnements verwalten und  vieles mehr.

Communitys sind öffentlich zugänglich und werden standardmäßig von Google indiziert. Dies ist zwar für Kunden und Partner nützlich, macht es aber Angreifern, die eine Schwachstelle oder Fehlkonfiguration entdecken, leicht, nach Communitys zu suchen und diese in großem Umfang zu missbrauchen.

Wie Sie sehen werden, ist Salesforce in hohem Maße individuell anpassbar und kann schwierig zu verwalten sein. Keine Salesforce-Instanz gleicht der anderen, denn es gibt Hunderte von Drittanbieteranwendungen, benutzerdefinierten Objekten und Konfigurationen.

Technischer Hintergrund

Salesforce-Communitys laufen auf dem Lightning-Framework von Salesforce. Lightning ist ein schnelles Entwicklungsframework für mobile und Desktop-Websites.

Salesforce Lightning ist ein auf Komponenten ausgerichtetes Framework. Diese Komponenten, auch Aura-Komponenten genannt, sind eigenständige Objekte, die ein Entwickler zusammenstellen kann, um benutzerdefinierte Webseiten zu erstellen.

Aura-Komponenten können verwendet werden, um Aktionen mit Salesforce-Objekten durchzuführen, z. B. das Anzeigen oder Aktualisieren von Datensätzen. Die Komponenten verfügen über Controller, die verschiedene Methoden zum Ausführen bestimmter Aufgaben exportieren.

Das Durchsuchen einer Community-Website mit einem Proxy-Service wie Burp Suite zeigt uns Lightning in Aktion. Die Front-End-Web-Benutzeroberfläche einer Community verwendet den HTTP-Endpoint /s/sfsites/aura.

Der Browser verwendet den Endpoint Aura, um Informationen über die Website abzurufen und serverseitige Aktionen durchzuführen, wenn der Benutzer mit der Community-Website interagiert. Natürlich gelten die User-Berechtigungen für diese Aktionen.

Browsing Salesforce with Burp Suite

Das Aufrufen des Aura-Endpoint ist einfach eine HTTP-Anfrage, entweder GET oder POST, die aus folgenden Parametern besteht:

  • pageURI – der Pfad zur Website, ohne den Host. Zum Beispiel: “/s/”.
  • token – der Token des aktuellen Benutzers. Der Wert „undefined“ weist auf einen Gastbenutzer hin.
  • context – der Kontext der aktuellen Sitzung, der von der Website bereitgestellt wird.
  • message – beschreibt die gewünschte Aktion. Es ist möglich, mehrere Methoden mit demselben Aura-Aufruf auszuführen. Diese Struktur enthält eine Liste von Aktionen, die den Deskriptor der Methode (einen eindeutigen Bezeichner der Methode) und die Aufrufparameter enthalten.

Die Nachrichtenstruktur ist ein URL-kodiertes JSON. Hier ein Beispiel:

{
"actions": [
{
"id": "222;a",
"descriptor": "serviceComponent://ui.force.components.controllers.hostConfig.HostConfigController/ACTION$getConfigData ",
"callingDescriptor": "UNKNOWN",
"params": {}
}
]
}
  • id – eine zufällige Zeichenfolge, die beim Senden von mehr als einer Aktion in einer einzigen Anfrage verwendet werden kann. So kann der Browser Aktionen und Antworten zuordnen.
  • descriptor – die spezifische Methode zum Aufrufen.
  • callingDescriptor – Normalerweise „UNKNOWN“, da dieser Parameter oft ignoriert wird
  • params – Wird verwendet, um der Methode Parameter zu geben

Es gibt viele verschiedene Methoden, mit denen ein  unauthentifizierter Benutzer Aktionen durchführen kann, wie z. B.:

  • Informationen über die Site erhalten
  • Informationen über das Salesforce-Abonnement erhalten
  • Anzeigen von Standard- und benutzerdefinierten Objekten und deren Feldern
  • Daten und Datensätze abrufen

Einige der Objekte, die Sie abfragen können, sind Konto, Benutzer, Fall, Mitarbeiter, Anhang, Kontakt und Lead.

Wie können Angreifer falsch konfigurierte Communitys ausnutzen?

Auf falsch konfigurierten Websites kann der Angreifer Informationen über das Unternehmen suchen, z. B. Benutzer, Objekte und Felder, die Namen und E-Mail-Adressen preisgeben, und in vielen Fällen das System infiltrieren oder Informationen stehlen.

Zunächst muss der Angreifer eine Community-Website finden, die sich für seine Zwecke eignet. Mit ein wenig Google-Magie ist das kein Problem. Es gibt allgemeine URL-„Fingerabdrücke“, die anzeigen, dass eine Website von Salesforce-Communitys betrieben wird:

  • /s/topic
  • /s/article
  • /s/contactsupport

Let me Google that for you

Mit Operatoren wie „inurl:“ zusammen mit dem Namen des Ziels kann man oft die gewünschte Community-Site finden:

Google search with inurl parameter

Der nächste Schritt ist das Abrufen von Informationen über die Site. Der Angreifer kann dies folgenderweise tun:

serviceComponent://ui.force.components.controllers.hostConfig.HostConfigController/ACTION$getConfigData

Diese Methode gibt die Domain des Unternehmens, einige Sicherheitseinstellungen (z. B. CSP-Domains (Zulässige Content-Sicherheitsrichtlinie)) und verfügbare Objekte zurück.

Der Angreifer kann verschiedene Methoden aufrufen, um verschiedene Aktionen durchzuführen, wie z. B.:

  • Auflisten von Salesforce-Objekten
  • Auflisten von Datensätzen
  • Suche nach Datensätzen
  • Abrufen eines Objekts
  • Abrufen von Informationen über die Salesforce-Instanz—

Abruf sensibler Daten

Angreifer können versuchen, direkt auf sensible Daten zuzugreifen. Unser Sicherheitsteam hat in unserer Forschung Unmengen offenliegender vertraulicher Datensätze gefunden.

Der Angreifer kann bestimmte Objekte anvisieren und sie durch den Aufruf folgender Methode untersuchen:

aura://RecordUiController/ACTION$getObjectInfo

die Informationen über ein Objekt ausgibt. Diese Methode unterstützt alle Arten von Objekten, einschließlich benutzerdefinierter Objekte.

Die Informationen umfassen die verschiedenen Felder, wie sie konfiguriert sind und die untergeordneten Beziehungen des Objekts.

Der nächste Schritt wäre die Auflistung der Datensätze mittels folgender Methode:

serviceComponent://ui.force.components.controllers.lists.selectableListDataProvider.SelectableListDataProviderController/ACTION$getItems.

Hier ist ein Beispiel für die Auflistung von Kontodatensätzen mit dieser Methode:

Der Angreifer kann dann mit folgenden Methoden noch mehr Informationen abrufen:

serviceComponent://ui.force.components.controllers.recordGlobalValueProvider.RecordGvpController/ACTION$getRecord

Oder

aura://RecordUiController/ACTION$getRecordWithFields

Interessante Datensätze mit mehr Feldern und verwandten Objekten abrufen.

Suchen nach anfälligen Drittanbieterkomponenten

Ein fortgeschrittener Angreifer könnte versuchen, anfällige benutzerdefinierte und Drittanbieter-Komponenten anzugreifen.

In einigen Fällen kann die gesamte Salesforce-Instanz übernommen werden, indem einfach eine anfällige benutzerdefinierte Apex-Klasse genutzt wird, die Gastbenutzern zur Verfügung steht.

Beim Durchsuchen der Website können wir sehen, dass der Browser mehrere verschiedene JavaScript-Dateien mit seltsamen URLs lädt, die mit /l/ und dann einem kodierten JSON-Objekt beginnen.

In diesen JavaScript-Dateien finden sich die Definitionen für die meisten zugänglichen Endpoints, einschließlich benutzerdefinierter und/oder Drittanbieter-Anwendungen. Die Definitionen sind in JSON kodiert:

{
"descriptor": "compound://my_app.Component",
"ac": [
{
"n": "doAction",
"descriptor": "apex://my_app.ComponentController/ACTION$doAction",
"at": "SERVER",
"rt": "apex://String",
"pa": [],
"st": true
}
],
"pa": [
{
"name": "paramName",
"type": "apex://String"
}
]
}

Durch Scannen der Antwort auf ähnlich geformte JSON-Strings kann man etwas über die benutzerdefinierten Methoden erfahren, und wie man sie aufruft.

Was kann man dagegen tun?

Die Verwaltung einer Community-Website ist eine schwierige Aufgabe. Es muss sichergestellt werden, dass anonyme Gastnutzer und Gemeinschaftsnutzer nur auf die vorgesehenen und erforderlichen Datensätze zugreifen können. Es gibt Informationen, die Sie mit der Welt teilen wollen, und andere, die Sie nicht teilen wollen.

Um Ihre Salesforce-Umgebung abzusichern, ist es sehr wichtig, das Prinzip der notwendigsten Berechtigung zu befolgen und sicherzustellen, dass Gastprofile nur die minimal erforderlichen Berechtigungen zulassen.

Schritt 1 – Ihre Gastprofil-Berechtigungen prüfen

Navigieren Sie zu Ihrem Site Builder (suchen Sie im Setup nach „Alle Sites“) und klicken Sie auf Einstellungen oder das  Zahnradsymbol auf der linken Seite.

Ihr Gastbenutzerprofil finden Sie unter  Allgemein. Klicken Sie darauf, um die Berechtigungen des Gastbenutzers zu ändern.

Hier können Sie die Sicherheit auf Feldebene steuern, um den Zugriff auf einer sehr präzisen Ebene zu kontrollieren. Hier müssen Sie Entscheidungen über den Zugriff treffen, die speziell auf die Bedürfnisse Ihres Unternehmens zugeschnitten sind.

Schritt 2 – API-Zugriff deaktivieren

Es ist wichtig, sicherzustellen, dass API aktiviert nicht markiert ist. Es wird empfohlen, auch Auf Aktivitäten zugreifen zu deaktivieren.

Es ist wichtig, die Berechtigungen und Rollen von Gast- und Community-Nutzern ständig zu überwachen und die ihnen gehörenden Datensätze (und die damit verbundenen Objekte) im Auge zu behalten, um sicherzustellen, dass sensible Informationen nicht öffentlich zugänglich werden.

Schritt 3 – Festlegen eines Standardeigentümers für Datensätze, die von Gastbenutzern erstellt werden

Gehen Sie entweder direkt zu den Workspaces Ihrer Website oder verwenden Sie den Website-Builder, um zum Administrator-Workspace zu navigieren:

Stellen Sie in den Einstellungen sicher, dass Sie einen Standardeigentümer für Datensätze einrichten, die von Gastbenutzern erstellt wurden. In den meisten Fällen sollten Sie die Option Gastbenutzer Mitglieder dieser Website sehen lassen deaktivieren.

Schritt 4 – Aktivieren des sicheren Zugriffs auf Gastbenutzerdatensätze

Überprüfen Sie, ob die Standardzugriffseinstellung für Gastbenutzer sicher ist: Gehen Sie zur Einrichtung und suchen Sie nach Freigabeeinstellungen. Suchen Sie dort die Option Sicherer Zugriff für Gastbenutzer und überprüfen Sie, ob sie aktiviert ist.

Salesforce versucht, Ihnen zu helfen, intelligente Entscheidungen über den Gastzugang zu treffen. Seit der Version vom Sommer ’20 hat Salesforce es unmöglich gemacht, diese Einstellung zu deaktivieren. Außerdem können Sie Gastbenutzern jetzt nicht mehr die Berechtigung Alle Benutzer sehen erteilen, und Sie können ihnen keinen Zugriff auf alle Daten gewähren.

Es ist jedoch nach wie vor von größter Bedeutung, die Konfigurationseinstellungen zu überprüfen. Salesforce kann sie nicht für Sie deaktivieren, da verschiedene Benutzer unterschiedliche Anforderungen haben.

Zusammenfassung

Wie Sie sehen, gibt es bei so komplexen und anpassbaren SaaS-Anwendungen wie Salesforce unzählige Konfigurationseinstellungen und Berechtigungen, um die man sich kümmern muss.

Die meisten Unternehmen stellen Dutzende sanktionierter SaaS-Anwendungen mit jeweils eigenen Objekten, Berechtigungsmodellen, APIs und Freigabefunktionen bereit.

Aus diesem Grund haben wir DatAdvantage Cloud entwickelt – um eine einheitliche Methode zum Auffinden von Schwachstellen, zum Anpassen von Berechtigungen und zum Durchführen von Untersuchungen für alle Ihre genehmigten SaaS-Anwendungen zu bieten.

Anhang: Aura-Deskriptoren und wie sie verwendet werden

 serviceComponent://ui.force.components.controllers.hostConfig.HostConfigController/ACTION$getConfigData
  • Keine Parameter

Ruft die App-Daten einschließlich einer Liste von Objekten ab, die häufig benutzerdefinierte Objekte und die Salesforce-Login-Domain enthalten.

serviceComponent://ui.global.components.one.one.controller.OneController/ACTION$getCurrentApp
  • Keine Parameter

Ruft weitere Informationen zur App ab, einschließlich einer erweiterten Liste von Objekten

aura://RecordUiController/ACTION$getObjectInfo
  • ObjectApiName (String) – Der Name des Objekts

Diese Funktion gibt die Definition des Objekts zurück: seine Felder, seine Beziehungen und seine Konfiguration.

serviceComponent://ui.force.components.controllers.lists.selectableListDataProvider.SelectableListDataProviderController/ACTION$getItems
  • entityNameOrId (String) – der Name des zu listenden Objekts. Zum Beispiel: „Konto“ oder „Benutzer“
  • pageSize (Int) – Anzahl der abzurufenden Datensätze. Maximal 1000
  • currentPage(int) – Wenn es mehr als “pageSize” Datensätze gibt, verwenden Sie dieses Objekt, um zu den nächsten Seiten zu gelangen.
  • getCount (Boolean) – ob die Gesamtzahl der Datensätze abgerufen werden soll.
  • layoutType (String) – Das Layout. Geben Sie „FULL“ an, um mehr Daten zu erhalten
  • enableRowActions(Boolean) – true
  • useTimeout (Boolean) – false

Listet Datensätze der angegebenen Objekte auf.

serviceComponent://ui.force.components.controllers.recordGlobalValueProvider.RecordGvpController/ACTION$getRecord
  • recordDescriptor(string) – der „Deskriptor“ des Datensatzes – verwenden Sie das folgende Format:
{id}.undefined.null.null.null.Id.VIEW.false.null.{fields}.null
  • Id – die ID des abzurufenden Datensatzes, Felder – eine durch Komma getrennte Liste von Feldern, die ausgegeben werden sollen. Ersetzen Sie alle Punkte „.“ durch „;2“. Zum Beispiel:
00500000000XxXXWXX.undefined.null.null.null.Id.VIEW.false.null.Name,CreateBy;2Name.null

Andere nicht dokumentierte Endpoints

aura://ActionsController/ACTION$getActionLayout

aura://ActionsController/ACTION$getGlobalActions

aura://ActionsController/ACTION$getListViewActions

aura://ActionsController/ACTION$getLookupActions

aura://ActionsController/ACTION$getMRUListActions

aura://ActionsController/ACTION$getObjectCreateActions

aura://ActionsController/ACTION$getQuickActionDefaults

aura://ActionsController/ACTION$getRecordActions

aura://ActionsController/ACTION$getRecordEditActions

aura://ActionsController/ACTION$getRelatedListActions

aura://ActionsController/ACTION$getRelatedListRecordActions

aura://ActionsController/ACTION$getRelatedListsActions

aura://ApexActionController/ACTION$execute

aura://AppsController/ACTION$getNavItems

aura://CanvasController/ACTION$getCanvasData

aura://CommerceCatalogController/ACTION$getProduct

aura://CommerceCatalogController/ACTION$getProductCategoryPath

aura://CommerceImporterController/ACTION$importProducts

aura://CommerceSearchController/ACTION$searchProducts

aura://CommerceStorePricingController/ACTION$getProductPrice

aura://ComponentController/ACTION$getApplication

aura://ComponentController/ACTION$getApplicationDef

aura://ComponentController/ACTION$getComponent

aura://ComponentController/ACTION$getComponentDef

aura://ComponentController/ACTION$getComponents

aura://ComponentController/ACTION$getDefinitions

aura://ComponentController/ACTION$getEventDef

aura://ComponentController/ACTION$loadLabels

aura://ComponentController/ACTION$reportDeprecationUsages

aura://ComponentController/ACTION$reportFailedAction

aura://ComponentController/ACTION$reportUsages

aura://ConversationController/ACTION$getConversationCallStructureAndInsights

aura://DynamicComponentController/ACTION$getTemplateDescriptorWithExpansionBundle

aura://HostConfigController/ACTION$getConfigData

aura://LabelController/ACTION$getLabel

aura://LightningExperienceAssistantPlatformController/ACTION$getActiveQuestionnaires

aura://LightningExperienceAssistantPlatformController/ACTION$getActiveScenarios

aura://LightningExperienceAssistantPlatformController/ACTION$getAssistant

aura://LightningExperienceAssistantPlatformController/ACTION$getQuestionnaire

aura://LightningExperienceAssistantPlatformController/ACTION$saveAssistant

aura://LightningExperienceAssistantPlatformController/ACTION$saveQuestionnaire

aura://LinkedInSalesNavigatorController/ACTION$getSalesAccessToken

aura://LinkedInSalesNavigatorController/ACTION$getSignupUrl

aura://ListUiController/ACTION$getListInfoById

aura://ListUiController/ACTION$getListInfoByName

aura://ListUiController/ACTION$getListRecordsById

aura://ListUiController/ACTION$getListRecordsByName

aura://ListUiController/ACTION$getListUiById

aura://ListUiController/ACTION$getListUiByName

aura://ListUiController/ACTION$getListsByObjectName

aura://LookupController/ACTION$getLookupRecords

aura://ManagedContentController/ACTION$getManagedContentByTopicsAndContentKeys

aura://ManagedContentController/ACTION$getPublishedManagedContentListByContentKey

aura://MruListUiController/ACTION$getMruListInfo

aura://MruListUiController/ACTION$getMruListRecords

aura://MruListUiController/ACTION$getMruListUi

aura://NavEventManagerController/ACTION$getClassicNonSetupPageReferenceMappings

aura://NavEventManagerController/ACTION$getClassicSetupPageReferenceMappings

aura://NavEventManagerController/ACTION$getResolvedIntegrationUrl

aura://NavigationMenuController/ACTION$getCommunityNavigationMenu

aura://OrchestrationController/ACTION$getOrchestrationInstance

aura://OrchestrationController/ACTION$getOrchestrationInstanceCollection

aura://OrchestrationController/ACTION$publishOrchestrationEvent

aura://RecordMruController/ACTION$updateMru

aura://RecordUiController/ACTION$createRecord

aura://RecordUiController/ACTION$deleteRecord

aura://RecordUiController/ACTION$executeAggregateUi

aura://RecordUiController/ACTION$executeGraphQL

aura://RecordUiController/ACTION$findDuplicates

aura://RecordUiController/ACTION$getAggregateUi

aura://RecordUiController/ACTION$getDedupeConfig

aura://RecordUiController/ACTION$getDuplicateConfig

aura://RecordUiController/ACTION$getFormByName

aura://RecordUiController/ACTION$getLayout

aura://RecordUiController/ACTION$getLayoutUserState

aura://RecordUiController/ACTION$getObjectInfo

aura://RecordUiController/ACTION$getObjectInfos

aura://RecordUiController/ACTION$getPicklistValues

aura://RecordUiController/ACTION$getPicklistValuesByRecordType

aura://RecordUiController/ACTION$getRecordAvatars

aura://RecordUiController/ACTION$getRecordCloneDefaults

aura://RecordUiController/ACTION$getRecordCreateDefaults

aura://RecordUiController/ACTION$getRecordDefaultsTemplateClone

aura://RecordUiController/ACTION$getRecordDefaultsTemplateForCreate

aura://RecordUiController/ACTION$getRecordUis

aura://RecordUiController/ACTION$getRecordWithFields

aura://RecordUiController/ACTION$getRecordWithLayouts

aura://RecordUiController/ACTION$getRecordsWithFields

aura://RecordUiController/ACTION$getRecordsWithLayouts

aura://RecordUiController/ACTION$getValidationRulesInfo

aura://RecordUiController/ACTION$postRecordAvatarAssociation

aura://RecordUiController/ACTION$updateLayoutUserState

aura://RecordUiController/ACTION$updateRecord

aura://RelatedListUiController/ACTION$getRelatedListInfo

aura://RelatedListUiController/ACTION$getRelatedListInfoBatch

aura://RelatedListUiController/ACTION$getRelatedListInfoByApiName

aura://RelatedListUiController/ACTION$getRelatedListInfoCollection

aura://RelatedListUiController/ACTION$getRelatedListRecordCount

aura://RelatedListUiController/ACTION$getRelatedListRecords

aura://RelatedListUiController/ACTION$getRelatedListRecordsBatch

aura://RelatedListUiController/ACTION$getRelatedListsRecordCount

aura://RelatedListUiController/ACTION$updateRelatedListInfoByApiName

aura://SearchGridLWCController/ACTION$updateUserColumnWidthPref

aura://SeoPropertiesController/ACTION$getRecordSeoProperties

aura://SitesController/ACTION$searchSite

aura://StyleController/ACTION$applyTokens

aura://WaveController/ACTION$deleteDataset

aura://WaveController/ACTION$deleteRecipe

aura://WaveController/ACTION$executeQueryByInputRep

aura://WaveController/ACTION$getAnalyticsLimits

aura://WaveController/ACTION$getDataflowJob

aura://WaveController/ACTION$getDataflowJobNode

aura://WaveController/ACTION$getDataflowJobNodes

aura://WaveController/ACTION$getDataflowJobs

aura://WaveController/ACTION$getDataflowJobsByDataflowId

aura://WaveController/ACTION$getDataset

aura://WaveController/ACTION$getDatasets

aura://WaveController/ACTION$getRecipe

aura://WaveController/ACTION$getRecipes

aura://WaveController/ACTION$getReplicatedDatasets

aura://WaveController/ACTION$getSchedule

aura://WaveController/ACTION$getWaveFolders

aura://WaveController/ACTION$getXmd

aura://WaveController/ACTION$startDataflow

aura://WaveController/ACTION$updateDataflowJob

aura://WaveController/ACTION$updateSchedule

serviceComponent://ui.chatter.components.aura.components.forceChatter.groups.actions.EditGroupNotificationSettingsController/ACTION$getNotificationSettings

serviceComponent://ui.chatter.components.aura.components.forceChatter.groups.actions.EditGroupNotificationSettingsController/ACTION$setNotificationSettings

serviceComponent://ui.chatter.components.messages.MessagesController/ACTION$addParticipants

serviceComponent://ui.chatter.components.messages.MessagesController/ACTION$createMessage

serviceComponent://ui.chatter.components.messages.MessagesController/ACTION$getMessagesDetail

serviceComponent://ui.chatter.components.messages.MessagesController/ACTION$getMessagesListData

serviceComponent://ui.chatter.components.messages.MessagesController/ACTION$getMessagingPermAndPref

serviceComponent://ui.chatter.components.messages.MessagesController/ACTION$getMoreReplies

serviceComponent://ui.chatter.components.messages.MessagesController/ACTION$getRichTextConfig

serviceComponent://ui.chatter.components.messages.MessagesController/ACTION$getUserDetails

serviceComponent://ui.chatter.components.messages.MessagesController/ACTION$removeParticipants

serviceComponent://ui.comm.runtime.components.aura.components.siteforce.controller.PubliclyCacheableAttributeLoaderController/ACTION$getComponentAttributes

serviceComponent://ui.comm.runtime.components.aura.components.siteforce.controller.PubliclyCacheableComponentLoaderController/ACTION$getAudienceTargetedPageComponent

serviceComponent://ui.comm.runtime.components.aura.components.siteforce.controller.PubliclyCacheableComponentLoaderController/ACTION$getPageComponent

serviceComponent://ui.comm.runtime.components.aura.components.siteforce.network.tracking.NetworkTrackingController/ACTION$createLogRecord

serviceComponent://ui.comm.runtime.components.aura.components.siteforce.qb.QuarterbackController/ACTION$getBootstrapCacheExpiration

serviceComponent://ui.comm.runtime.components.aura.components.siteforce.qb.QuarterbackController/ACTION$getTopicDescription

serviceComponent://ui.comm.runtime.components.aura.components.siteforce.qb.QuarterbackController/ACTION$isValidSObjectId

serviceComponent://ui.comm.runtime.components.aura.components.siteforce.qb.QuarterbackController/ACTION$setCurrentApp

serviceComponent://ui.comm.runtime.components.aura.components.siteforce.qb.QuarterbackController/ACTION$validateRoute

serviceComponent://ui.comm.runtime.components.aura.components.siteforce.recordservicecomponent.RecordServiceComponentController/ACTION$getActionOverrides

serviceComponent://ui.comm.runtime.components.aura.components.siteforce.recordservicecomponent.RecordServiceComponentController/ACTION$getArticleUrlNameAndVersionId

serviceComponent://ui.comm.runtime.components.aura.components.siteforce.recordservicecomponent.RecordServiceComponentController/ACTION$getArticleVersionId

serviceComponent://ui.comm.runtime.components.aura.components.siteforce.recordservicecomponent.RecordServiceComponentController/ACTION$getCMSContentTypeAndURLName

serviceComponent://ui.comm.runtime.components.aura.components.siteforce.recordservicecomponent.RecordServiceComponentController/ACTION$getCMSContentTypeUrlnameAndId

serviceComponent://ui.comm.runtime.components.aura.components.siteforce.recordservicecomponent.RecordServiceComponentController/ACTION$getCategoryPath

serviceComponent://ui.comm.runtime.components.aura.components.siteforce.recordservicecomponent.RecordServiceComponentController/ACTION$getNameFieldValue

serviceComponent://ui.comm.runtime.components.aura.components.siteforce.recordservicecomponent.RecordServiceComponentController/ACTION$getPersonAccountIdFromContactId

serviceComponent://ui.comm.runtime.components.aura.components.siteforce.recordservicecomponent.RecordServiceComponentController/ACTION$isAllowViewEditConvertedLeadsOn

serviceComponent://ui.comm.runtime.components.aura.components.siteforce.service.ServiceBodyController/ACTION$getTopicImageUrlFromContextId

serviceComponent://ui.communities.components.aura.components.forceCommunity.baseSearch.BaseSearchController/ACTION$getCrossObjectDeflection

serviceComponent://ui.communities.components.aura.components.forceCommunity.controller.DeflectionDataProviderController/ACTION$getArticleDeflection

serviceComponent://ui.communities.components.aura.components.forceCommunity.controller.DeflectionDataProviderController/ACTION$getCombinedDeflection

serviceComponent://ui.communities.components.aura.components.forceCommunity.controller.DeflectionDataProviderController/ACTION$getCrossObjectDeflection

serviceComponent://ui.communities.components.aura.components.forceCommunity.controller.DeflectionDataProviderController/ACTION$getQuestionDeflection

serviceComponent://ui.communities.components.aura.components.forceCommunity.controller.LWCRecordDetailController/ACTION$getInitData

serviceComponent://ui.communities.components.aura.components.forceCommunity.controller.OmniBoxController/ACTION$getTopic

serviceComponent://ui.communities.components.aura.components.forceCommunity.controller.OmniBoxController/ACTION$getTopicFromEntityId

serviceComponent://ui.communities.components.aura.components.forceCommunity.controller.OmniBoxController/ACTION$getTopicFromUrl

serviceComponent://ui.communities.components.aura.components.forceCommunity.navigationMenu.NavigationMenuDataProviderController/ACTION$getNavigationMenu

serviceComponent://ui.communities.components.aura.components.forceCommunity.signalCollector.SignalCollectorController/ACTION$sendSignals

serviceComponent://ui.force.components.controllers.action.ActionController/ACTION$getServerSideComponent

serviceComponent://ui.force.components.controllers.dedupe.DedupeManagerController/ACTION$findMatches

serviceComponent://ui.force.components.controllers.dedupe.DedupeManagerController/ACTION$getConfig

serviceComponent://ui.force.components.controllers.dedupe.DedupeManagerController/ACTION$loadObjectApiInfo

serviceComponent://ui.force.components.controllers.dedupe.DedupeManagerController/ACTION$loadRecords

serviceComponent://ui.force.components.controllers.detail.DetailController/ACTION$cloneRecordWithRelatedEntities

serviceComponent://ui.force.components.controllers.detail.DetailController/ACTION$getDetailComponent

serviceComponent://ui.force.components.controllers.detail.DetailController/ACTION$getEntityConfig

serviceComponent://ui.force.components.controllers.detail.DetailController/ACTION$getNextRecordLayout

serviceComponent://ui.force.components.controllers.detail.DetailController/ACTION$getPostSaveNavigationEvent

serviceComponent://ui.force.components.controllers.detail.DetailController/ACTION$getRecord

serviceComponent://ui.force.components.controllers.detail.DetailController/ACTION$saveSectionState

serviceComponent://ui.force.components.controllers.dynamicLabel.UiDynamicLabelProviderController/ACTION$getLabel

serviceComponent://ui.force.components.controllers.hostConfig.HostConfigController/ACTION$getConfigData

serviceComponent://ui.force.components.controllers.inlineEdit.InlineEditController/ACTION$getNameField

serviceComponent://ui.force.components.controllers.inlineEdit.InlineEditController/ACTION$getPostSaveNavigationEvent

serviceComponent://ui.force.components.controllers.logoutHandler.LogoutHandlerController/ACTION$getLogoutURL

serviceComponent://ui.force.components.controllers.recordGlobalValueProvider.RecordGvpController/ACTION$createQuickActionRecords

serviceComponent://ui.force.components.controllers.recordGlobalValueProvider.RecordGvpController/ACTION$createRecord

serviceComponent://ui.force.components.controllers.recordGlobalValueProvider.RecordGvpController/ACTION$deleteRecord

serviceComponent://ui.force.components.controllers.recordGlobalValueProvider.RecordGvpController/ACTION$getRecord

serviceComponent://ui.force.components.controllers.recordGlobalValueProvider.RecordGvpController/ACTION$saveQuickActionRecords

serviceComponent://ui.force.components.controllers.recordGlobalValueProvider.RecordGvpController/ACTION$saveRecord

serviceComponent://ui.force.components.controllers.recordGlobalValueProvider.RecordGvpController/ACTION$saveRecords

serviceComponent://ui.force.components.controllers.recordLayoutBroker.RecordLayoutBrokerController/ACTION$getLayout

serviceComponent://ui.force.components.controllers.recordLayoutBroker.RecordLayoutBrokerController/ACTION$getRecordAndLayout

serviceComponent://ui.force.impl.aura.components.force.recordEditActions.RecordEditActionsController/ACTION$getEditActions

serviceComponent://ui.global.components.one.actionsManager.ActionsManagerController/ACTION$handleAction

serviceComponent://ui.identity.components.sessiontimeoutwarn.SessionTimeoutWarnController/ACTION$getSessionRefreshAction

serviceComponent://ui.identity.components.sessiontimeoutwarn.SessionTimeoutWarnController/ACTION$getSessionTimeoutConfig

serviceComponent://ui.instrumentation.components.beacon.InstrumentationBeaconController/ACTION$getLocators

serviceComponent://ui.instrumentation.components.beacon.InstrumentationBeaconController/ACTION$sendData

serviceComponent://ui.search.components.forcesearch.sgdp.MRUCacheController/ACTION$getGlobalMrus

serviceComponent://ui.search.components.forcesearch.sgdp.PermsAndPrefsCacheController/ACTION$getPermsAndPrefs

serviceComponent://ui.search.components.forcesearch.sgdp.ResultsFiltersCacheController/ACTION$getResultsFilterMetadata

serviceComponent://ui.search.components.forcesearch.sgdp.ScopesCacheController/ACTION$getEntityLabels

serviceComponent://ui.search.components.forcesearch.sgdp.ScopesCacheController/ACTION$getEntityNames

serviceComponent://ui.search.components.forcesearch.sgdp.ScopesCacheController/ACTION$getScopeMaps

serviceComponent://ui.self.service.components.profileMenu.ProfileMenuController/ACTION$getContextUserPhotoUrlAndUpdatedName

serviceComponent://ui.self.service.components.profileMenu.ProfileMenuController/ACTION$getProfileMenuResponse

serviceComponent://ui.sfa.components.nativeimport.ImportButtonController/ACTION$getConfig

 

Avatar

Adrien Rahmati-Georges

Adrien has been formed in Cybersecurity, Risks and Competitive Intelligence at the School of Economic Warfare in Paris, France. He likes to unpack the different layers of geopolitical and technical interests behind an attack, and evangelize about the risks involved. Working as Marketing Coordinator at Varonis from 2017, he is providing French and German content for our Blogs.

 

Möchten Sie Varonis in Aktion erleben?

Vereinbaren Sie eine Demo oder wenden Sie sich an unseren Vertrieb unter +49 89 3803 7990