Detection rules › Sublime MQL

Brand impersonation: DocuSign

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

Attack impersonating a DocuSign request for signature.

Threat classification

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

CategoryValues
Attack typesCredential Phishing
Tactics and techniquesImpersonation: Brand, Lookalike domain, Social engineering, Spoofing

Event coverage

Rule body MQL

type.inbound
and (
  // orgs can have docusign.company.com
  strings.ilike(sender.email.email, '*docusign.net*', '*docusign.com*')

  // if the above is true, you'll see a "via Docusign"
  or strings.ilike(sender.display_name, '*docusign*')

  // detects 1 character variations,
  // such as DocuSlgn (with an "L" instead of an "I")
  or strings.ilevenshtein(sender.display_name, "docusign") == 1
  or strings.ilike(sender.display_name, "*docuonline*", "*via *signature*")
  or (
    strings.istarts_with(body.html.inner_text, "docusign")
    and not strings.istarts_with(body.current_thread.text, "docusign")
  )
  // docusign is found in current thread AND contains docusign wording within current_thread or subject
  or (
    regex.icontains(body.current_thread.text, '\bdocu.?sign\b')
    and (
      // additional context from body.current_thread.text
      strings.istarts_with(body.current_thread.text, "DOCUSIGN\n", )
      or regex.icontains(body.current_thread.text,
                         "You(?:'ve| have) received a ([^\\s]+\\s)?document"
      )
      or strings.icontains(body.current_thread.text,
                           'a document to review and sign',
      )
      or strings.icontains(body.current_thread.text,
                           'A document is available for you',
      )
      or strings.icontains(body.current_thread.text,
                           'a document ready for you',
      )
      or strings.icontains(body.current_thread.text,
                           'This email contains a secure link to DocuSign'
      )
      or strings.icontains(body.current_thread.text,
                           'All parties have completed with Docusign'
      )
      or strings.icontains(body.current_thread.text,
                           'the signing of this document has been completed'
      )
      or strings.icontains(body.current_thread.text,
                           'Please use the link above to Docusign'
      )
      or strings.icontains(body.current_thread.text, 'Review on Docusign')
      or strings.icontains(body.current_thread.text, 'Completed with Docusign')
      or strings.icontains(body.current_thread.text, 'Completed on Docusign')
      or strings.icontains(body.current_thread.text, 'Complete with Docusign')
      or strings.icontains(body.current_thread.text,
                           'please review and complete with DocuSign'
      )
      or strings.icontains(body.current_thread.text,
                           'We appreciate you choosing DocuSign'
      )
      or strings.icontains(body.current_thread.text,
                           'A document has been sent to you for'
      )
      or strings.icontains(body.current_thread.text, 'Please Sign docusign')
      or strings.icontains(body.current_thread.text,
                           'This email was sent via DocuSign'
      )
      or strings.icontains(body.current_thread.text,
                           'This email was sent to you via DocuSign'
      )
      or strings.icontains(body.current_thread.text,
                           'This message was sent via DocuSign'
      )
      or strings.icontains(body.current_thread.text,
                           'This message was sent to you via DocuSign'
      )
      or strings.icontains(body.current_thread.text,
                           'review via DocuSign Electronic Signature'
      )
      or strings.icontains(body.current_thread.text, 'sent to you by DocuSign')
      or strings.icontains(body.current_thread.text, 'Processed by DocuSign')
      or strings.icontains(body.current_thread.text,
                           'Please read and sign the document'
      )
      or strings.icontains(body.current_thread.text,
                           'Please kindly review and sign the '
      )
      or strings.icontains(body.current_thread.text,
                           'Your document is pending review and signature'
      )
      or strings.icontains(body.current_thread.text,
                           'pending document for your signature'
      )
      or strings.icontains(body.current_thread.text,
                           'your review and signature'
      )
      or strings.icontains(body.current_thread.text, 'a pending document for')
      or strings.icontains(body.current_thread.text, 'Your document is ready')
      or strings.icontains(body.current_thread.text,
                           'This email is automatically generated by DocuSign'
      )
      or strings.icontains(body.current_thread.text,
                           'Your document has been completed'
      )
      // docusign is "near" review and sign or sign and return
      or regex.icontains(body.current_thread.text,
                         'Review\s*(?:and\s*|&\s*)Sign.{0,40}docusign',
                         'docusign.{0,40}Review\s*(?:and\s*|&\s*)Sign',
                         'Sign\s*(?:and\s*|&\s*)Return.{0,40}docusign',
                         'Sign\s*(?:and\s*|&\s*)Return.docusign.{0,40}'
      )

      // additional context from subject.subject
      or strings.icontains(subject.subject, 'complete with docusign')
      or strings.icontains(subject.subject, 'signature request')
      or regex.icontains(subject.subject, 'Review\s*(?:and\s*|&\s*)Sign')
      or regex.icontains(subject.subject, 'Sign\s*(?:and\s*|&\s*)Return')
      or strings.icontains(subject.subject, 'Please Docusign')
      or strings.icontains(subject.subject, 'Docusign has sent')
    )
  )
  or (
    // negate replies/forwards which involve a legit docusign message-id format
    not any(headers.references,
            strings.iends_with(., 'docusign.net')
            and regex.imatch(., '[0-9a-f]{32}@(?:[^\.]+\.)?docusign.net')
    )
    and (
      (
        sender.display_name is not null
        and regex.icontains(sender.display_name, '\bdocu\b')
        and strings.icontains(sender.display_name, 'sign')
      )
      or (
        subject.subject is not null
        and regex.icontains(subject.subject, '\bdocu\b')
        and strings.icontains(subject.subject, 'sign')
      )
      or (
        (
          regex.icontains(body.html.raw,
                          'Powered by.{0,6}(?:\s*<\/?[^\>]+\>\s*)+<img[^\>]+(?:src="https:\/\/docucdn-a\.akamaihd\.net\/[^\"]+email-logo.png"|alt="DocuSign")'
          )
          or regex.icontains(body.current_thread.text, 'Powered by\s*DocuSign')
        )
        // limit it to where the powered by is within the current thread
        and strings.icontains(body.current_thread.text, 'Powered by')
      )
      // footer disclaimers
      or strings.icontains(body.current_thread.text,
                           'using the Docusign Electronic Signature Service'
      )
      or strings.icontains(body.current_thread.text,
                           'who uses the DocuSign Electronic Signature Service'
      )
      or strings.icontains(body.current_thread.text,
                           'Thank you for choosing DocuSign'
      )
      or (
        (
          strings.icontains(body.current_thread.text,
                            'Alternate Signing Method'
          )
          or strings.icontains(body.current_thread.text, 'Alternative Access')
        )
        and regex.icontains(body.current_thread.text,
                            '(?:Click|Select) ''Access Documents'', and enter '
        )
      )
      or (
        strings.icontains(body.current_thread.text,
                          'Please do not share this email, link, or access code with others'
        )
        and not sender.email.domain.root_domain in (
          "insuresign.com",
          "clixsign.com",
          "esignlive.com",
          "clickcontracts.com",
          "sadq.sa",
          "vasion.com",
          "chubb.com", // insurance company
        )
      )
      or (
        strings.icontains(body.current_thread.text, 'Docusign provides a ')
        and strings.icontains(body.current_thread.text,
                              'solution for Digital Transaction Management'
        )
      )
      or strings.icontains(body.current_thread.text,
                           'a secure link to DocuSign'
      )

      // footer links
      or (
        length(filter(body.links,
                      (
                        .href_url.domain.domain == "support.docusign.com"
                        and strings.contains(.href_url.path, '/articles/')
                      )
                      or .href_url.domain.domain == "community.docusign.com"
                      or .href_url.domain.domain == "protect.docusign.com"
                      or .href_url.domain.domain == "app.esign.docusign.com"
               )
        ) >= 2
        // and the display_text for these links are within the current thread
        and (
          strings.icontains(body.current_thread.text, 'Declining to sign')
          or strings.icontains(body.current_thread.text,
                               'Managing notifications'
          )
          or strings.icontains(body.current_thread.text,
                               'How to Sign a Document'
          )
          or strings.icontains(body.current_thread.text,
                               'Docusign Support Center'
          )
          or strings.icontains(body.current_thread.text, 'Report this email')
          or strings.icontains(body.current_thread.text, 'Docusign Community')
          or strings.icontains(body.current_thread.text,
                               'Connect with our support team'
          )
          or strings.icontains(body.current_thread.text, 'Unsubscribe')
          or strings.icontains(body.current_thread.text, 'Manage Preferences')
        )
      )
    )
  )
  or (
    (
      regex.icontains(body.html.raw,
                      '<font size="?[0-9]"?[^\>]*>DocuSign</font>'
      )
      or regex.icontains(body.html.raw, '\nDocu(?:<[^\>]+>\s*)+Sign<')
      or regex.icontains(body.html.raw,
                         '<span[^>]*style="[^"]*">Docu.?Sign<\/span>'
      )
      or any(html.xpath(body.html, '//h1').nodes,
             regex.icontains(.display_text, 'Docu.?Sign')
      )
      or regex.icontains(body.html.raw,
                         '<span[^>]*style="[^"]*">(Docu|D(?:ocu?)?)<\/span>(?:<[^\>]+\>){0,2}<span[^>]*style="[^"]*">(Sign|S(?:ign?)?)<\/span>'
      )
      // any bold text contains docusign
      or any(html.xpath(body.html, '//strong').nodes,
             regex.imatch(.display_text, 'Docu.?Sign')
      )
      // title starts with Docusign
      or any(html.xpath(body.html, '//title').nodes,
             regex.icontains(.display_text, '^docu.?sign')
      )
      // a div with a class of logo contains the display text of docusign
      or any(html.xpath(body.html, '//div[@class="logo"]').nodes,
             strings.icontains(.display_text, 'Docusign')
      )
      // image contains an alt text of docusign
      or any(html.xpath(body.html, '//img/@alt').nodes, .raw =~ "docusign")

      // Basic variations with HTML encoding
      // use of regex extract allows
      or any(regex.iextract(body.html.raw,
                            '(?:D|&#68;|&#x44;)(?:&#?[0-9a-fA-F]{2,6};|\s|o|о|&#1086;|&#x43e;)(?:&#?[0-9a-fA-F]{2,6};|\s|c|с|&#1089;|&#x441;)u(?:&#?[0-9a-fA-F]{2,6};|\s)?S(?:&#?[0-9a-fA-F]{2,6};|\s|i|і|&#1110;|&#x456;)(?:&#?[0-9a-fA-F]{2,6};|\s|g|ɡ|&#609;|&#x261;)(?:n|&#110;|&#x6e;)'
             ),
             .full_match !~ "docusign"
      )
      //  Common homograph patterns
      or any(regex.iextract(body.html.raw,
                            '(?:[DⅮᎠᗞᗡ𝐃𝐷𝑫𝒟𝓓𝔇𝔻𝕯𝖣])\s*(?:[oοоօ0Ооʘ◯])\s*(?:[cсçҫ¢ϲС])\s*u\s*(?:[sѕЅ5$])\s*(?:[iіІ1l!|])\s*(?:[gǵġģ9ɡ])\s*(?:[nոռℼη𝐧𝑛𝒏𝓃𝓷𝔫𝕟𝖓])'
             ),
             .full_match !~ "docusign"
      )

      // Look for HTML entities for each letter in sequence
      or any(regex.iextract(body.html.raw,
                            '(?:D|&#68;|&#x44;)(?:o|о|&#111;|&#x6f;|&#1086;|&#x43e;|&#959;|&#x3bf;)(?:c|с|&#99;|&#x63;|&#1089;|&#x441;|&#1010;|&#231;|&#x67;|&#265;|&#x109;)(?:u|&#117;|&#x75;|&#1091;|&#x443;|&#965;|&#x3c5;)(?:s|&#115;|&#x73;|&#1109;|&#x455;)(?:i|і|&#105;|&#x69;|&#1110;|&#x456;|&#305;|&#x131;)(?:g|&#103;|&#x67;|&#609;|&#x261;|&#287;|&#x11f;)(?:n|&#110;|&#x6e;|&#1085;|&#x43d;|&#951;|&#x3b7;)'
             ),
             .full_match !~ "docusign"
      )

      // Handle repeated HTML entities and variation selectors (using Unicode class)
      or any(regex.iextract(body.html.raw,
                            'D(?:&#[0-9]{1,7};)*\p{Mn}*o(?:&#[0-9]{1,7};)*\p{Mn}*c(?:&#[0-9]{1,7};)*\p{Mn}*u(?:&#[0-9]{1,7};)*\p{Mn}*[Ss](?:&#[0-9]{1,7};)*\p{Mn}*i(?:&#[0-9]{1,7};)*\p{Mn}*g(?:&#[0-9]{1,7};)*\p{Mn}*n'
             ),
             .full_match !~ "docusign"
      )
    )
    and (
      regex.icontains(body.html.raw,
                      'b(?:ackground(?:-color)?|g?color):\s*rgb\(30,\s*76,\s*161\)',
                      'b(?:ackground(?:-color)?|g?color):\s*rgb\(61,\s*170,\s*73\)'
      )
      or regex.icontains(body.html.raw,
                         '<(?:div|td|table)[^>]*b(?:ackground(?:-color)?|g?color)(?::|=)\s*\"?#1e4ca1[^>]*>',
      )
      or regex.icontains(body.html.raw,
                         'b(?:ackground(?:-color)?|g?color)(?::|=)\s*\"?#(?:214e9f|3260a7|0056b3|1e4ca1|214395|325bb8|3c60ad)'
      )
    )
  )
  or (
    strings.icontains(body.current_thread.text, 'Docusign')
    and (
      regex.icontains(body.html.raw, '<title>[^<]*Easearch[^<]*</title>')
      or regex.icontains(body.html.raw, '<spacing>[^<]*(?:Docusign|Document)')
      or regex.icontains(body.html.raw, '{(?:domain|randomNumber\d?)}')
    )
  )
)

