Detection rules › Sublime MQL

Non-RFC compliant calendar files from unsolicited sender

Severity
medium
Type
rule
Source
github.com/sublime-security/sublime-rules

Detects calendar (.ics) files that do not follow RFC standards by lacking required UID identifiers while containing specific calendar components (VTODO, VJOURNAL, VFREEBUSY, or VEVENT). Forged ICS calendar invites can be spoofed to seemingly originate from any sender.

Threat classification

Sublime's own taxonomy (not MITRE ATT&CK).

CategoryValues
Tactics and techniquesEvasion, ICS Phishing, Social engineering

Event coverage

Rule body MQL

type.inbound
and any(attachments,
        (
          .file_extension in $file_extensions_common_archives
          or .file_extension == "ics"
          or .content_type == "text/calendar"
        )
        and any(file.explode(.),
                (.file_extension == "ics" or .flavors.mime == "text/calendar")
                and any(.scan.ics.calendars,
                        any(.components,
                            .uid is null
                            and .type in (
                              'VEVENT',
                              'VJOURNAL',
                              'VFREEBUSY',
                              'VTODO'
                            )
                        )
                )
        )
)
and not profile.by_sender_email().any_messages_benign

Detection logic

Scope: inbound message.

Detects calendar (.ics) files that do not follow RFC standards by lacking required UID identifiers while containing specific calendar components (VTODO, VJOURNAL, VFREEBUSY, or VEVENT). Forged ICS calendar invites can be spoofed to seemingly originate from any sender.

  1. inbound message
  2. any of attachments where all hold:
    • any of:
      • .file_extension in $file_extensions_common_archives
      • .file_extension is 'ics'
      • .content_type is 'text/calendar'
    • any of file.explode(.) where all hold:
      • any of:
        • .file_extension is 'ics'
        • .flavors.mime is 'text/calendar'
      • any of .scan.ics.calendars where:
        • any of .components where all hold:
          • .uid is missing
          • .type in ('VEVENT', 'VJOURNAL', 'VFREEBUSY', 'VTODO')
  3. not:
    • profile.by_sender_email().any_messages_benign

Inspects: attachments[].content_type, attachments[].file_extension, type.inbound. Sensors: file.explode, profile.by_sender_email. Reference lists: $file_extensions_common_archives.

Indicators matched (8)

FieldMatchValue
attachments[].file_extensionequalsics
attachments[].content_typeequalstext/calendar
file.explode(attachments[])[].file_extensionequalsics
file.explode(attachments[])[].flavors.mimeequalstext/calendar
file.explode(attachments[])[].scan.ics.calendars[].components[].typememberVEVENT
file.explode(attachments[])[].scan.ics.calendars[].components[].typememberVJOURNAL
file.explode(attachments[])[].scan.ics.calendars[].components[].typememberVFREEBUSY
file.explode(attachments[])[].scan.ics.calendars[].components[].typememberVTODO