Использование некорректно настроенных сообществ Salesforce для разведки и кражи данных

Защита данных, Исследование угроз

Обзор исполнительной среды

Некорректная настройка сообщества Salesforce (Salesforce Community) может привести к тому, что конфиденциальные данные Salesforce станут доступны любому пользователю в интернете. Анонимные пользователи могут запрашивать объекты, содержащие конфиденциальную информацию, такую как списки клиентов, запросы в службу поддержки и адреса электронной почты сотрудников.

Наша команда аналитиков обнаружила множество общедоступных сообществ Salesforce, которые некорректно настроены и могут раскрывать конфиденциальную информацию.

Это не первый и наверняка не последний раз, когда некорретная конфигурация SaaS создает потенциальный инцидент безопасности, что подчеркивает важность постоянной оценки уязвимостей SaaS.

В этом руководстве объясняется, как злоумышленник может использовать неправильную настройку в своих целях, а также приведены подробные шаги для администраторов Salesforce, которые позволят:

  1. Убедиться, что разрешения гостевого профиля не позволяют раскрыть информацию, которую вы не хотите раскрывать (учетные записи, календари сотрудников и т. д.)
  2. Отключить доступ к API для гостевого профиля
  3. Установить владельца по умолчанию для записей, созданных гостевыми пользователями
  4. Включить безопасный гостевой доступ

Результат

Как минимум, злоумышленники могут использовать эту некорректную настройку для проведения разведки в рамках кампании адресного фишинга. В худшем случае они могут украсть конфиденциальную информацию о компании, ее деятельности, клиентах и партнерах. В некоторых случаях опытный злоумышленник может перемещаться внутри сети и получать информацию из других сервисов, интегрированных с учетной записью Salesforce.

Что представляют собой сообщества Salesforce?

Сайт сообщества Salesforce позволяет клиентам и партнерам компании пользоваться CRM-системой вне вашей организации, а также создавать запросы на поддержку, задавать вопросы, управлять подписками и многое другое.

Сообщества являются публичными и по умолчанию индексируются Google. Хотя это весьма полезно для клиентов и партнеров, злоумышленникам, обнаружившим уязвимость или некорректную настройку, становится проще сканировать сообщества и злоупотреблять ими в масштабе.

Вы увидите, что система Salesforce обладает широкими возможностями настройки и может быть сложной в администрировании. Из-за наличия сотен сторонних приложений, пользовательских объектов и конфигураций двух одинаковых экземпляров Salesforce просто не существует.

Технические аспекты

Сообщества Salesforce работают на платформе Salesforce Lightning. Lightning – это система быстрой разработки для мобильных и десктопных версий сайтов.

Salesforce Lightning — это платформа, ориентированная на компоненты. Эти компоненты, называемые компонентами Aura, представляют собой самостоятельные объекты, которые разработчик может собирать для создания пользовательских веб-страниц.

Компоненты Aura используются для выполнения действий с объектами Salesforce, таких как просмотр или обновление записей. У компонентов есть контроллеры, экспортирующие различные методы для выполнения определенных задач.

Просмотр сайта сообщества с помощью прокси-сервиса, такого как Burp Suite, показывает нам Lightning в действии. Внешний веб-интерфейс сообщества использует конечную точку HTTP /s/sfsites/aura.

Браузер использует конечную точку Aura для получения информации о сайте и выполнения действий на стороне сервера, когда пользователь взаимодействует с сайтом сообщества. Естественно, на эти действия распространяются права пользователя.

Вызов конечной точки Aura – это просто HTTP-запрос, GET или POST, который состоит из следующих параметров:

  • pageURI – путь к сайту, без указания хоста. Например: “/s/”;
  • token – текущий токен пользователя. Значение «undefined» указывает на гостевого пользователя;
  • context – предоставленный сайтом контекст текущего сеанса;
  • message  – описывает желаемое действие. В одном вызове aura можно использовать несколько методов. Эта структура включает список действий, в котором содержится дескриптор метода (уникальный идентификатор метода) и параметры вызова.