// identifies the main CTA in the email, eg "Review now" or "Review document"
// this should always be a known docusign domain,
// even with branded docusign subdomains
and (
  any(
      // filter links that match docusign wording
      filter(body.links,
             // we've observed invisible characters in the display name
             // such as U+034F: "Revi\x{034F}ew Now"
             (
               strings.ilevenshtein(.display_text, "Review Now") <= 3
               or strings.ilevenshtein(.display_text, "Review and Sign") <= 3
               or (
                 strings.icontains(.display_text, "Review")
                 // negate benign uses of the "review" term
                 and not (
                   strings.icontains(.display_text, "Review Us")
                   or strings.icontains(.display_text, "leave us a review")
                   or regex.icontains(.display_text, '\bReviews\b')
                   // don't match microsoft quarantine messages
                   or (
                     strings.icontains(.display_text, "Review Message")
                     and (
                       .href_url.domain.domain == "security.microsoft.com"
                       and .href_url.path == "/quarantine"
                     )
                   )
                 )
               )
               or strings.icontains(.display_text, "document")
               or strings.icontains(.display_text, "docusign")
               or strings.icontains(.display_text, "Review on Docusign")
               or strings.icontains(.display_text, "view form")
               or (
                 strings.icontains(.display_text, "Sign")
                 and regex.icontains(.display_text, '(?:in\b|now)')
               )
               or (
                 strings.icontains(.display_text, "Download")
                 and (
                   strings.icontains(.display_text, "File")
                   or strings.icontains(.display_text, "Document")
                 )
               )
               or strings.icontains(.display_text, "complete tasks")
               or strings.icontains(.display_text, "View and complete")
             )
      ),
      // ensure those links aren't legit
      not .href_url.domain.root_domain in (
        "docusign.com",
        "docusign.net",
        'docusign.co.uk',
        'docusign.com.br',
        'docusign.fr',
        // other e-signature companies which use simliar wording
        "insuresign.com",
        "clixsign.com",
        "esignlive.com",
        "clickcontracts.com",
        "adobesign.com",
        "hellosign.com",
      )
      and not (
        .href_url.domain.root_domain == "mimecastprotect.com"
        and (
          .href_url.query_params is not null
          and regex.icontains(.href_url.query_params,
                              'domain=(?:\w+\.)?docusign.(?:net|com|co\.uk|com\.br|fr)',
                              // other e-signature companies
                              'domain=(?:\w+\.)?(?:insuresign\.com|clixsign\.com|esignlive\.com|clickcontracts\.com|adobesign\.com|hellosign\.com)'
          )
        )
      )
  )
  // Suspicious attachment
  or any(attachments,
         (
           .file_extension in~ ("html", "htm", "shtml", "dhtml")
           or .file_extension in~ $file_extensions_common_archives
           or .file_type == "html"
           or .content_type == "text/html"
         )
         and 1 of (
           (
             regex.icontains(file.parse_html(.).raw, '\s{0,}<script.*')
             and regex.icontains(file.parse_html(.).raw, "</script>")
           ),
           strings.ilike(file.parse_html(.).raw,
                         "*createElement*",
                         "*appendChild*",
                         "*createObjectURL*"
           ),
           strings.icount(file.parse_html(.).raw, "/*") > 10,
           any($free_subdomain_hosts, strings.icontains(..file_name, .))
         )
  )
)

