MITRE ATT&CK coverage
| Tactic | Techniques |
|---|---|
| Persistence | T1556 Modify Authentication Process |
| Defense Impairment | T1556 Modify Authentication Process |
| Credential Access | T1556 Modify Authentication Process |
Rule body yaml
AnalysisType: rule
Description: A user's MFA has been removed
DisplayName: "Microsoft365 MFA Disabled"
Enabled: true
Filename: microsoft365_mfa_disabled.py
Reports:
MITRE ATT&CK:
- TA003:T1556 # Persistence - Modify Authentication Process
- TA005:T1556 # Defense Evansion - Modify Authentication Process
- TA006:T1556 # Credential Access - Modify Authentication Process
Runbook: Depending on company policy, either suggest or require the user re-enable two step verification.
Reference: https://learn.microsoft.com/en-us/microsoft-365/admin/security-and-compliance/set-up-multi-factor-authentication?view=o365-worldwide
Severity: Low
Tests:
- ExpectedResult: false
Log:
Actor:
- ID: Azure MFA StrongAuthenticationService
Type: 1
- ID: ABC-123
Type: 2
- ID: ServicePrincipal_123-abc
Type: 2
- ID: 321-cba
Type: 2
- ID: ServicePrincipal
Type: 2
ActorContextId: 123-abc-456
AzureActiveDirectoryEventType: 1
CreationTime: "2022-12-12 17:28:35"
ExtendedProperties:
- Name: additionalDetails
Value: '{"UserType":"Member"}'
- Name: extendedAuditEventCategory
Value: User
Id: 123-abc-123
InterSystemsId: abc-123-321
IntraSystemId: aa-bbb-333
ModifiedProperties:
- Name: StrongAuthenticationMethod
NewValue: '[{"Default": true,"MethodType": 7}]'
OldValue: "[]"
- Name: Included Updated Properties
NewValue: StrongAuthenticationMethod
OldValue: ""
- Name: TargetId.UserType
NewValue: Member
OldValue: ""
ObjectId: sample.user@yourorg.onmicrosoft.com
Operation: Update user.
OrganizationId: 111-222-333
RecordType: 8
ResultStatus: Success
SupportTicketId: ""
Target:
- ID: User_111-222-bbb
Type: 2
- ID: 111-aa-bbb-321
Type: 2
- ID: User
Type: 2
- ID: sample.user@yourorg.onmicrosoft.com
Type: 5
- ID: 123abcdef
Type: 3
TargetContextId: aaa-bb-222
UserId: ServicePrincipal_aa-bb-ccc
UserKey: Not Available
UserType: 4
Workload: AzureActiveDirectory
Name: MFA Add Event
- ExpectedResult: true
Log:
Actor:
- ID: Azure MFA StrongAuthenticationService
Type: 1
- ID: ABC-123
Type: 2
- ID: ServicePrincipal_123-abc
Type: 2
- ID: 321-cba
Type: 2
- ID: ServicePrincipal
Type: 2
ActorContextId: 123-abc-456
AzureActiveDirectoryEventType: 1
CreationTime: "2022-12-12 17:28:35"
ExtendedProperties:
- Name: additionalDetails
Value: '{"UserType":"Member"}'
- Name: extendedAuditEventCategory
Value: User
Id: 123-abc-123
InterSystemsId: abc-123-321
IntraSystemId: aa-bbb-333
ModifiedProperties:
- Name: StrongAuthenticationMethod
NewValue: "[]"
OldValue: '[{"Default": true,"MethodType": 7}]'
- Name: Included Updated Properties
NewValue: StrongAuthenticationMethod
OldValue: ""
- Name: TargetId.UserType
NewValue: Member
OldValue: ""
ObjectId: sample.user@yourorg.onmicrosoft.com
Operation: Update user.
OrganizationId: 111-222-333
RecordType: 8
ResultStatus: Success
SupportTicketId: ""
Target:
- ID: User_111-222-bbb
Type: 2
- ID: 111-aa-bbb-321
Type: 2
- ID: User
Type: 2
- ID: sample.user@yourorg.onmicrosoft.com
Type: 5
- ID: 123abcdef
Type: 3
TargetContextId: aaa-bb-222
UserId: ServicePrincipal_aa-bb-ccc
UserKey: Not Available
UserType: 4
Workload: AzureActiveDirectory
Name: MFA Remove event
DedupPeriodMinutes: 60
LogTypes:
- Microsoft365.Audit.AzureActiveDirectory
RuleID: "Microsoft365.MFA.Disabled"
Threshold: 1
Detection logic
Condition
Operation eq "Update user."
This rule also runs imperative logic the parser cannot express as a filter; the conditions above are the structured part it could extract.
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.
| Field | Kind | Values |
|---|---|---|
Operation | eq |
|
Output fields
Fields the rule emits when it matches. Chronicle authors list these in the outcome block; they appear on the detection and $risk_score drives alerting. Sentinel / Defender XDR rules build them up through project / summarize / extend stages. Sentinel maps these into alert fields via entityMappings and customDetails; Defender XDR custom detections surface them as alert fields directly.
| Field | Source |
|---|---|
operation | Operation |
organization_id | OrganizationId |
client_ip | ClientIp |
extended_properties | ExtendedProperties |
modified_properties | ModifiedProperties |
application | Application |
actor | Actor |
ObjectId |