Структура сообщения представляет собой JSON с URL-кодировкой. Вот пример:

  • id – случайная строка, которая может использоваться при отправке нескольких действий в одном запросе. Таким образом, браузер может сопоставить действия и ответы;
  • descriptor – определенный метод вызова;
  • callingDescriptor – обычно это «UNKNOWN», так как этот параметр часто игнорируется;
  • params – используется для предоставления параметров методу.

Существует множество различных методов, которые пользователь, не прошедший аутентификацию, может использовать для выполнения действий, например:

  • Получить информацию о сайте;
  • Получить информацию о подписке Salesforce;
  • Просмотр стандартных и пользовательских объектов и их полей;
  • Получение данных и записей.

Некоторые из объектов, которые можно запросить: учетные записи, пользователи, кейсы, сотрудники, вложения, контакты и руководители.

Как злоумышленники могут использовать неправильно настроенные сообщества?

На неправильно настроенных сайтах злоумышленник может проводить разведку в поисках информации об организации, например о пользователях, объектах и областях, которые раскрывают имена и адреса электронной почты, а во многих случаях он может проникнуть в систему или украсть информацию.

Во-первых, злоумышленник должен найти сайт сообщества для взлома. Здесь не обойтись без магии Google. Существуют общие признаки URL, по которым можно определить, что сайт работает на Salesforce Communities:

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

Например, с помощью таких запросов, как «inurl:» и целевого названия, часто можно найти нужный сайт сообщества:

Следующим шагом будет получение информации о сайте. Злоумышленник может сделать это, вызвав приведенный ниже метод:

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

Этот метод восстанавливает домен организации, некоторые параметры безопасности (например, разрешенные домены политики безопасности контента (CSP)) и доступные объекты.

Злоумышленник может вызывать различные методы для выполнения таких действий, как:

  • Составление списка объектов Salesforce
  • Отображение записей
  • Поиск записей
  • Загрузка объекта
  • Получение информации об экземпляре Salesforce

Извлечение конфиденциальных данных

Злоумышленники могут попытаться получить прямой доступ к конфиденциальным данным. В ходе исследования наша служба безопасности обнаружила множество раскрытых конфиденциальных записей.

Злоумышленник может нацеливаться на определенные объекты и исследовать их, вызывая метод:

aura://RecordUiController/ACTION$getObjectInfo

который восстанавливает информацию об объекте. Этот метод применим ко всем видам объектов, включая пользовательские.

Данная информация включает различные поля, их настройку и дочерние отношения объекта.

Следующий этап – составление списка записей с помощью вышеуказанного метода:

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

Рассмотрим пример составления списка учетных записей с помощью данного метода:

Затем злоумышленник может получить еще больше информации, используя такие методы, как:

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

или

aura://RecordUiController/ACTION$getRecordWithFields

для получения интересующих их записей с большим количеством полей и связанных объектов.

Охота на уязвимые компоненты сторонних разработчиков

Опытный злоумышленник может попытаться атаковать уязвимые пользовательские и сторонние компоненты.

В некоторых случаях можно завладеть всем экземпляром Salesforce, просто используя уязвимый настраиваемый класс Apex, который открыт для гостевых пользователей.

При просмотре сайта мы видим, что браузер загружает несколько различных файлов JavaScript со странными URL-адресами, которые начинаются с /l/, а затем закодированный объект JSON.

В этих файлах JavaScript можно найти определения наиболее доступных конечных точек, включая пользовательские и/или сторонние приложения. Определения закодированы в JSON:

Просканировав ответ на наличие аналогично сформированных строк JSON, можно узнать о пользовательских методах и способах их вызова.

Что вы можете сделать?

Управление сайтом сообщества — сложная работа. Важно убедиться, что анонимные гостевые пользователи и пользователи сообщества могут получить доступ только к целевым и необходимым записям.

Для обеспечения безопасности среды Salesforce очень важно придерживаться принципа наименьших привилегий и убедиться, что гостевые профили имеют только минимально необходимые права доступа.

Шаг 1. Проверьте права доступа к гостевому профилю

Перейдите в конструктор сайтов (найдите в настройках «Все сайты») и нажмите на Настройки или значок шестеренки слева.