// negate highly trusted sender domains if they pass DMARC authentication
and not (
  sender.email.domain.root_domain in $high_trust_sender_root_domains
  and coalesce(headers.auth_summary.dmarc.pass, false)
)

// negation for messages traversing docusign.net
// happens with custom sender domains
and not (
  any(headers.domains, .root_domain == "docusign.net")
  and headers.auth_summary.spf.pass
  and headers.auth_summary.dmarc.pass
)

// adding negation for messages originating from docusigns api
// and the sender.display.name contains "via"
and not (
  any(headers.hops,
      any(.fields,
          .name == "X-Api-Host" and strings.ends_with(.value, "docusign.net")
      )
  )
  and strings.contains(sender.display_name, "via")
)

Detection logic

Scope: inbound message.

Attack impersonating a DocuSign request for signature.

  1. inbound message
  2. any of:
    • sender.email.email matches any of 2 patterns
      • *docusign.net*
      • *docusign.com*
    • sender.display_name matches '*docusign*'
    • sender.display_name is similar to 'docusign'
    • sender.display_name matches any of 2 patterns
      • *docuonline*
      • *via *signature*
    • all of:
      • body.html.inner_text starts with 'docusign'
      • not:
        • body.current_thread.text starts with 'docusign'
    • all of:
      • body.current_thread.text matches '\\bdocu.?sign\\b'
      • any of:
        • body.current_thread.text starts with 'DOCUSIGN\\n'
        • body.current_thread.text matches "You(?:'ve| have) received a ([^\\\\s]+\\\\s)?document"
        • body.current_thread.text contains 'a document to review and sign'
        • body.current_thread.text contains 'A document is available for you'
        • body.current_thread.text contains 'a document ready for you'
        • body.current_thread.text contains 'This email contains a secure link to DocuSign'
        • body.current_thread.text contains 'All parties have completed with Docusign'
        • body.current_thread.text contains 'the signing of this document has been completed'
        • body.current_thread.text contains 'Please use the link above to Docusign'
        • body.current_thread.text contains 'Review on Docusign'
        • body.current_thread.text contains 'Completed with Docusign'
        • body.current_thread.text contains 'Completed on Docusign'
        • body.current_thread.text contains 'Complete with Docusign'
        • body.current_thread.text contains 'please review and complete with DocuSign'
        • body.current_thread.text contains 'We appreciate you choosing DocuSign'
        • body.current_thread.text contains 'A document has been sent to you for'
        • body.current_thread.text contains 'Please Sign docusign'
        • body.current_thread.text contains 'This email was sent via DocuSign'
        • body.current_thread.text contains 'This email was sent to you via DocuSign'
        • body.current_thread.text contains 'This message was sent via DocuSign'
        • body.current_thread.text contains 'This message was sent to you via DocuSign'
        • body.current_thread.text contains 'review via DocuSign Electronic Signature'
        • body.current_thread.text contains 'sent to you by DocuSign'
        • body.current_thread.text contains 'Processed by DocuSign'
        • body.current_thread.text contains 'Please read and sign the document'
        • body.current_thread.text contains 'Please kindly review and sign the '
        • body.current_thread.text contains 'Your document is pending review and signature'
        • body.current_thread.text contains 'pending document for your signature'
        • body.current_thread.text contains 'your review and signature'
        • body.current_thread.text contains 'a pending document for'
        • body.current_thread.text contains 'Your document is ready'
        • body.current_thread.text contains 'This email is automatically generated by DocuSign'
        • body.current_thread.text contains 'Your document has been completed'
        • body.current_thread.text matches any of 4 patterns
          • Review\s*(?:and\s*|&\s*)Sign.{0,40}docusign
          • docusign.{0,40}Review\s*(?:and\s*|&\s*)Sign
          • Sign\s*(?:and\s*|&\s*)Return.{0,40}docusign
          • Sign\s*(?:and\s*|&\s*)Return.docusign.{0,40}
        • subject.subject contains 'complete with docusign'
        • subject.subject contains 'signature request'
        • subject.subject matches 'Review\\s*(?:and\\s*|&\\s*)Sign'
        • subject.subject matches 'Sign\\s*(?:and\\s*|&\\s*)Return'
        • subject.subject contains 'Please Docusign'
        • subject.subject contains 'Docusign has sent'
    • all of:
      • not:
        • any of headers.references where all hold:
          • . ends with 'docusign.net'
          • . matches '[0-9a-f]{32}@(?:[^\\.]+\\.)?docusign.net'
      • any of:
        • all of:
          • sender.display_name is set
          • sender.display_name matches '\\bdocu\\b'
          • sender.display_name contains 'sign'
        • all of:
          • subject.subject is set
          • subject.subject matches '\\bdocu\\b'
          • subject.subject contains 'sign'
        • all of:
          • any of:
            • body.html.raw matches 'Powered by.{0,6}(?:\\s*<\\/?[^\\>]+\\>\\s*)+<img[^\\>]+(?:src="https:\\/\\/docucdn-a\\.akamaihd\\.net\\/[^\\"]+email-logo.png"|alt="DocuSign")'
            • body.current_thread.text matches 'Powered by\\s*DocuSign'
          • body.current_thread.text contains 'Powered by'
        • body.current_thread.text contains 'using the Docusign Electronic Signature Service'
        • body.current_thread.text contains 'who uses the DocuSign Electronic Signature Service'
        • body.current_thread.text contains 'Thank you for choosing DocuSign'
        • all of:
          • any of:
            • body.current_thread.text contains 'Alternate Signing Method'
            • body.current_thread.text contains 'Alternative Access'
          • body.current_thread.text matches "(?:Click|Select) 'Access Documents', and enter "
        • all of:
          • body.current_thread.text contains 'Please do not share this email, link, or access code with others'
          • not:
            • sender.email.domain.root_domain in ('insuresign.com', 'clixsign.com', 'esignlive.com', 'clickcontracts.com', 'sadq.sa', 'vasion.com', 'chubb.com')
        • all of:
          • body.current_thread.text contains 'Docusign provides a '
          • body.current_thread.text contains 'solution for Digital Transaction Management'
        • body.current_thread.text contains 'a secure link to DocuSign'
        • all of:
          • length(filter(body.links, .href_url.domain.domain == 'support.docusign.com' and strings.contains(.href_url.path, '/articles/') or .href_url.domain.domain == 'community.docusign.com' or .href_url.domain.domain == 'protect.docusign.com' or .href_url.domain.domain == 'app.esign.docusign.com')) ≥ 2
          • body.current_thread.text contains any of 9 patterns
            • Declining to sign
            • Managing notifications
            • How to Sign a Document
            • Docusign Support Center
            • Report this email
            • Docusign Community
            • Connect with our support team
            • Unsubscribe
            • Manage Preferences
    • all of:
      • any of:
        • body.html.raw matches '<font size="?[0-9]"?[^\\>]*>DocuSign</font>'
        • body.html.raw matches '\\nDocu(?:<[^\\>]+>\\s*)+Sign<'
        • body.html.raw matches '<span[^>]*style="[^"]*">Docu.?Sign<\\/span>'
        • any of html.xpath(body.html, '//h1').nodes where:
          • .display_text matches 'Docu.?Sign'
        • body.html.raw matches '<span[^>]*style="[^"]*">(Docu|D(?:ocu?)?)<\\/span>(?:<[^\\>]+\\>){0,2}<span[^>]*style="[^"]*">(Sign|S(?:ign?)?)<\\/span>'
        • any of html.xpath(body.html, '//strong').nodes where:
          • .display_text matches 'Docu.?Sign'
        • any of html.xpath(body.html, '//title').nodes where:
          • .display_text matches '^docu.?sign'
        • any of html.xpath(body.html, '//div[@class="logo"]').nodes where:
          • .display_text contains 'Docusign'
        • any of html.xpath(body.html, '//img/@alt').nodes where:
          • .raw is 'docusign'
        • any of regex.iextract(body.html.raw) where:
          • .full_match is not 'docusign'
        • any of regex.iextract(body.html.raw) where:
          • .full_match is not 'docusign'
        • any of regex.iextract(body.html.raw) where:
          • .full_match is not 'docusign'
        • any of regex.iextract(body.html.raw) where:
          • .full_match is not 'docusign'
      • any of:
        • body.html.raw matches any of 2 patterns
          • b(?:ackground(?:-color)?|g?color):\s*rgb\(30,\s*76,\s*161\)
          • b(?:ackground(?:-color)?|g?color):\s*rgb\(61,\s*170,\s*73\)
        • body.html.raw matches '<(?:div|td|table)[^>]*b(?:ackground(?:-color)?|g?color)(?::|=)\\s*\\"?#1e4ca1[^>]*>'
        • body.html.raw matches 'b(?:ackground(?:-color)?|g?color)(?::|=)\\s*\\"?#(?:214e9f|3260a7|0056b3|1e4ca1|214395|325bb8|3c60ad)'
    • all of:
      • body.current_thread.text contains 'Docusign'
      • any of:
        • body.html.raw matches '<title>[^<]*Easearch[^<]*</title>'
        • body.html.raw matches '<spacing>[^<]*(?:Docusign|Document)'
        • body.html.raw matches '{(?:domain|randomNumber\\d?)}'
  3. any of:
    • any of filter(body.links) where all hold:
      • not:
        • .href_url.domain.root_domain in ('docusign.com', 'docusign.net', 'docusign.co.uk', 'docusign.com.br', 'docusign.fr', 'insuresign.com', 'clixsign.com', 'esignlive.com', 'clickcontracts.com', 'adobesign.com', 'hellosign.com')
      • not:
        • all of:
          • .href_url.domain.root_domain is 'mimecastprotect.com'
          • all of:
            • .href_url.query_params is set
            • .href_url.query_params matches any of 2 patterns
              • domain=(?:\w+\.)?docusign.(?:net|com|co\.uk|com\.br|fr)
              • domain=(?:\w+\.)?(?:insuresign\.com|clixsign\.com|esignlive\.com|clickcontracts\.com|adobesign\.com|hellosign\.com)
    • any of attachments where all hold:
      • any of:
        • .file_extension in ('html', 'htm', 'shtml', 'dhtml')
        • .file_extension in $file_extensions_common_archives
        • .file_type is 'html'
        • .content_type is 'text/html'
      • at least 1 of:
        • all of:
          • file.parse_html(.).raw matches '\\s{0,}<script.*'
          • file.parse_html(.).raw matches '</script>'
        • file.parse_html(.).raw matches any of 3 patterns
          • *createElement*
          • *appendChild*
          • *createObjectURL*
        • strings.icount(file.parse_html(.).raw, '/*') > 10
        • any of $free_subdomain_hosts where:
          • strings.icontains(.file_name)
  4. not:
    • all of:
      • sender.email.domain.root_domain in $high_trust_sender_root_domains
      • coalesce(headers.auth_summary.dmarc.pass)
  5. not:
    • all of:
      • any of headers.domains where:
        • .root_domain is 'docusign.net'
      • headers.auth_summary.spf.pass
      • headers.auth_summary.dmarc.pass
  6. not:
    • all of:
      • any of headers.hops where:
        • any of .fields where all hold:
          • .name is 'X-Api-Host'
          • .value ends with 'docusign.net'
      • sender.display_name contains 'via'

