{ "version": "1.1.0", "lastUpdated": "2025-12-20T00:00:00Z", "description": "Phishing detection logic for identifying phishing attempts targeting Microsoft 365 login pages", "trusted_login_patterns": [ "^https:\\/\\/login\\.microsoftonline\\.(com|us)$", "^https:\\/\\/login\\.microsoft\\.com$", "^https:\\/\\/login\\.microsoft\\.net$", "^https:\\/\\/login\\.windows\\.net$", "^https:\\/\\/login\\.partner\\.microsoftonline\\.cn$", "^https:\\/\\/login\\.live\\.com$", "^https:\\/\\/([a-zA-Z0-9-]+\\.)?ciamlogin\\.com$" ], "microsoft_domain_patterns": [ "^https:\\/\\/([a-zA-Z0-9-]+\\.)*microsoft\\.com$", "^https:\\/\\/([a-zA-Z0-9-]+\\.)*microsoftonline\\.com$", "^https:\\/\\/([a-zA-Z0-9-]+\\.)*office\\.com$", "^https:\\/\\/([a-zA-Z0-9-]+\\.)*office365\\.com$", "^https:\\/\\/([a-zA-Z0-9-]+\\.)*sharepoint\\.com$", "^https:\\/\\/([a-zA-Z0-9-]+\\.)*onedrive\\.com$", "^https:\\/\\/live\\.com$", "^https:\\/\\/(?!login\\.)[a-zA-Z0-9-]+(\\.[a-zA-Z0-9-]+)*\\.live\\.com$", "^https:\\/\\/([a-zA-Z0-9-]+\\.)*hotmail\\.com$", "^https:\\/\\/([a-zA-Z0-9-]+\\.)*outlook\\.com$", "^https:\\/\\/([a-zA-Z0-9-]+\\.)*azure\\.(com|cn|net)$", "^https:\\/\\/([a-zA-Z0-9-]+\\.)*azurewebsites\\.net$", "^https:\\/\\/([a-zA-Z0-9-]+\\.)*msauth\\.net$", "^https:\\/\\/([a-zA-Z0-9-]+\\.)*msftauth\\.net$", "^https:\\/\\/([a-zA-Z0-9-]+\\.)*msftauthimages\\.net$", "^https:\\/\\/([a-zA-Z0-9-]+\\.)*msauthimages\\.net$", "^https:\\/\\/([a-zA-Z0-9-]+\\.)*msidentity\\.com$", "^https:\\/\\/([a-zA-Z0-9-]+\\.)*microsoftonline-p\\.com$", "^https:\\/\\/([a-zA-Z0-9-]+\\.)*microsoftazuread-sso\\.com$", "^https:\\/\\/([a-zA-Z0-9-]+\\.)*azureedge\\.net$", "^https:\\/\\/([a-zA-Z0-9-]+\\.)*bing\\.com$", "^https:\\/\\/github\\.com$", "^https:\\/\\/([a-zA-Z0-9-]+\\.)*cloud\\.microsoft$", "^https:\\/\\/([a-zA-Z0-9-]+\\.)*powerbi\\.com$" ], "exclusion_system": { "description": "Centralized exclusion system to prevent false positives on legitimate sites (Microsoft partners, SSO providers, major platforms)", "domain_patterns": [ "^https:\\/\\/[^/]*\\.cipp\\.app(/.*)?$", "^https:\\/\\/(.*\\.)?cyberdrain\\.com(/.*)?$", "^https:\\/\\/[^/]*\\.cow\\.tech(/.*)?$", "^https:\\/\\/[^/]*\\.auth0\\.com(/.*)?$", "^https:\\/\\/[^/]*\\.google\\.(com|co\\.uk|ca|de|fr|co|nl|com\\.au)(/.*)?$", "^https:\\/\\/[^/]*\\.bing\\.com(/.*)?$", "^https:\\/\\/[^/]*\\.yahoo\\.com(/.*)?$", "^https:\\/\\/[^/]*\\.duckduckgo\\.com(/.*)?$", "^https:\\/\\/[^/]*\\.amazon\\.(com|co\\.uk|ca|de|fr)(/.*)?$", "^https:\\/\\/[^/]*\\.(facebook|twitter|x|linkedin|instagram)\\.com(/.*)?$", "^https:\\/\\/[^/]*\\.(youtube|youtu)\\.be(/.*)?$", "^https:\\/\\/[^/]*\\.apple\\.com(/.*)?$", "^https:\\/\\/[^/]*\\.dynamics\\.com(/.*)?$", "^https:\\/\\/(?:[^/]*\\.)?zoom\\.us(/.*)?$", "^https:\\/\\/github\\.com(/.*)?$", "^https:\\/\\/[^/]*\\.github\\.com(/.*)?$", "^https:\\/\\/[^/]*\\.github\\.io(/.*)?$" ], "context_indicators": { "description": "Additional context that indicates legitimate discussion vs phishing", "legitimate_contexts": [ "migration tool", "governance tool", "management platform", "consulting services", "microsoft partner", "microsoft 365 solutions", "microsoft 365 migration", "microsoft 365 governance", "sharepoint migration", "tenant migration", "tenant-to-tenant", "cloud migration", "microsoft 365 management", "copilot readiness" ], "legitimate_sso_patterns": [], "suspicious_contexts": [ "verify now", "click here", "urgent action", "suspended account", "security alert", "immediate attention", "limited time" ] } }, "legitimate_discussion_domains": [], "m365_detection_requirements": { "description": "Required elements to identify a Microsoft 365 login page with primary and secondary categorization", "primary_elements": [ { "id": "idPartnerPL", "type": "source_content", "pattern": "idPartnerPL", "description": "Microsoft partner login field must be in source", "weight": 3, "category": "primary" }, { "id": "loginfmt", "type": "source_content", "pattern": "loginfmt", "description": "Login format field must be in source", "weight": 3, "category": "primary" }, { "id": "aadcdn_msauth", "type": "source_content", "pattern": "aadcdn\\.msauth\\.net", "description": "Microsoft auth CDN must be present in source", "weight": 3, "category": "primary" }, { "id": "urlMsaSignUp", "type": "source_content", "pattern": "urlMsaSignUp", "description": "Microsoft signup URL reference must be in source", "weight": 2, "category": "primary" }, { "id": "i0116_element", "type": "source_content", "pattern": "#i0116", "description": "Microsoft login input element must be in source", "weight": 2, "category": "primary" }, { "id": "aadcdn_background_image", "type": "source_content", "pattern": "aadcdn\\.msauth\\.net/shared/1\\.0/content/images/backgrounds/", "description": "Microsoft login page background image from CDN", "weight": 3, "category": "primary" } ], "secondary_elements": [ { "id": "page_title_microsoft", "type": "page_title", "patterns": [ "microsoft\\s*365", "office\\s*365", "microsoft.*sign\\s*in", "sign\\s*in.*microsoft", "microsoft.*login", "login.*microsoft", "microsoft\\s*account", "azure.*sign\\s*in", "office.*sign\\s*in" ], "description": "Page title contains Microsoft branding with sign-in/login keywords", "weight": 0.5, "category": "secondary" }, { "id": "meta_description_microsoft", "type": "meta_tag", "attribute": "description", "patterns": [ "microsoft\\s*365", "office\\s*365", "sign\\s*in.*microsoft", "microsoft.*sign\\s*in" ], "description": "Meta description contains Microsoft branding", "weight": 1, "category": "secondary" }, { "id": "meta_og_title_microsoft", "type": "meta_tag", "attribute": "og:title", "patterns": [ "microsoft", "office\\s*365", "azure" ], "description": "Open Graph title contains Microsoft branding", "weight": 0.5, "category": "secondary" }, { "id": "favicon_microsoft", "type": "source_content", "pattern": "]+rel=[\"'](?:icon|shortcut icon|apple-touch-icon)[\"'][^>]+href=[\"'][^\"']*(?:microsoft|msft|m365\\.ico|office)[^\"']*[\"'][^>]*>", "description": "Favicon references Microsoft branding", "weight": 1, "category": "secondary" }, { "id": "ms_form_dimensions", "type": "css_pattern", "patterns": [ "max-width:\\s*440px", "width:\\s*calc\\(100%\\s*-\\s*40px\\)", "width:\\s*27\\.5rem", "height:\\s*21\\.125rem" ], "description": "Microsoft login form width patterns (supporting evidence only)", "weight": 0.5, "category": "secondary" }, { "id": "ms_button_colors", "type": "css_pattern", "patterns": [ "background-color:\\s*#0067b8", "border:\\s*1px\\s+solid\\s+#0067b8" ], "description": "Microsoft specific button styling (supporting evidence only)", "weight": 1.5, "category": "secondary" }, { "id": "segoe_ui_font", "type": "source_content", "pattern": "Segoe\\s+UI(?:\\s+(?:Webfont|Symbol|Historic|Emoji))?", "description": "Microsoft's Segoe UI font family variants (supporting evidence only)", "weight": 0.5, "category": "secondary" }, { "id": "ms_container_layout", "type": "css_pattern", "patterns": [ "display:\\s*grid.*place-items:\\s*center", "height:\\s*100vh.*width:\\s*100vw" ], "description": "Microsoft login container layout (supporting evidence only)", "weight": 0.5, "category": "secondary" }, { "id": "ms_external_css", "type": "source_content", "pattern": "(?:href=[\"'].*(?:aadcdn\\.msauth|aadcdn\\.msftauth|login\\.microsoftonline).*\\.css[\"']|src=[\"'].*(?:aadcdn\\.msauth|login\\.microsoft).*\\.css[\"'])", "description": "Microsoft login-specific CSS files (strong evidence)", "weight": 3, "category": "secondary" }, { "id": "password_input_field", "type": "source_content", "pattern": "]*(?:type=[\"']password[\"']|name=[\"']password[\"']|id=[\"'][^\"']*password[^\"']*[\"'])[^>]*>", "description": "Password input field present on page (supporting evidence only)", "weight": 0.5, "category": "secondary" }, { "id": "login_form_element", "type": "source_content", "pattern": "]*type=[\"'](?:email|text|tel)[\"'][^>]*(?:placeholder=[\"'][^\"']+[\"'][^>]*|[^>]*)>", "description": "Login form input field (email/text/tel type) with placeholder attribute", "weight": 0.5, "category": "secondary" }, { "id": "ms_login_placeholder_text", "type": "source_content", "pattern": "(?:Email,\\s*phone,?\\s*or\\s*Skype|Enter\\s+your\\s+email,\\s*phone,?\\s*or\\s*Skype|someone@example\\.com|example@example\\.com)", "description": "Microsoft login placeholder text patterns - highly specific to Microsoft login pages", "weight": 1, "category": "secondary" } ], "detection_thresholds": { "minimum_primary_elements": 1, "minimum_total_weight": 4, "minimum_elements_overall": 3, "minimum_secondary_only_weight": 9, "minimum_secondary_only_elements": 7 }, "legacy_minimum_required": 4, "legacy_all_must_be_present": false }, "blocking_rules": [ { "id": "form_post_not_microsoft", "type": "form_action_validation", "description": "Block the page if the credentials are not sent to Microsoft", "condition": { "form_selector": "form", "action_must_not_contain": "login.microsoftonline.com", "has_password_field": true }, "action": "block", "severity": "critical" }, { "id": "customcss_wrong_origin", "type": "resource_validation", "description": "Block if customcss is loaded from non-Microsoft CDN", "condition": { "resource_pattern": "customcss", "required_origin": "https:\\/\\/aadcdn.msftauthimages.net/", "block_if_different_origin": true }, "action": "block", "severity": "critical" }, { "id": "css_spoofing_detection", "type": "css_spoofing_validation", "description": "Block if page mimics Microsoft CSS styling but posts to non-Microsoft domain", "condition": { "css_indicators": [ "logincdn\\.msauth\\.net", "background-color:\\s*#0067b8", "max-width:\\s*440px", "width:\\s*calc\\(100%\\s*-\\s*40px\\)", "width:\\s*27\\.5rem.*height:\\s*21\\.125rem", "display:\\s*grid.*place-items:\\s*center", "Segoe\\s+UI(?:\\s+(?:Webfont|Symbol|Historic|Emoji))?" ], "minimum_css_matches": 3, "form_action_must_not_contain": "login.microsoftonline.com", "has_credential_fields": true }, "action": "block", "severity": "critical" } ], "allow_rules": [ { "id": "microsoft_domain_allow", "type": "url_validation", "description": "Allow if URL is login.microsoftonline.com", "condition": { "url_equals": "login.microsoftonline.com" }, "action": "allow", "priority": "highest" } ], "aad_detection_elements": [ { "id": "loginfmt_field", "selectors": [ "input[name='loginfmt']", "#i0116" ], "description": "Azure AD username/email input field", "weight": 30 }, { "id": "next_button", "selectors": [ "#idSIButton9" ], "description": "Azure AD Next/Sign in button", "weight": 25 }, { "id": "password_field", "selectors": [ "input[type='password']" ], "description": "Password input field", "weight": 20 }, { "id": "microsoft_branding", "text_patterns": [ "Microsoft\\s*365", "Office\\s*365", "Entra\\s*ID", "Azure\\s*AD", "Microsoft" ], "description": "Microsoft branding text", "weight": 15 } ], "required_elements": [ { "id": "idPartnerPL", "selectors": [ "input[name='idPartnerPL']", "[name*='idPartnerPL']", "[id*='idPartnerPL']" ], "description": "Microsoft partner login field", "weight": 20 }, { "id": "urlMsaSignUp", "text_patterns": [ "urlMsaSignUp" ], "description": "Microsoft signup URL reference", "weight": 15 }, { "id": "flowToken", "text_patterns": [ "flowToken" ], "description": "Microsoft authentication flow token", "weight": 15 }, { "id": "aadcdn_msauth", "text_patterns": [ "https:\\/\\/aadcdn\\.msauth\\.net/" ], "description": "Microsoft authentication CDN reference", "weight": 15 } ], "rules": [ { "id": "check_legitimate_domain", "type": "url", "weight": 25, "condition": { "domains": [ "login.microsoftonline.com" ] }, "description": "Verify legitimate Microsoft domain (must be login.microsoftonline.com)" }, { "id": "check_form_post_url", "type": "form_action", "weight": 30, "condition": { "contains": "login.microsoftonline.com", "form_selector": "form[action]" }, "description": "Form POST URL must be login.microsoftonline.com for legitimate pages" }, { "id": "detect_idpartnerpl_field", "type": "dom", "weight": 20, "condition": { "selectors": [ "input[name='idPartnerPL']", "[name*='idPartnerPL']", "[id*='idPartnerPL']" ] }, "description": "Detect presence of idPartnerPL field" }, { "id": "detect_url_msa_signup", "type": "content", "weight": 15, "condition": { "contains": "urlMsaSignUp", "search_context": "page_source" }, "description": "Detect urlMsaSignUp presence in page code" }, { "id": "detect_aadcdn_msauth", "type": "content", "weight": 15, "condition": { "contains": "https:\\/\\/aadcdn.msauth.net/", "search_context": "page_source" }, "description": "Detect aadcdn.msauth.net presence in source" }, { "id": "check_loginfmt_field", "type": "dom", "weight": 20, "condition": { "selectors": [ "input[name='loginfmt']", "#i0116" ] }, "description": "Check for loginfmt input field availability" }, { "id": "detect_flow_token", "type": "content", "weight": 15, "condition": { "contains": "flowToken", "search_context": "page_source" }, "description": "Detect flowToken presence in page" }, { "id": "verify_customcss_source", "type": "network", "weight": 25, "condition": { "network_pattern": "*customcss*", "required_domain": "https:\\/\\/aadcdn.msftauthimages.net/" }, "description": "Custom CSS files must originate from aadcdn.msftauthimages.net" }, { "id": "check_valid_referrer", "type": "referrer_validation", "weight": 25, "condition": { "header_name": "referer", "validation_method": "pattern_match", "pattern_source": "microsoft_domain_patterns" }, "description": "Validate referrer against Microsoft domain patterns for legitimate authentication flows" }, { "id": "detect_form_action_modification", "type": "code_driven", "code_driven": true, "code_logic": { "type": "pattern_count", "patterns": [ "addEventListener\\s*\\(\\s*['\"]submit['\"]", "\\.action\\s*=\\s*['\"]https?://(?!login\\.microsoftonline)[^'\"]+['\"]" ], "flags": "i", "min_count": 2 }, "weight": -30, "description": "JavaScript code modifying form action on submit" } ], "thresholds": { "legitimate": 85, "suspicious": 55, "phishing": 25 }, "phishing_indicators": [ { "id": "phi_001", "pattern": "(?:secure-?(?:microsoft|office|365|outlook))", "flags": "i", "severity": "high", "description": "Suspicious domain mimicking Microsoft services", "action": "block", "category": "domain_spoofing", "confidence": 0.9 }, { "id": "phi_031_suspicious_query_length_combined", "code_driven": true, "code_logic": { "description": "Trigger if a suspiciously long query parameter is present AND the page contains Microsoft branding keywords AND there is a password field or form submission.", "logic": "if (url.match(/[?&][a-zA-Z0-9_\\-]{1,32}=([a-zA-Z0-9_\\-]{30,})/i) && (pageText.match(/microsoft|office|365/i)) && (document.querySelector('input[type=\\\\'password\\\\']') || document.querySelector('form'))) { return true; } return false;" }, "severity": "medium", "description": "Suspiciously long query parameter value in URL, Microsoft branding, and password field or form present (possible phishing)", "action": "warn", "category": "url_structure", "confidence": 0.7 }, { "id": "phi_033_suspicious_event_listeners", "code_driven": true, "code_logic": { "type": "pattern_count", "patterns": [ "addEventListener\\s*\\(\\s*['\"]submit['\"]", "\\.action\\s*=\\s*['\"](?!https://login\\.microsoftonline)", "form\\.setAttribute\\s*\\(['\"]action['\"]" ], "flags": "i", "min_count": 2 }, "severity": "high", "description": "Form with submit listeners that modify action attribute", "action": "block", "category": "dom_manipulation", "confidence": 0.9, "weight": 20 }, { "id": "phi_004", "code_driven": true, "code_logic": { "type": "all_of", "operations": [ { "type": "any_of", "operations": [ { "type": "substring_proximity", "word1": "urgent", "word2": "action", "max_distance": 500 }, { "type": "substring_proximity", "word1": "immediate", "word2": "attention", "max_distance": 500 }, { "type": "substring_proximity", "word1": "act", "word2": "now", "max_distance": 500 } ] }, { "type": "substring_present", "values": [ "microsoft", "office", "365" ] } ] }, "severity": "medium", "description": "Urgency tactics targeting Microsoft users", "action": "warn", "category": "social_engineering", "confidence": 0.65 }, { "id": "phi_005", "pattern": "data:text/html.*(?:microsoft|office|365|outlook).*(?:login|password|signin)", "flags": "i", "severity": "critical", "description": "Data URI containing Microsoft login form", "action": "block", "category": "credential_harvesting", "confidence": 0.95 }, { "id": "phi_007", "pattern": "\\*customcss.*(?!aadcdn\\.msftauthimages\\.net)", "flags": "i", "severity": "high", "description": "Custom CSS loaded from non-authorized domain", "action": "block", "category": "resource_hijacking", "confidence": 0.85 }, { "id": "phi_012_suspicious_resources", "code_driven": true, "code_logic": { "type": "resource_from_domain", "resource_type": "customcss", "allowed_domains": [ "aadcdn.msftauthimages.net" ], "invert": true }, "severity": "high", "description": "Custom CSS loaded from unauthorized domain", "action": "block", "category": "resource_hijacking", "confidence": 0.9 }, { "id": "phi_006", "code_driven": true, "code_logic": { "type": "all_of", "operations": [ { "type": "all_of", "operations": [ { "type": "substring_present", "values": [ "microsoft", "office", "365" ] }, { "type": "substring_present", "values": [ "login", "password", "signin" ] }, { "type": "pattern_count", "patterns": [ "