Detection rules › Splunk

O365 Email Reported By User Found Malicious

Status
production
Severity
medium
Group by
aws::recipientAccountId, dest, sender, signature, signature_id, src, subject, user, vendor_product
Author
Steven Dick
Source
github.com/splunk/security_content

The following analytic detects when an email submitted to Microsoft using the built-in report button in Outlook is found to be malicious. This capability is an enhanced protection feature that can be used within o365 tenants by users to report potentially malicious emails. This correlation looks for any submission that returns a Phish or Malware verdict upon submission.

MITRE ATT&CK coverage

Rules detecting the same action

Other rules on this platform that filter on the same API call or operation.

Rule body splunk

name: O365 Email Reported By User Found Malicious
id: 7698b945-238e-4bb9-b172-81f5ca1685a1
version: 12
creation_date: '2024-04-07'
modification_date: '2026-05-13'
author: Steven Dick
status: production
type: TTP
description: The following analytic detects when an email submitted to Microsoft using the built-in report button in Outlook is found to be malicious. This capability is an enhanced protection feature that can be used within o365 tenants by users to report potentially malicious emails. This correlation looks for any submission that returns a Phish or Malware verdict upon submission.
data_source:
    - Office 365 Universal Audit Log
search: |-
    `o365_management_activity` Workload=SecurityComplianceCenter Operation=AlertEntityGenerated Name="Email reported by user as*"
      | fromjson Data
      | rename _raw AS temp etps AS _raw
      | extract pairdelim=";" kvdelim=":"
      | rename _raw AS etps temp AS _raw
      | search RescanVerdict IN (Phish,Malware)
      | rex field=tsd "\<(?<src_user>.+)\>"
      | eval src_user = case(isnull(src_user),tsd,true(),src_user)
      | rename Name as signature, AlertId as signature_id, AlertEntityId as user, tsd as sender, ms as subject
      | fillnull
      | stats count min(_time) as firstTime max(_time) as lastTime
        BY dest user src
           vendor_account vendor_product signature
           signature_id src_user sender
           subject
      | `security_content_ctime(firstTime)`
      | `security_content_ctime(lastTime)`
      | `o365_email_reported_by_user_found_malicious_filter`
how_to_implement: You must install the Splunk Microsoft Office 365 Add-on and ingest Office 365 management activity events. You must deploy/allow the usage of the Microsoft Office Report A Message function.
known_false_positives: No false positives have been identified at this time.
references:
    - https://learn.microsoft.com/en-us/microsoft-365/security/office-365-security/submissions-outlook-report-messages?view=o365-worldwide
drilldown_searches:
    - name: View the detection results for - "$src_user$" and "$user$"
      search: '%original_detection_search% | search  src_user = "$src_user$" user = "$user$"'
      earliest_offset: $info_min_time$
      latest_offset: $info_max_time$
    - name: View risk events for the last 7 days for - "$src_user$" and "$user$"
      search: '| from datamodel Risk.All_Risk | search normalized_risk_object IN ("$src_user$", "$user$") | stats count min(_time) as firstTime max(_time) as lastTime values(search_name) as "Search Name" values(risk_message) as "Risk Message" values(analyticstories) as "Analytic Stories" values(annotations._all) as "Annotations" values(annotations.mitre_attack.mitre_tactic) as "ATT&CK Tactics" by normalized_risk_object | `security_content_ctime(firstTime)` | `security_content_ctime(lastTime)`'
      earliest_offset: 7d
      latest_offset: "0"
finding:
    title: The user $user$ reported an email classified from $src_user$
    entity:
        field: src_user
        type: user
        score: 50
threat_objects:
    - field: subject
      type: email_subject
analytic_story:
    - Spearphishing Attachments
    - Suspicious Emails
asset_type: O365 Tenant
mitre_attack_id:
    - T1566.001
    - T1566.002
product:
    - Splunk Enterprise
    - Splunk Enterprise Security
    - Splunk Cloud
category: cloud
security_domain: threat
tests:
    - name: True Positive Test
      attack_data:
        - data: https://media.githubusercontent.com/media/splunk/attack_data/master/datasets/attack_techniques/T1566/o365_various_alerts/o365_various_alerts.log
          sourcetype: o365:management:activity
          source: o365
      test_type: unit

Stages and Predicates

Stage 1: search

`o365_management_activity` Workload=SecurityComplianceCenter Operation=AlertEntityGenerated Name="Email reported by user as*"

Stage 2: search

| fromjson Data

Stage 3: rename

| rename _raw AS temp etps AS _raw

Stage 4: extract

| extract pairdelim=";" kvdelim=":"

Stage 5: rename

| rename _raw AS etps temp AS _raw

Stage 6: search

| search RescanVerdict IN (Phish,Malware)

Stage 7: rex

| rex field=tsd "\<(?<src_user>.+)\>"

Stage 8: eval

| eval src_user = case(isnull(src_user),tsd,true(),src_user)
src_user =
ifisnull(src_user)tsd
elsesrc_user

Stage 9: rename

| rename Name as signature, AlertId as signature_id, AlertEntityId as user, tsd as sender, ms as subject

Stage 10: fillnull

| fillnull

Stage 11: stats

| stats count min(_time) as firstTime max(_time) as lastTime
    BY dest user src
       vendor_account vendor_product signature
       signature_id src_user sender
       subject

Stage 12: search

| `security_content_ctime(firstTime)`

Stage 13: search

| `security_content_ctime(lastTime)`

Stage 14: search

| `o365_email_reported_by_user_found_malicious_filter`

Indicators

Each row is a field, operator, and value that the rule matches. The corpus column counts how many other rules in the catalog look for the same combination: high numbers point to widely-used, community-vetted indicators. Blank or 1 shows that the indicator is specific to this rule.

FieldKindValues
Nameeq
  • "Email reported by user as*"
Operationeq
  • AlertEntityGenerated
RescanVerdictin
  • Malware
  • Phish
Workloadeq
  • SecurityComplianceCenter
sourcetypeeq
  • o365:management:activity

Search terms

Bare-string tokens in the SPL search body. Splunk matches each token against _raw (the untyped raw event text) anywhere it appears, not against a specific field. These don't surface in the Indicators table because they aren't predicates on a known field.

StageTerm
2fromjson
2Data