Utilisation abusive de communautés Salesforce mal configurées pour la reconnaissance et le vol de données

Sécurité des données

Résumé

Une communauté Salesforce mal configurée peut entraîner l’exposition de données Salesforce sensibles à quiconque sur Internet. Les utilisateurs anonymes peuvent consulter des objets qui contiennent des informations sensibles telles que des listes de clients, des dossiers d’assistance et des adresses e-mail d’employés.

Notre équipe de recherche a découvert de nombreuses communautés Salesforce accessibles au public qui sont mal configurées et exposent des informations sensibles.

Ce n’est ni la première ni la dernière fois qu’une configuration SaaS génère un incident de sécurité potentiel, ce qui souligne la nécessité pour les équipes de sécurité d’évaluer en permanence leur exposition SaaS.

Ce guide explique comment un hacker peut exploiter cette mauvaise configuration et présente aux administrateurs Salesforce les étapes détaillées à suivre pour :

  1. Vous assurer que les autorisations de votre profil invité n’exposent pas des éléments que vous ne souhaitez pas voir exposés (enregistrements de comptes, calendriers des employés, etc.)
  2. Désactiver l’accès API pour votre profil invité
  3. Définir le propriétaire par défaut des enregistrements créés par des utilisateurs invités
  4. Activer l’accès utilisateur invité sécurisé

Impact

Au mieux, un acteur malveillant pourrait exploiter cette mauvaise configuration pour effectuer la reconnaissance d’une campagne de spear-phishing. Au pire, ils pourraient voler des informations sensibles sur l’entreprise, ses opérations, ses clients et ses partenaires.

Dans certains cas, un hacker expérimenté peut être en mesure de se déplacer latéralement et de récupérer des informations à partir d’autres services intégrés au compte Salesforce.

Les communautés Salesforce : qu’est-ce que c’est ?

Une communauté Salesforce permet à vos clients et partenaires d’interagir avec votre instance Salesforce depuis l’extérieur de votre organisation. Ils peuvent ouvrir des tickets d’assistance, poser des questions, gérer leurs abonnements et bien plus .

Les communautés sont publiques et, par défaut, indexées par Google. Bien que cela soit utile pour les clients et les partenaires, il est facile pour les hackers qui découvrent une vulnérabilité ou une mauvaise configuration de repérer et d’exploiter des communautés à grande échelle.

Comme vous le verrez, Salesforce est hautement personnalisable et peut être difficile à gérer. Il n’existe pas deux instances Salesforce identiques, elles comportent des centaines d’applications tierces, d’objets personnalisés et de configurations.

Contexte technique

Les communautés Salesforce fonctionnent grâce au framework Lightning de Salesforce. Lightning est un framework de développement rapide pour les sites mobiles et pour ordinateurs.

Salesforce Lightning est centré sur les composants. Ces composants, appelés composants Aura, sont des objets autonomes qu’un développeur peut assembler pour créer des pages Web personnalisées.

Les composants Aura peuvent être utilisés pour réaliser des actions sur des objets Salesforce, comme l’affichage ou la mise à jour d’enregistrements. Les composants possèdent des contrôleurs qui exportent différentes méthodes pour effectuer certaines tâches.

La navigation sur un site communautaire avec un service proxy, tel que la suite Burp, nous montre Lightning en action. L’interface utilisateur Web d’une communauté utilise les terminaux HTTP /s/sfsites/aura.

Le navigateur utilise les terminaux Aura pour récupérer des informations sur le site et effectuer des actions côté serveur lorsque l’utilisateur interagit avec le site communautaire. Naturellement, les autorisations de l’utilisateur s’appliquent à ces actions.

Browsing Salesforce with Burp Suite

L’appel des terminaux Aura est une simple requête HTTP, soit GET soit POST, qui se compose des paramètres suivants :

  • pageURI – Le chemin d’accès au site, sans l’hôte. Par exemple : « /s/ ».
  • token – Le token de l’utilisateur actuel. La valeur « non définie » indique un utilisateur invité.
  • context – Le contexte de la session en cours, fourni par le site.
  • message – Décrit l’action souhaitée. Il est possible d’exécuter de nombreuses méthodes dans le même appel Aura. Cette structure contient une liste d’actions, qui contiennent le descripteur de la méthode (un identifiant unique de la méthode) et les paramètres d’appel.

La structure du message est un JSON codé en URL. Voici un exemple :

{
"actions": [
{
"id": "222;a",
"descriptor": "serviceComponent://ui.force.components.controllers.hostConfig.HostConfigController/ACTION$getConfigData ",
"callingDescriptor": "UNKNOWN",
"params": {}
}
]
}
  • id – Une chaîne aléatoire qui peut être utilisée pour envoyer plus d’une action dans une seule demande. De cette façon, le navigateur peut faire correspondre les actions et les réponses.
  • descriptor – La méthode spécifique pour appeler.
  • callingDescriptor – Généralement « INCONNU », car ce paramètre est souvent ignoré.
  • params – Utilisé pour fournir des paramètres à la méthode

