Dataverse - Executable uploaded to SharePoint document management site
| Id | ba5e608f-7879-4927-8b0d-a9948b4fe6f3 |
| Rulename | Dataverse - Executable uploaded to SharePoint document management site |
| Description | Identifies executable files and scripts uploaded to SharePoint sites used for Dynamics document management, circumventing native file extension restrictions in Dataverse. |
| Severity | Low |
| Tactics | Execution Persistence |
| Techniques | T0863 T0873 |
| Required data connectors | Office365 |
| Kind | Scheduled |
| Query frequency | 1h |
| Query period | 14d |
| Trigger threshold | 0 |
| Trigger operator | gt |
| Source Uri | https://github.com/Azure/Azure-Sentinel/blob/master/Solutions/Microsoft Business Applications/Analytic Rules/Dataverse - Executable uploaded to SharePoint document management site.yaml |
| Version | 3.2.0 |
| Arm template | ba5e608f-7879-4927-8b0d-a9948b4fe6f3.json |
let file_extensions = dynamic(['com', 'exe', 'bat', 'cmd', 'vbs', 'vbe', 'js', 'jse', 'wsf', 'wsh', 'msc', 'cpl', 'ps1', 'scr']);
let query_frequency = 1h;
DataverseSharePointSites
| join kind=inner (
OfficeActivity
| where TimeGenerated >= ago(query_frequency)
| where OfficeWorkload == "SharePoint" and Operation == "FileUploaded")
on $left.SharePointUrl == $right.Site_Url
| where SourceFileExtension in (file_extensions)
| extend
CloudAppId = int(32780),
SharePointId = int(20892),
AccountName = tostring(split(UserId, '@')[0]),
UPNSuffix = tostring(split(UserId, '@')[1])
| project
TimeGenerated,
UserId,
ClientIP,
InstanceUrl,
SourceFileName,
SharePointUrl,
CloudAppId,
SharePointId,
AccountName,
UPNSuffix
description: Identifies executable files and scripts uploaded to SharePoint sites used for Dynamics document management, circumventing native file extension restrictions in Dataverse.
entityMappings:
- fieldMappings:
- columnName: AccountName
identifier: Name
- columnName: UPNSuffix
identifier: UPNSuffix
entityType: Account
- fieldMappings:
- columnName: ClientIP
identifier: Address
entityType: IP
- fieldMappings:
- columnName: CloudAppId
identifier: AppId
- columnName: InstanceUrl
identifier: InstanceName
entityType: CloudApplication
- fieldMappings:
- columnName: SourceFileName
identifier: Name
entityType: File
- fieldMappings:
- columnName: SharePointId
identifier: AppId
- columnName: SharePointUrl
identifier: InstanceName
entityType: CloudApplication
kind: Scheduled
tactics:
- Execution
- Persistence
severity: Low
triggerThreshold: 0
queryFrequency: 1h
status: Available
queryPeriod: 14d
relevantTechniques:
- T0863
- T0873
version: 3.2.0
id: ba5e608f-7879-4927-8b0d-a9948b4fe6f3
name: Dataverse - Executable uploaded to SharePoint document management site
query: |
let file_extensions = dynamic(['com', 'exe', 'bat', 'cmd', 'vbs', 'vbe', 'js', 'jse', 'wsf', 'wsh', 'msc', 'cpl', 'ps1', 'scr']);
let query_frequency = 1h;
DataverseSharePointSites
| join kind=inner (
OfficeActivity
| where TimeGenerated >= ago(query_frequency)
| where OfficeWorkload == "SharePoint" and Operation == "FileUploaded")
on $left.SharePointUrl == $right.Site_Url
| where SourceFileExtension in (file_extensions)
| extend
CloudAppId = int(32780),
SharePointId = int(20892),
AccountName = tostring(split(UserId, '@')[0]),
UPNSuffix = tostring(split(UserId, '@')[1])
| project
TimeGenerated,
UserId,
ClientIP,
InstanceUrl,
SourceFileName,
SharePointUrl,
CloudAppId,
SharePointId,
AccountName,
UPNSuffix
triggerOperator: gt
eventGroupingSettings:
aggregationKind: SingleAlert
alertDetailsOverride:
alertDescriptionFormat: Executable/script {{SourceFileName}} was uploaded by {{UserId}} in SharePoint site {{SharePointUrl}}
alertDisplayNameFormat: Dataverse - Executable files uploaded in document management for {{InstanceUrl}}
OriginalUri: https://github.com/Azure/Azure-Sentinel/blob/master/Solutions/Microsoft Business Applications/Analytic Rules/Dataverse - Executable uploaded to SharePoint document management site.yaml
requiredDataConnectors:
- dataTypes:
- OfficeActivity (SharePoint)
connectorId: Office365