Detection rules › Sublime MQL

Sublime MQL rules: monday

Service abuse: Monday.com infrastructure with phishing intent

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

Detects unauthorized use of Monday.com tracking links in messages, attachments, or QR codes from unusual senders who lack proper authentication. Excludes legitimate replies and messages from trusted domains with valid DMARC.

Threat classification

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

CategoryValues
Attack typesCredential Phishing
Tactics and techniquesEvasion, Social engineering, QR code

Telemetry coverage

PlatformRecord / event type
SublimeInbound email message

Message attributes

  • attachments
  • body
  • body.current_thread
  • body.links
  • headers
  • headers.auth_summary
  • headers.domains
  • headers.hops
  • sender.email
  • subject
  • type

Rule body

type.inbound
and (
  (
    length(body.links) < 15
    and any(body.links,
            'monday_tracker' in .href_url.rewrite.encoders
            and .href_url.scheme != "mailto"
    )
  )
  or (
    length(attachments) <= 3
    and (
      any(attachments,
          (.file_type in $file_types_images or .file_type == "pdf")
          //
          // This rule makes use of a beta feature and is subject to change without notice
          // using the beta feature in custom rules is not suggested until it has been formally released
          //
          and any(beta.scan_qr(.).items,
                  .type is not null
                  and 'monday_tracker' in .url.rewrite.encoders
                  and .url.scheme != "mailto"
          )
          //
          // This rule makes use of a beta feature and is subject to change without notice
          // using the beta feature in custom rules is not suggested until it has been formally released
          //
          // exclude images taken with mobile cameras and screenshots from android
          and not any(beta.parse_exif(.).fields,
                      .key == "Model"
                      or (
                        .key == "Software"
                        and strings.starts_with(.value, "Android")
                      )
          )
          // exclude images taken with mobile cameras and screenshots from Apple
          and not any(beta.parse_exif(.).fields,
                      .key == "DeviceManufacturer"
                      and .value == "Apple Computer Inc."
          )
      )
    )
  )
  or (
    length(attachments) == 0
    and (
      //
      // This rule makes use of a beta feature and is subject to change without notice
      // using the beta feature in custom rules is not suggested until it has been formally released
      //
      beta.parse_exif(file.message_screenshot()).image_height < 2000
      and beta.parse_exif(file.message_screenshot()).image_width < 2000
      and beta.scan_qr(file.message_screenshot()).found
      and any(beta.scan_qr(file.message_screenshot()).items,
              .type is not null
              and 'monday_tracker' in .url.rewrite.encoders
              and .url.scheme != "mailto"
      )
    )
  )
  or (
    length(attachments) <= 3
    and (
      any(attachments,
          (
            .file_type in ("pdf")
            or .file_extension in ("pdf", "eml")
            or .file_extension in $file_extensions_macros
            or .content_type in ("message/rfc822")
          )
          and any(file.explode(.),
                  any(.scan.url.urls, 'monday_tracker' in .rewrite.encoders)
          )
      )
    )
  )
)
// negate messages that traverse monday.com infra
and not (
  any(headers.domains, strings.ends_with(.domain, "mail.monday.com"))
  or (
    strings.iends_with(headers.message_id, '@monday-mail.com>')
    and any(headers.hops,
            any(.fields,
                .name =~ "Content-Type"
                and strings.iends_with(.value, 'mondaymailcom_"')
            )
    )
    and any(headers.hops, any(.fields, .name =~ "x-monday-crm"))
  )
)
and not (
  headers.auth_summary.dmarc.details.from.root_domain == "monday.com"
  and headers.auth_summary.spf.pass
  and headers.auth_summary.dmarc.pass
)
and any(ml.nlu_classifier(body.current_thread.text).intents,
        .name != "benign" and .confidence in ("medium", "high")
)
// negating legit replies
and not (
  (subject.is_reply or subject.is_forward)
  and (length(headers.references) > 0 and headers.in_reply_to is not null)
)
// negate graymail and newsletters
and not (
  any(ml.nlu_classifier(body.current_thread.text).topics,
      .name in~ (
        "Advertising and Promotions",
        "B2B Cold Outreach",
        "Newsletters and Digests",
        "Events and Webinars"
      )
      and .confidence != "low"
  )
)
and (
  // negate highly trusted sender domains unless they fail DMARC authentication
  not (
    sender.email.domain.root_domain in $high_trust_sender_root_domains
    and coalesce(headers.auth_summary.dmarc.pass, false)
  )
  // salesforce has been abused to send phishing campaigns leveraging monday.com infrastructure abuse
  or sender.email.domain.root_domain in ("salesforce.com")
)

Detection logic

Scope: inbound message.