Il existe de nombreuses méthodes différentes qu’un utilisateur non authentifié peut exécuter pour effectuer des actions, telles que :

  • Obtenir des informations sur le site
  • Obtenir des informations sur l’abonnement Salesforce
  • Afficher les objets par défaut et personnalisés ainsi que leurs champs
  • Récupérer les données et les enregistrements

Parmi les objets que vous pouvez consulter figurent les options Compte, Utilisateur, Dossier, Employé, Pièce jointe, Contact et Prospect.

Comment les hackers peuvent-ils exploiter des communautés mal configurées ?

Dans les sites mal configurés, le hacker peut effectuer une reconnaissance en recherchant des informations sur l’organisation, comme les utilisateurs, les objets et les champs qui exposent les noms et les adresses e-mail, et dans de nombreux cas, il peut infiltrer le système ou voler des informations.

Tout d’abord, le hacker doit trouver un site communautaire à exploiter. Il suffit d’utiliser la magie de Google. Il existe des « empreintes digitales » d’URL courantes qui indiquent qu’un site Web est géré par des communautés Salesforce :

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

Let me Google that for you

En utilisant des opérateurs tels que « inurl: » ainsi que le nom de la cible, par exemple, vous trouverez souvent le site communautaire souhaité :

Google search with inurl parameter

L’étape suivante consiste à récupérer des informations sur le site. Le hacker peut le faire en utilisant la méthode suivante :

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

Cette méthode renvoie le domaine de l’organisation, certains paramètres de sécurité (par exemple, les domaines de politique de sécurité du contenu (CSP) autorisés) et les objets disponibles.

Le hacker peut recourir à différentes méthodes pour effectuer différentes actions telles que :

  • Répertorier des objets Salesforce
  • Répertorier des enregistrements
  • Rechercher des enregistrements
  • Récupérer un objet
  • Récupérer des informations sur l’instance Salesforce

Récupérer des données sensibles

Les hackers peuvent essayer d’accéder directement aux données sensibles. Notre équipe de sécurité a trouvé une multitude d’enregistrements sensibles exposés lors de nos recherches.

Le hacker peut cibler des objets spécifiques et les examiner en utilisant la méthode :

aura://RecordUiController/ACTION$getObjectInfo

Qui renvoie des informations sur un objet. Cette méthode prend en charge tous les types d’objets, y compris ceux personnalisés.

Les informations comprennent les différents champs, leur configuration et les relations enfants de l’objet.

L’étape suivante consisterait à répertorier les enregistrements en utilisant la méthode :

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

Voici un exemple de liste d’enregistrements de comptes utilisant cette méthode :

Le hacker peut ensuite aller chercher encore plus d’informations en utilisant des méthodes telles que :

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

ou

aura://RecordUiController/ACTION$getRecordWithFields

Pour récupérer des enregistrements pertinents avec plus de champs et d’objets associés.

Rechercher des composants tiers vulnérables

Un adversaire expérimenté peut tenter d’attaquer des composants personnalisés et tiers vulnérables.

Dans certains cas, il est possible de prendre le contrôle de l’ensemble de l’instance Salesforce simplement en exploitant une classe Apex personnalisée vulnérable exposée aux utilisateurs invités.

Lorsque l’on navigue sur le site, on constate que le navigateur charge plusieurs fichiers JavaScript différents avec des URL étranges, qui commencent par /l/ suivi par un objet JSON codé.

Dans ces fichiers JavaScript, nous pouvons trouver les définitions des terminaux les plus accessibles, y compris les terminaux personnalisés et/ou les applications tierces. Les définitions sont encodées au format JSON :

{
"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"
}
]
}

En analysant la réponse des chaînes JSON de forme similaire, les méthodes personnalisées et la procédure à suivre pour les appeler deviennent évidentes.

Alors, que faire ?

La gestion d’un site communautaire est un travail difficile. Il est important de s’assurer que les utilisateurs invités anonymes et les utilisateurs de la communauté soient uniquement autorisés à accéder aux enregistrements prévus et nécessaires. Il y a des informations que vous souhaitez partager avec le monde entier et d’autres pas.

Pour sécuriser votre environnement Salesforce, il est très important d’adhérer au principe du moindre privilège et de veiller à ce que les profils invités disposent uniquement des autorisations minimales requises.

Étape 1 – Vérifier les autorisations de votre profil invité

Accédez à votre Créateur de site (recherchez « Tous les sites » dans la configuration) et cliquez sur Paramètres ou sur l’icône d’engrenage sur la gauche.

Vous trouverez votre profil d’utilisateur invité sous Général. Cliquez dessus pour modifier les autorisations de l’utilisateur invité.

Ici, vous pouvez contrôler la sécurité au niveau du champ pour gérer l’accès à un niveau très poussé. C’est ici que vous devrez décider quel accès accorder en fonction des besoins de votre entreprise.

Étape 2 – Désactiver l’accès API

Il est important de s’assurer que la case API activée est décochée. Il est recommandé de désactiver Accès aux activités également.