Inspects: attachments[].content_type, attachments[].file_extension, attachments[].file_name, attachments[].file_type, body.current_thread.text, body.html, body.html.inner_text, body.html.raw, body.links, body.links[].display_text, body.links[].href_url.domain.domain, body.links[].href_url.path, headers.auth_summary.dmarc.pass, headers.auth_summary.spf.pass, headers.domains, headers.domains[].root_domain, headers.hops, headers.hops[].fields, headers.hops[].fields[].name, headers.hops[].fields[].value, headers.references, sender.display_name, sender.email.domain.root_domain, sender.email.email, subject.subject, type.inbound. Sensors: file.parse_html, html.xpath, regex.icontains, regex.iextract, regex.imatch, strings.contains, strings.ends_with, strings.icontains, strings.icount, strings.iends_with, strings.ilevenshtein, strings.ilike, strings.istarts_with. Reference lists: $file_extensions_common_archives, $free_subdomain_hosts, $high_trust_sender_root_domains.

Indicators matched (157)

FieldMatchValue
strings.ilikesubstring*docusign.net*
strings.ilikesubstring*docusign.com*
strings.ilikesubstring*docusign*
strings.ilevenshteinfuzzydocusign
strings.ilikesubstring*docuonline*
strings.ilikesubstring*via *signature*
strings.istarts_withprefixdocusign
regex.icontainsregex\bdocu.?sign\b
strings.istarts_withprefixDOCUSIGN\n
regex.icontainsregexYou(?:'ve| have) received a ([^\\s]+\\s)?document
strings.icontainssubstringa document to review and sign
strings.icontainssubstringA document is available for you
145 more
strings.icontainssubstringa document ready for you
strings.icontainssubstringThis email contains a secure link to DocuSign
strings.icontainssubstringAll parties have completed with Docusign
strings.icontainssubstringthe signing of this document has been completed
strings.icontainssubstringPlease use the link above to Docusign
strings.icontainssubstringReview on Docusign
strings.icontainssubstringCompleted with Docusign
strings.icontainssubstringCompleted on Docusign
strings.icontainssubstringComplete with Docusign
strings.icontainssubstringplease review and complete with DocuSign
strings.icontainssubstringWe appreciate you choosing DocuSign
strings.icontainssubstringA document has been sent to you for
strings.icontainssubstringPlease Sign docusign
strings.icontainssubstringThis email was sent via DocuSign
strings.icontainssubstringThis email was sent to you via DocuSign
strings.icontainssubstringThis message was sent via DocuSign
strings.icontainssubstringThis message was sent to you via DocuSign
strings.icontainssubstringreview via DocuSign Electronic Signature
strings.icontainssubstringsent to you by DocuSign
strings.icontainssubstringProcessed by DocuSign
strings.icontainssubstringPlease read and sign the document
strings.icontainssubstringPlease kindly review and sign the
strings.icontainssubstringYour document is pending review and signature
strings.icontainssubstringpending document for your signature
strings.icontainssubstringyour review and signature
strings.icontainssubstringa pending document for
strings.icontainssubstringYour document is ready
strings.icontainssubstringThis email is automatically generated by DocuSign
strings.icontainssubstringYour document has been completed
regex.icontainsregexReview\s*(?:and\s*|&\s*)Sign.{0,40}docusign
regex.icontainsregexdocusign.{0,40}Review\s*(?:and\s*|&\s*)Sign
regex.icontainsregexSign\s*(?:and\s*|&\s*)Return.{0,40}docusign
regex.icontainsregexSign\s*(?:and\s*|&\s*)Return.docusign.{0,40}
strings.icontainssubstringcomplete with docusign
strings.icontainssubstringsignature request
regex.icontainsregexReview\s*(?:and\s*|&\s*)Sign
regex.icontainsregexSign\s*(?:and\s*|&\s*)Return
strings.icontainssubstringPlease Docusign
strings.icontainssubstringDocusign has sent
strings.iends_withsuffixdocusign.net
regex.imatchregex[0-9a-f]{32}@(?:[^\.]+\.)?docusign.net
regex.icontainsregex\bdocu\b
strings.icontainssubstringsign
regex.icontainsregexPowered by.{0,6}(?:\s*<\/?[^\>]+\>\s*)+<img[^\>]+(?:src="https:\/\/docucdn-a\.akamaihd\.net\/[^\"]+email-logo.png"|alt="DocuSign")
regex.icontainsregexPowered by\s*DocuSign
strings.icontainssubstringPowered by
strings.icontainssubstringusing the Docusign Electronic Signature Service
strings.icontainssubstringwho uses the DocuSign Electronic Signature Service
strings.icontainssubstringThank you for choosing DocuSign
strings.icontainssubstringAlternate Signing Method
strings.icontainssubstringAlternative Access
regex.icontainsregex(?:Click|Select) 'Access Documents', and enter
strings.icontainssubstringPlease do not share this email, link, or access code with others
sender.email.domain.root_domainmemberinsuresign.com
sender.email.domain.root_domainmemberclixsign.com
sender.email.domain.root_domainmemberesignlive.com
sender.email.domain.root_domainmemberclickcontracts.com
sender.email.domain.root_domainmembersadq.sa
sender.email.domain.root_domainmembervasion.com
sender.email.domain.root_domainmemberchubb.com
strings.icontainssubstringDocusign provides a
strings.icontainssubstringsolution for Digital Transaction Management
strings.icontainssubstringa secure link to DocuSign
body.links[].href_url.domain.domainequalssupport.docusign.com
strings.containssubstring/articles/
body.links[].href_url.domain.domainequalscommunity.docusign.com
body.links[].href_url.domain.domainequalsprotect.docusign.com
body.links[].href_url.domain.domainequalsapp.esign.docusign.com
strings.icontainssubstringDeclining to sign
strings.icontainssubstringManaging notifications
strings.icontainssubstringHow to Sign a Document
strings.icontainssubstringDocusign Support Center
strings.icontainssubstringReport this email
strings.icontainssubstringDocusign Community
strings.icontainssubstringConnect with our support team
strings.icontainssubstringUnsubscribe
strings.icontainssubstringManage Preferences
regex.icontainsregex<font size="?[0-9]"?[^\>]*>DocuSign</font>
regex.icontainsregex\nDocu(?:<[^\>]+>\s*)+Sign<
regex.icontainsregex<span[^>]*style="[^"]*">Docu.?Sign<\/span>
regex.icontainsregexDocu.?Sign
regex.icontainsregex<span[^>]*style="[^"]*">(Docu|D(?:ocu?)?)<\/span>(?:<[^\>]+\>){0,2}<span[^>]*style="[^"]*">(Sign|S(?:ign?)?)<\/span>
regex.imatchregexDocu.?Sign
regex.icontainsregex^docu.?sign
strings.icontainssubstringDocusign
html.xpath(body.html, '//img/@alt').nodes[].rawequalsdocusign
regex.iextractregex(?:D|&#68;|&#x44;)(?:&#?[0-9a-fA-F]{2,6};|\s|o|о|&#1086;|&#x43e;)(?:&#?[0-9a-fA-F]{2,6};|\s|c|с|&#1089;|&#x441;)u(?:&#?[0-9a-fA-F]{2,6};|\s)?S(?:&#?[0-9a-fA-F]{2,6};|\s|i|і|&#1110;|&#x456;)(?:&#?[0-9a-fA-F]{2,6};|\s|g|ɡ|&#609;|&#x261;)(?:n|&#110;|&#x6e;)
regex.iextractregex(?:[DⅮᎠᗞᗡ𝐃𝐷𝑫𝒟𝓓𝔇𝔻𝕯𝖣])\s*(?:[oοоօ0Ооʘ◯])\s*(?:[cсçҫ¢ϲС])\s*u\s*(?:[sѕЅ5$])\s*(?:[iіІ1l!|])\s*(?:[gǵġģ9ɡ])\s*(?:[nոռℼη𝐧𝑛𝒏𝓃𝓷𝔫𝕟𝖓])
regex.iextractregex(?:D|&#68;|&#x44;)(?:o|о|&#111;|&#x6f;|&#1086;|&#x43e;|&#959;|&#x3bf;)(?:c|с|&#99;|&#x63;|&#1089;|&#x441;|&#1010;|&#231;|&#x67;|&#265;|&#x109;)(?:u|&#117;|&#x75;|&#1091;|&#x443;|&#965;|&#x3c5;)(?:s|&#115;|&#x73;|&#1109;|&#x455;)(?:i|і|&#105;|&#x69;|&#1110;|&#x456;|&#305;|&#x131;)(?:g|&#103;|&#x67;|&#609;|&#x261;|&#287;|&#x11f;)(?:n|&#110;|&#x6e;|&#1085;|&#x43d;|&#951;|&#x3b7;)
regex.iextractregexD(?:&#[0-9]{1,7};)*\p{Mn}*o(?:&#[0-9]{1,7};)*\p{Mn}*c(?:&#[0-9]{1,7};)*\p{Mn}*u(?:&#[0-9]{1,7};)*\p{Mn}*[Ss](?:&#[0-9]{1,7};)*\p{Mn}*i(?:&#[0-9]{1,7};)*\p{Mn}*g(?:&#[0-9]{1,7};)*\p{Mn}*n
regex.icontainsregexb(?:ackground(?:-color)?|g?color):\s*rgb\(30,\s*76,\s*161\)
regex.icontainsregexb(?:ackground(?:-color)?|g?color):\s*rgb\(61,\s*170,\s*73\)
regex.icontainsregex<(?:div|td|table)[^>]*b(?:ackground(?:-color)?|g?color)(?::|=)\s*\"?#1e4ca1[^>]*>
regex.icontainsregexb(?:ackground(?:-color)?|g?color)(?::|=)\s*\"?#(?:214e9f|3260a7|0056b3|1e4ca1|214395|325bb8|3c60ad)
regex.icontainsregex<title>[^<]*Easearch[^<]*</title>
regex.icontainsregex<spacing>[^<]*(?:Docusign|Document)
regex.icontainsregex{(?:domain|randomNumber\d?)}
strings.ilevenshteinfuzzyReview Now
strings.ilevenshteinfuzzyReview and Sign
strings.icontainssubstringReview
strings.icontainssubstringReview Us
strings.icontainssubstringleave us a review
regex.icontainsregex\bReviews\b
strings.icontainssubstringReview Message
body.links[].href_url.domain.domainequalssecurity.microsoft.com
body.links[].href_url.pathequals/quarantine
strings.icontainssubstringdocument
strings.icontainssubstringdocusign
strings.icontainssubstringview form
strings.icontainssubstringSign
regex.icontainsregex(?:in\b|now)
strings.icontainssubstringDownload
strings.icontainssubstringFile
strings.icontainssubstringDocument
strings.icontainssubstringcomplete tasks
strings.icontainssubstringView and complete
filter(body.links)[].href_url.domain.root_domainmemberdocusign.com
filter(body.links)[].href_url.domain.root_domainmemberdocusign.net
filter(body.links)[].href_url.domain.root_domainmemberdocusign.co.uk
filter(body.links)[].href_url.domain.root_domainmemberdocusign.com.br
filter(body.links)[].href_url.domain.root_domainmemberdocusign.fr
filter(body.links)[].href_url.domain.root_domainmemberinsuresign.com
filter(body.links)[].href_url.domain.root_domainmemberclixsign.com
filter(body.links)[].href_url.domain.root_domainmemberesignlive.com
filter(body.links)[].href_url.domain.root_domainmemberclickcontracts.com
filter(body.links)[].href_url.domain.root_domainmemberadobesign.com
filter(body.links)[].href_url.domain.root_domainmemberhellosign.com
filter(body.links)[].href_url.domain.root_domainequalsmimecastprotect.com
regex.icontainsregexdomain=(?:\w+\.)?docusign.(?:net|com|co\.uk|com\.br|fr)
regex.icontainsregexdomain=(?:\w+\.)?(?:insuresign\.com|clixsign\.com|esignlive\.com|clickcontracts\.com|adobesign\.com|hellosign\.com)
attachments[].file_extensionmemberhtml
attachments[].file_extensionmemberhtm
attachments[].file_extensionmembershtml
attachments[].file_extensionmemberdhtml
attachments[].file_typeequalshtml
attachments[].content_typeequalstext/html
regex.icontainsregex\s{0,}<script.*
regex.icontainsregex</script>
strings.ilikesubstring*createElement*
strings.ilikesubstring*appendChild*
strings.ilikesubstring*createObjectURL*
headers.domains[].root_domainequalsdocusign.net
headers.hops[].fields[].nameequalsX-Api-Host
strings.ends_withsuffixdocusign.net
strings.containssubstringvia