Detects unauthorized use of Monday.com tracking links in messages, attachments, or QR codes from unusual senders who lack proper authentication. Excludes legitimate replies and messages from trusted domains with valid DMARC.

  1. inbound message
  2. any of:
    • all of:
      • length(body.links) < 15
      • any of body.links where all hold:
        • .href_url.rewrite.encoders contains 'monday_tracker'
        • .href_url.scheme is not 'mailto'
    • all of:
      • length(attachments) ≤ 3
      • any of attachments where all hold:
        • any of:
          • .file_type in $file_types_images
          • .file_type is 'pdf'
        • any of beta.scan_qr(.).items where all hold:
          • .type is set
          • .url.rewrite.encoders contains 'monday_tracker'
          • .url.scheme is not 'mailto'
        • not:
          • any of beta.parse_exif(.).fields where any holds:
            • .key is 'Model'
            • all of:
              • .key is 'Software'
              • .value starts with 'Android'
        • not:
          • any of beta.parse_exif(.).fields where all hold:
            • .key is 'DeviceManufacturer'
            • .value is 'Apple Computer Inc.'
    • all of:
      • length(attachments) is 0
      • all of:
        • beta.parse_exif(file.message_screenshot()).image_height < 2000
        • beta.parse_exif(file.message_screenshot()).image_width < 2000
        • beta.scan_qr(file.message_screenshot()).found
        • any of beta.scan_qr(file.message_screenshot()).items where all hold:
          • .type is set
          • .url.rewrite.encoders contains 'monday_tracker'
          • .url.scheme is not 'mailto'
    • all of:
      • length(attachments) ≤ 3
      • any of attachments where all hold:
        • any of:
          • .file_type in ('pdf')
          • .file_extension in ('pdf', 'eml')
          • .file_extension in $file_extensions_macros
          • .content_type in ('message/rfc822')
        • any of file.explode(.) where:
          • any of .scan.url.urls where:
            • .rewrite.encoders contains 'monday_tracker'
  3. none of:
    • any of headers.domains where:
      • .domain ends with 'mail.monday.com'
    • all of:
      • headers.message_id ends with '@monday-mail.com>'
      • any of headers.hops where:
        • any of .fields where all hold:
          • .name is 'Content-Type'
          • .value ends with 'mondaymailcom_"'
      • any of headers.hops where:
        • any of .fields where:
          • .name is 'x-monday-crm'
  4. not:
    • all of:
      • headers.auth_summary.dmarc.details.from.root_domain is 'monday.com'
      • headers.auth_summary.spf.pass
      • headers.auth_summary.dmarc.pass
  5. any of ml.nlu_classifier(body.current_thread.text).intents where all hold:
    • .name is not 'benign'
    • .confidence in ('medium', 'high')
  6. not:
    • all of:
      • any of:
        • subject.is_reply
        • subject.is_forward
      • all of:
        • length(headers.references) > 0
        • headers.in_reply_to is set
  7. not:
    • any of ml.nlu_classifier(body.current_thread.text).topics where all hold:
      • .name in ('Advertising and Promotions', 'B2B Cold Outreach', 'Newsletters and Digests', 'Events and Webinars')
      • .confidence is not 'low'
  8. any of:
    • not:
      • all of:
        • sender.email.domain.root_domain in $high_trust_sender_root_domains
        • coalesce(headers.auth_summary.dmarc.pass)
    • sender.email.domain.root_domain in ('salesforce.com')

Inspects: attachments[].content_type, attachments[].file_extension, attachments[].file_type, body.current_thread.text, body.links, body.links[].href_url.rewrite.encoders, body.links[].href_url.scheme, headers.auth_summary.dmarc.details.from.root_domain, headers.auth_summary.dmarc.pass, headers.auth_summary.spf.pass, headers.domains, headers.domains[].domain, headers.hops, headers.hops[].fields, headers.hops[].fields[].name, headers.hops[].fields[].value, headers.in_reply_to, headers.message_id, headers.references, sender.email.domain.root_domain, subject.is_forward, subject.is_reply, type.inbound. Sensors: beta.parse_exif, beta.scan_qr, file.explode, file.message_screenshot, ml.nlu_classifier, strings.ends_with, strings.iends_with, strings.starts_with. Reference lists: $file_extensions_macros, $file_types_images, $high_trust_sender_root_domains.

Indicators matched (12)

FieldMatchValue
body.links[].href_url.rewrite.encoderscontainsmonday_tracker
attachments[].file_typeequalspdf
beta.scan_qr(attachments[]).items[].url.rewrite.encoderscontainsmonday_tracker
beta.scan_qr(file.message_screenshot()).items[].url.rewrite.encoderscontainsmonday_tracker
attachments[].file_typememberpdf
attachments[].file_extensionmemberpdf
attachments[].file_extensionmembereml
attachments[].content_typemembermessage/rfc822
file.explode(attachments[])[].scan.url.urls[].rewrite.encoderscontainsmonday_tracker
ml.nlu_classifier(body.current_thread.text).intents[].confidencemembermedium
ml.nlu_classifier(body.current_thread.text).intents[].confidencememberhigh
sender.email.domain.root_domainmembersalesforce.com

Stages and Predicates

Stage 1: mql_rule