Вы найдете профиль гостевого пользователя в разделе Общие настройки. Нажмите на него, чтобы изменить разрешения гостевого пользователя.

Здесь вы можете управлять безопасностью на уровне поля, чтобы контролировать доступ на очень детальном уровне. Здесь вам нужно будет принимать решения о доступе с учетом потребностей вашего бизнеса.

Шаг 2. Отключите доступ к API

Важно убедиться, что флажок API включен снят. Рекомендуется также отключить активности доступа.

Важно постоянно проверять разрешения и роли гостевых пользователей и пользователей сообщества, а также следить за записями в их распоряжении (и связанными с ними объектами), чтобы конфиденциальная информация не стала общедоступной.

Шаг 3. Установите владельца по умолчанию для записей, созданных гостевыми пользователями

Перейдите непосредственно в рабочую область вашего сайта либо используйте конструктор сайтов для перехода в рабочую область администрирования:

В разделе предпочтений убедитесь, что вы установили владельца по умолчанию для записей, созданных гостевыми пользователями, и, скорее всего, вы захотите отключить опцию Позволять гостевым пользователям видеть участников этого сайта.

Шаг 4. Включите безопасный доступ к записям гостевых пользователей

Убедитесь, что настройки доступа по умолчанию для гостевых пользователей безопасны: перейдите в раздел настройки и найдите Параметры общего доступа, затем опцию Защитить доступ гостевых пользователей к записям  и убедитесь, что она отмечена галочкой.

Salesforce помогает вам принимать разумные решения о гостевом доступе. Начиная с выпуска Summer ’20, Salesforce сделала невозможным отключение этой настройки. Кроме того, теперь вы не можете предоставлять гостевым пользователям разрешения на просмотр всех пользователей и не можете дать им доступ к просмотру всех данных.

Однако крайне важно проверять параметры конфигурации. Salesforce не может отключить их все, потому что у разных пользователей разные требования.

Заключение

Как видите, в приложениях SaaS, таких сложных и персонализируемых, как Salesforce, существует бесчисленное множество параметров настроек и разрешений, требующих  внимания.

Большинство организаций внедряют десятки приложений SaaS, каждое из которых имеет свои объекты, модели разрешений, API и функции совместного использования.

Для единого способа поиска уязвимостей, необходимых привилегий и проведения расследований в SaaS-приложениях мы создали DatAdvantage Cloud.

Приложение: дескрипторы Aura и как их использовать

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

  • Без параметров

Получает данные приложения, включая список объектов, в том числе пользовательские, и домен входа в Salesforce.

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

  • Без параметров

Получает дополнительную информацию о приложении, включая расширенный список объектов

aura://RecordUiController/ACTION$getObjectInfo

  • ObjectApiName (String) – название объекта

Эта функция восстанавливает определение объекта: его поля, отношения и конфигурацию.

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

  • entityNameOrId (String) – имя объекта в списке. Например, «Учетная запись» или «Пользователь».
  • pageSize (Int) – количество записей для извлечения. До 1 000
  • currentPage(int) – в случае, если записей больше, чем pageSize, используйте эту команду для перехода к следующим страницам.
  • getCount (Boolean) – если нужно получить общее количество записей.
  • layoutType (String) – Макет. Введите «FULL», чтобы получить больше данных
  • enableRowActions(Boolean) – true
  • useTimeout (Boolean) – false

Создает список записей указанных объектов.

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

  • recordDescriptor(string) – «дескриптор» записей – используйте следующий формат:

{id}.undefined.null.null.null.Id.VIEW.false.null.{fields}.null

  • Id – идентификатор записи для извлечения, fields – список полей для возврата, разделенных запятой. Замените все точки «.» на «;2». Например:

00500000000XxXXWXX.undefined.null.null.null.Id.VIEW.false.null.Name,CreateBy;2Name.null

Другие недокументированные конечные точки

 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

 

 

Бесплатный аудит рисков кибербезопасности

Узнайте об уязвимостях вашей ИТ-инфраструктуры - мы проведем бесплатный аудит рисков и подготовим для вас отчет. Это займет около 90 минут вашего времени и никак не отразится на бизнес-процессах компании.