Il est important de surveiller en permanence les autorisations et les rôles de partage des utilisateurs invités et de la communauté, et de garder un œil sur les documents qu’ils possèdent (et leurs objets associés) pour s’assurer que les informations sensibles ne deviennent pas accessibles au public.

Étape 3 – Définir le propriétaire par défaut des enregistrements créés par des utilisateurs invités

Vous pouvez accéder directement aux espaces de travail de votre site, ou bien utiliser le créateur de site pour aller dans l’espace de travail Administration :

Sous Préférences, assurez-vous de configurer un propriétaire par défaut pour les enregistrements créés par les utilisateurs invités et, dans la plupart des cas, désactivez Permettre aux utilisateurs invités de voir les membres de ce site.

Étape 4 – Activer l’accès sécurisé aux enregistrements des utilisateurs invités

Vérifiez que le paramètre d’accès par défaut pour les utilisateurs invités est sécurisé : allez dans le menu Configuration, et recherchez Paramètres de partage. Trouvez l’option Activer l’accès sécurisé aux enregistrements des utilisateurs invités et vérifiez qu’elle est cochée.

Salesforce fait tout pour vous aider à prendre des décisions intelligentes concernant l’accès des invités. Depuis la version été 2020, Salesforce a rendu impossible la désactivation de ce paramètre. De plus, il est désormais impossible d’accorder aux utilisateurs invités les autorisations pour Afficher tous les utilisateurs et de leur donner accès à toutes les données.

Il est toutefois primordial de revoir les paramètres de configuration. Salesforce ne peut pas toutes les désactiver pour vous, car chaque utilisateur a des exigences différentes.

Conclusion

Comme vous pouvez le constater, avec des applications SaaS aussi complexes et personnalisables que Salesforce, il faut se préoccuper d’innombrables paramètres de configuration et autorisations.

La plupart des organisations déploient des dizaines d’applications SaaS autorisées, chacune avec ses propres objets, modèles d’autorisations, API et fonctionnalités de partage.

C’est pourquoi nous avons conçu DatAdvantage Cloud, afin de fournir un outil centralisé pour détecter les risques, ajuster les privilèges et effectuer des enquêtes sur toutes vos applications SaaS autorisées.

Annexe : les descripteurs Aura et comment les utiliser

 serviceComponent://ui.force.components.controllers.hostConfig.HostConfigController/ACTION$getConfigData
  • Aucun paramètre

Récupère les données de l’application, y compris une liste d’objets qui incluent souvent des objets personnalisés et le domaine de connexion Salesforce.

serviceComponent://ui.global.components.one.one.controller.OneController/ACTION$getCurrentApp
  • Aucun paramètre

Permet d’obtenir plus d’informations sur l’application, y compris une liste étendue d’objets.

aura://RecordUiController/ACTION$getObjectInfo
  • ObjectApiName (String) – Le nom de l’objet

Cette fonction renvoie la définition de l’objet : ses champs, ses relations et sa configuration.

serviceComponent://ui.force.components.controllers.lists.selectableListDataProvider.SelectableListDataProviderController/ACTION$getItems
  • entityNameOrId (String) – Le nom de l’objet à lister. Par exemple : « Compte » ou « Utilisateur »
  • pageSize (Int) – Nombre d’enregistrements à récupérer. Jusqu’à 1 000
  • currentPage(int) – S’il y a plus d’enregistrements pageSize, utilisez cette commande pour obtenir les pages suivantes.
  • getCount (Boolean) – Si le nombre total d’enregistrements doit être récupéré.
  • layoutType (String) – La mise en page. Indiquez « FULL » pour obtenir plus de données
  • enableRowActions(Boolean) – true
  • useTimeout (Boolean) – false

Liste les enregistrements des objets spécifiés.

serviceComponent://ui.force.components.controllers.recordGlobalValueProvider.RecordGvpController/ACTION$getRecord
  • recordDescriptor(string) – le « descripteur » de l’enregistrement – utilisez le format suivant :
{id}.undefined.null.null.null.Id.VIEW.false.null.{fields}.null
  • ID – l’ID de l’enregistrement à récupérer, champs – un champ à renvoyer séparé par des virgules. Remplacez tous les points « . » par « ;2 ». Par exemple :
00500000000XxXXWXX.undefined.null.null.null.Id.VIEW.false.null.Name,CreateBy;2Name.null

Autres terminaux non documentés

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 a été formé à la cybersécurité, aux risques et à l'intelligence économique à l'École de Guerre Économique de Paris. Il aime décortiquer les différentes couches d'intérêts géopolitiques derrière une attaque, et évangéliser autour des risques encourus. Travaillant comme coordinateur marketing chez Varonis depuis 2017, il fournit du contenu français et allemand pour nos blogs.

 

Votre cybersécurité est-elle au cœur de votre infrastructure ?

Bénéficiez d'une évaluation personnalisée des risques auxquels sont exposées vos données, effectuée par des ingénieurs passionnés par la sécurité des données.