and
  or
    and
      any(attachments)
        and
          not
            any(beta.parse_exif(attachments).fields)
              or
                and
                  beta.parse_exif(attachments[]).fields[].key eq "Software"
                  beta.parse_exif(attachments[]).fields[].value starts_with "Android"
                beta.parse_exif(attachments[]).fields[].key eq "Model"
          not
            any(beta.parse_exif(attachments).fields)
              and
                beta.parse_exif(attachments[]).fields[].key eq "DeviceManufacturer"
                beta.parse_exif(attachments[]).fields[].value eq "Apple Computer Inc."
          any(beta.scan_qr(attachments).items)
            and
              beta.scan_qr(attachments[]).items[].type is_not_null
              beta.scan_qr(attachments[]).items[].url.rewrite.encoders contains "monday_tracker"
              beta.scan_qr(attachments[]).items[].url.scheme ne "mailto"
          or
            attachments.file_type eq "pdf"
             macro "attachments[].file_type in file_types_images"
      attachments length_compare "3"
    and
      any(attachments)
        and
          any(file.explode(attachments))
            any(file.explode(attachments).scan.url.urls)
              file.explode(attachments).scan.url.urls.rewrite.encoders contains "monday_tracker"
          or
            attachments.content_type eq "message/rfc822"
            attachments.file_extension in ["eml", "pdf"]
            attachments.file_type eq "pdf"
             macro "attachments[].file_extension in file_extensions_macros"
      attachments length_compare "3"
    and
      any(beta.scan_qr(file.message_screenshot()).items)
        and
          beta.scan_qr(file.message_screenshot()).items.type is_not_null
          beta.scan_qr(file.message_screenshot()).items.url.rewrite.encoders contains "monday_tracker"
          beta.scan_qr(file.message_screenshot()).items.url.scheme ne "mailto"
      attachments length_compare "0"
      beta.parse_exif func_call "beta.parse_exif(file.message_screenshot()).image_height < 2000"
      beta.parse_exif func_call "beta.parse_exif(file.message_screenshot()).image_width < 2000"
      beta.scan_qr func_call "beta.scan_qr(file.message_screenshot()).found"
    and
      any(body.links)
        and
          body.links.href_url.rewrite.encoders contains "monday_tracker"
          body.links.href_url.scheme ne "mailto"
      body.links length_compare "15"
  not
    or
      and
        any(headers.hops)
          any(headers.hops.fields)
            and
              headers.hops.fields[].name eq "Content-Type"
              headers.hops.fields[].value ends_with "mondaymailcom_\""
        any(headers.hops)
          any(headers.hops.fields)
            headers.hops.fields.name eq "x-monday-crm"
        headers.message_id ends_with "@monday-mail.com>"
      any(headers.domains)
        headers.domains.domain ends_with "mail.monday.com"
  or
    not
      and
        coalesce func_call "coalesce(headers.auth_summary.dmarc.pass)"
         macro "sender.email.domain.root_domain in high_trust_sender_root_domains"
    sender.email.domain.root_domain eq "salesforce.com"
  not
    any(ml.nlu_classifier(body.current_thread.text).topics)
      and
        ml.nlu_classifier(body.current_thread.text).topics.confidence ne "low"
        ml.nlu_classifier(body.current_thread.text).topics.name in ["Advertising and Promotions", "B2B Cold Outreach", "Events and Webinars", "Newsletters and Digests"]
  not
    and
      or
        subject.is_forward eq "true"
        subject.is_reply eq "true"
      headers.in_reply_to is_not_null
      headers.references length_compare "0"
  not
    and
      headers.auth_summary.dmarc.details.from.root_domain eq "monday.com"
      headers.auth_summary.dmarc.pass eq "true"
      headers.auth_summary.spf.pass eq "true"
  any(ml.nlu_classifier(body.current_thread.text).intents)
    and
      ml.nlu_classifier(body.current_thread.text).intents.confidence in ["high", "medium"]
      ml.nlu_classifier(body.current_thread.text).intents.name ne "benign"
  type.inbound eq "true"

Exclusions

The rule actively suppresses these predicates.

FieldKindExcluded valuesSearch
headers.hopsarray_any(no value, null check)excludes:headers.hops
headers.message_idends_with@monday-mail.com>excludes:headers.message_id field:"headers.message_id" value:"@monday-mail.com>"
headers.domainsarray_any(no value, null check)excludes:headers.domains
ml.nlu_classifier(body.current_thread.text).topicsarray_any(no value, null check)excludes:ml.nlu_classifier(body.current_thread.text).topics
subject.is_forwardeqtrueexcludes:subject.is_forward field:"subject.is_forward" value:"true"
subject.is_replyeqtrueexcludes:subject.is_reply field:"subject.is_reply" value:"true"
headers.in_reply_tois_not_null(no value, null check)excludes:headers.in_reply_to
headers.referenceslength_compare0excludes:headers.references field:"headers.references" value:"0"
headers.auth_summary.dmarc.details.from.root_domaineqmonday.comexcludes:headers.auth_summary.dmarc.details.from.root_domain field:"headers.auth_summary.dmarc.details.from.root_domain" value:"monday.com"
headers.auth_summary.dmarc.passeqtrueexcludes:headers.auth_summary.dmarc.pass field:"headers.auth_summary.dmarc.pass" value:"true"
headers.auth_summary.spf.passeqtrueexcludes:headers.auth_summary.spf.pass field:"headers.auth_summary.spf.pass" value:"true"

Indicators

These rows show field, operator, and value matches.