Januar 2025
Autor:in des Beitrags
Julian
Senior Consultant
Veröffentlicht am
29.01.2025 von Julian
Jetzt Blogbeitrag teilen
Xing LinkedIn Facebook Twitter

Neue Sicherheitslücke bei Microsoft: Benutzer konnten eigenständig ihren Benutzernamen ändern

Bei Microsoft ist im Laufe der letzten Woche eine weitere Sicherheitslücke bekannt geworden. Es war Benutzern und, unter bestimmten Voraussetzungen, auch organisationsfremden Benutzern (Gäste) möglich, ihren sogenannten „User Principal Name (UPN)“ zu ändern. Der UPN ist das primäre Anmeldeattribut, an dem in der Microsoft-Welt die Identität festgestellt wird.

Auch der Bypass von Intune Compliant Device Kontrollen ist noch aktuell

⚠️ Bei Hybriden Benutzern, die aus dem Active Directory synchronisiert werden, wurden Änderungen wieder überschrieben, dies eröffnete jedoch ein Zeitfenster für potenziellen Missbrauch. ⚠️

Im Admin Center konnte ein User auf seinem eigenen Profil den Präfix (Max.Mustermann@…) und die Domain (…@Firma.de) anpassen, und so auch weitere gültige Emailadressen für sich erstellen. Diese Änderung konnte auch über die API vorgenommen werden.

Normalerweise wird zwar das Feld als editierbar gezeigt, es folgt aber beim speichern eine Fehlermeldung:

 

 

Seit mindestens dem 22. Januar 2025 blieb die Fehlermeldung aus. Der Fehler wurde am 24. Januar 2025 im Laufe des Nachmittags behoben. Microsoft hat betroffene Tenants informiert.


Wann konnten Gastbenutzer ihren Anmeldenamen ändern?

In Entra ID gibt es verschiedene Möglichkeiten, Gäste zu verwalten. Standardmäßig ist ihr Zugriff eingeschränkt. Wenn Gästen jedoch die gleichen Rechte wie regulären Benutzern eingeräumt werden (was ich ausdrücklich nicht empfehle!), umfasste dies auch das Recht, den eigenen UPN zu ändern.

 

Warum ist UPN Änderung ein Problem?

Mir sind folgende Szenarien offensichtlich, es gibt aber sicherlich weitere Möglichkeiten die Änderung des UPNs auszunutzen.

Impersonation

Die Änderung des UPN führt zur Anpassung der Email- und Chatadresse. Nutzer könnten so ihre Identität verschleiern (z. B. „Geschäftsführer@…“), da der Anzeigename in der Office-Kontaktkarte organisationsübergreifend oft nicht sichtbar ist. Alte UPNs bleiben mit dem Postfach verknüpft, wodurch ungenutzte Adressen (z. B. „Betriebsrat@…“) missbraucht werden könnten, um Emails abzufangen. Gäste könnten sich durch UPN-Änderung zudem als interne Mitarbeiter ausgeben.

Dynamische Gruppen

Automatische Gruppenregeln basieren oft auf Emailadressen. So könnten Angreifer über Änderungen des UPN unberechtigten Zugriff auf organisationsweite Teams oder Dateien erhalten. Auch Namenskonventionen, die für Sicherheitsmechanismen wie Conditional Access genutzt werden, könnten durch findige Administratoren umgangen werden.

Tipp: Für Administratoren sollten explizite Zuweisungen und geschützte Attribute genutzt werden.

Übernahme von inaktiven Benutzerkonten in angebundenen Applikationen

Obwohl aktive UPNs in Entra eindeutig sind, könnten Konten ausgeschiedener Benutzer in Drittanbieterapplikationen weiterverwendet werden. Da Benutzer dort oft nicht gelöscht werden, könnte umfangreicher Zugriff auf Systeme wie HR-Software oder Finanzbuchhaltung erlangt werden.


Auf der Suche nach Missbrauch

Wir haben etabliert, dass es wichtig ist, ein Auge auf alle vorgenommenen Änderungen zu werfen – aber wie finden wir in einem unbekannten Zeitraum problematische UPNs?

Vorab ist wichtig zu wissen: Ohne eine Entra ID Premium-Lizenz werden Audit Logs nur 7 Tage lang gespeichert. Wenn diese Logs nicht in einen Log Analytics Workspace oder ein anderes Archiv weitergeleitet werden, ist es sehr unwahrscheinlich, dass Sie eigenständig Missbrauch identifizieren können.

Nachträgliches Hinzufügen von im folgenden gelisteten Speicherlösungen bringt keine verlorenen Daten zurück – was weg ist, bleibt weg.

Parsen des Audit Log aus dem Portal

⚠️ Dieser Ansatz kann nicht den in dem Artikel behandelten Vorfall erkennen, da die zugehörigen Logs aus der Aufbewahrungsperiode gelaufen sind. Er kann aber als Vorlage für zukünftige Suchen genutzt werden. ⚠️

Die einfachste Möglichkeit, auf die Audit Logs zuzugreifen ist über das Entra admin center. Es reicht Berechtigung als Global Reader oder Report Reader.

Mit Entra Premium-Lizenzen, wie sie Teil der Enterprise-Lizenzen sind, werden Änderungen für 30 Tage aufbewahrt.

 

Zwar kann im Portal nach Benutzeränderungen gefiltert werden (Activity = „Update User“), jedoch bleibt die Ansicht schon in mittelgroßen Tenants unübersichtlich.

Es ist daher sinnvoller, die Ergebnisse zu exportieren und anschließend per Skript zu analysieren. Hier ein Beispielskript, das eine CSV-Datei des Audit Logs einliest und nach verdächtigen Änderungen filtert:

param (
    [parameter(Mandatory = $false)]
    [string]$auditCSVPath
)

# If Path not provided or not found, prompt user to select the Audit Log Export
if (-not $(Test-Path "$auditCSVPath") ) {
    Add-Type -AssemblyName System.Windows.Forms
    $FileBrowser = New-Object System.Windows.Forms.OpenFileDialog -Property @{ 
        InitialDirectory = [Environment]::GetFolderPath('Desktop') 
        Filter = 'CSV Export (*.csv)|*.csv'
    }
    $null = $FileBrowser.ShowDialog()
    $auditCSVPath = $FileBrowser.FileName
}

$auditlogImport = import-csv $auditCSVPath
if ($auditlogImport.Count -eq 250000) {
    Write-Warning "Please specify a (more restrictive) filter in the GUI or use the API, you have reached the maximum number of records"
}

# Filter relevant entries
$selfEdits = $auditlogImport | Where-Object {$_.Activity -eq "Update user" -and $_.Target1ObjectId -eq $_.ActorObjectId}
$suspiciousEdits = $selfEdits | Where-Object {$($_ | ConvertTo-Json) -match '"UserPrincipalName",' }

if (-not $suspiciousEdits){ Write-Output "No suspicious changes found"; break }

$Report = [System.Collections.Generic.List[Object]]::new()
forEach ($item in $suspiciousEdits) {
    $obj = [PSCustomObject][ordered]@{
        "Timestamp" = "$(get-date ($item.'Date (UTC)') -Format 'dd-MMM-yyyy HH:mm')"
        "User GUID" = $item.Target1ObjectId
        "Old UPN" = $item.ActorUserPrincipalName
        "New UPN" =  $item.Target1UserPrincipalName
    }
    $report.Add($obj)
}
$Report | Out-gridview -Title "Please verify, carefully, these UPN changes"

Audit Log über die Graph API

⚠️ Dieser Ansatz kann nicht den in dem Artikel behandelten Vorfall erkennen, da die zugehörigen Logs aus der Aufbewahrungsperiode gelaufen sind. Er kann aber als Vorlage für zukünftige Suchen genutzt werden. ⚠️

Wenn man über erweiterte Rechte verfügt, empfiehlt es sich, eine Enterprise App einzurichten und direkt die Graph API für den Abruf der Audit Logs zu verwenden. Für die erstmalige Einrichtung ist jedoch das Recht „Privileged Authentication Administrator“ erforderlich.

Connect-MgGraph -Scope "AuditLog.Read.All, Directory.Read.All" -NoWelcome

$filter = "activityDateTime le 2025-01-25 and activityDisplayName eq 'Update user'" 
$auditLogs = Invoke-MgGraphRequest GET "https://graph.microsoft.com/v1.0/auditLogs/directoryaudits?`$filter=$filter" -OutputType PSObject

# Identify UPN Changes initiated by the user himself
$upnchanges = $auditlogs.value | Where-Object {$_.targetresources.modifiedproperties.displayname -eq "Userprincipalname"}
$suspiciousEdits = $upnchanges | Where-Object {$_.Initiatedby.user.id -eq $_.targetresources.id}

if (-not $suspiciousEdits){ Write-Output "No suspicious changes found"; break }

# Create and show report
$Report = [System.Collections.Generic.List[Object]]::new()
forEach ($item in $suspiciousEdits) {

    $modifiedProperty = $item.targetresources.modifiedproperties | Where-Object {$_.displayname -eq "Userprincipalname"}

    $obj = [PSCustomObject][ordered]@{
        "Timestamp" = "$(get-date ($item.activityDateTime) -Format 'dd-MMM-yyyy HH:mm')"
        "User GUID" = $item.Initiatedby.user.id
        "Old UPN" = $modifiedProperty.oldValue
        "New UPN" =  $modifiedProperty.newValue
    }
    $report.Add($obj)
}
$Report | Out-gridview -Title "Please verify, carefully, these UPN changes"

KQL in einem Azure Log Analytics Workspace

Wenn ein Export des Audit Logs in einen Azure Log Analytics Workspace eingerichtet wurde, profitieren Sie von einer potenziell erheblich längeren Aufbewahrungsperiode und effizienteren Suchmöglichkeiten.

Es muss nur die Logsuche geöffnet werden und dieses KQL genutzt werden um Fälle zu Zeigen wo ein Benutzer sein eigenen UPN geändert hat:

AuditLogs
| where TimeGenerated between (datetime(2024-12-20) .. datetime(2025-01-25) ) 
| where OperationName == "Update user"
//Filter common Service Identities to reduce costly parsing
| where not(Identity in ("Azure MFA StrongAuthenticationService", "Microsoft Substrate Management", "Azure Credential Configuration Endpoint Service", "Microsoft password reset service", "Microsoft Online Services", "Office 365 SharePoint Online"))
| extend Target = parse_json(TargetResources)[0]
// Check whether the UPN was changed before we expand
| where Target.modifiedProperties has "UserPrincipalName"
| mv-expand Target.modifiedProperties
| where tostring(Target_modifiedProperties.displayName) == "UserPrincipalName"
// Add the Initiator to check whether the user changed himself
| extend Initiatior = parse_json(InitiatedBy)
| where tostring(Initiatior.user.id) == tostring(Target.id)
| extend newValue = tostring(Target_modifiedProperties.newValue)
| extend oldValue = tostring(Target_modifiedProperties.oldValue)
| where newValue  != oldValue
| project TimeGenerated, User_GUID = Target.id, newValue, oldValue

Einfach so möchte ich hier Julian Rasmussen erwähnen.

⚠️ Dieser Ansatz kann bei einer E3 Lizenz bis zum 18. Juni 2025 und mit einer E5 Lizenz bis zum 20. Dezember 2025 für volle Ergebnisse genutzt werden⚠️

Sollte sich herausstellen, dass die Sicherheitslücke länger als 30 Tage bestand oder Sie erst spät darauf aufmerksam wurden, gibt es eine Alternative – selbst wenn kein Log Analytics Workspace eingerichtet wurde.

Das Purview Audit Log (Auch: Exchange Unified Audit Log) speichert Compliance-Daten für:

  • 180 Tage mit einer E3-Lizenz
  • 365 Tage mit einer E5-Lizenz

Dieses Feature ist standardmäßig aktiviert, erfordert jedoch spezielle Rechte:

  • Zuweisung der Exchange Rolle „Audit Logs“ oder „View-Only Audit Logs“ (alternativ Global Admin, aber nicht empfohlen).
  • Eine Graph Enterprise App mit entsprechenden Rechten ist notwendig.
    • Privileged Authentication Administrator zur Ersteinrichtung.

Mit diesen Voraussetzungen kann das Unified Audit Log mithilfe des folgenden PowerShell-Skripts durchsucht werden:

Inspiriert von https://practical365.com/audit-log-query-api/

#Requires -modules Microsoft.Graph.Authentication

# If you have a longer retention you may specify it (Default: 180 days)
param (
    [parameter(Mandatory = $false)]
    [int]$logRetentionDays = 180
)
Connect-MgGraph -scope "AuditLogsQuery-Entra.Read.All" -NoWelcome

# Function to Handle Graph Pagination
function Get-GraphData {
    param (
        [Parameter(Mandatory = $true)]
        [string]$Uri,
        [hashtable]$headers = @{},

        [System.Collections.Arraylist]$result
    )

    $response = Invoke-MgGraphRequest -Method GET -Uri $Uri -Headers $headers -OutputType PSObject
    $result.AddRange($response.value)

    if ($response.'@odata.nextLink') {
        Get-GraphData -Uri $response.'@odata.nextLink' -headers $headers -result $result
    }
}

Write-Output "Creating query..."

$SearchName = ("UPNChange_$(Get-Date -format 'dd-MMM-yyyy HH:mm')")
# If out of available range API throws an Error
[String]$StartDate = "2024-12-20T00:00:00Z"
# Old Version of Searching in maximum range
#[String]$StartDate = (Get-Date).AddDays(-$logRetentionDays).Tostring("yyyy-MM-ddT00:00:00Z")
# End on date the issue was fixed
[String]$EndDate = "2025-01-25T00:00:00Z"

$SearchParameters = @{
    displayName           = "$SearchName"
    filterStartDateTime   = "$StartDate"
    filterEndDateTime     = "$EndDate"
    serviceFilter         = "AzureActiveDirectory"
    operationFilters	  = @("Update user.")
}
$SearchQuery = Invoke-MgGraphRequest -Method POST -Uri "https://graph.microsoft.com/beta/security/auditLog/queries" -Body $SearchParameters
$SearchId = $SearchQuery.Id

Write-Output "Waiting for query completion..."

do {
    $search = Invoke-MgGraphRequest -Method GET -Uri "https://graph.microsoft.com/beta/security/auditLog/queries/$searchid"
    Start-Sleep -Seconds 10
} while ( $search.status -notin @("failed", "succeeded", "cancelled") )

If ( $search.status -in @("failed", "cancelled") ) { Write-Error "The search did not complete successfully. Please check the Security & Compliance Portal - https://security.microsoft.com/auditlogsearch?viewid=Async%20Search" ; break }

Write-Output "Fetching results..."

$result = [System.Collections.Arraylist]::new()
$Uri = ("https://graph.microsoft.com/beta/security/auditLog/queries/{0}/records" -f $SearchId)
Get-GraphData -Uri $Uri -result $result

$suspiciousEdits = $result | Where-Object {$_.auditdata.modifiedproperties.name -eq "userprincipalname" -and
    ($_.auditData.Actor.id -match "^\w{8}([-]\w{4}){3}-\w{12}$") -eq ($_.auditData.Target.id -match "^\w{8}([-]\w{4}){3}-\w{12}$") }

if (-not $suspiciousEdits) { Write-Output "No suspicious changes found"; break }

$Report = [System.Collections.Generic.List[Object]]::new()
forEach ($item in $suspiciousEdits) {
    $modifiedProperty = $item.auditdata.ModifiedProperties | Where-Object {$_.name -eq "userprincipalname"}

    $obj = [PSCustomObject][ordered]@{
        "Timestamp" = "$(get-date ($item.createdDateTime) -Format 'dd-MMM-yyyy HH:mm')"
        "User GUID" = $item.auditData.Actor.id -match "^\w{8}([-]\w{4}){3}-\w{12}$"
        "Old UPN" = $modifiedProperty.oldValue
        "New UPN" =  $modifiedProperty.newValue
    }
    $report.Add($obj)
}
$Report | Out-gridview -Title "Please verify, carefully, these UPN changes"

Vollständige Microsoft Doku

Was tun, wenn ich eine verdächtige UPN-Änderung finde?

  1. Deaktivieren Sie das betroffene Konto sofort, um weiteren Missbrauch zu verhindern und den Zugriff einzuschränken.
  2. Kontaktieren Sie den betroffenen Benutzer, um die Ursache der Änderung zu klären. Überprüfen Sie, ob die Änderung legitim war oder ob ein Missbrauch vorliegt.
  3. Handelt es sich um Missbrauch, korrigieren Sie den UPN und entfernen Sie alle mit dem Benutzerkonto verknüpften Proxy-Adressen

Schlusswort

Es ist positiv, dass Microsoft schnell und konsequent auf die Meldungen aus der Community reagiert hat. Dennoch zeigt sich, dass unabhängige Prüfungen weiterhin ein wichtiger Bestandteil einer sicheren Zukunft bei Microsoft bleiben.

Weitere Artikel von früh involvierten Kollegen:

Kontakt

Ihr persönlicher Ansprechpartner

Bei welchem Projekt oder welcher Herausforderung dürfen wir Sie unterstützen? Wir sind gerne für Sie da.

MICHAEL WILDGRUBER | Team Lead Digital Workplace – Cloud Productivity

+49 89  71040920

michael@provectus.de

Zum Kontaktformular

Wollen Sie immer up2date sein? Dann melden Sie sich jetzt zu unserem Newsletter an

Bleiben Sie auf dem Laufenden. Wir informieren Sie regelmäßig über aktuelle Trends und technologische Neuerungen sowie geplante Webinare und Events. Sie erhalten Einblick in interessante Kundenprojekte und werfen einen Blick hinter die Kulissen. Melden Sie sich jetzt an.

Zur Newsletter Anmeldung 

News & Updates

auf einen Blick
Whitepaper

Whitepaper – Evergreen IT

Erfahren Sie, wie Sie mit Evergreen IT und Microsoft 365 Ihre IT-Prozesse effizient und sicher managen. Jetzt Whitepaper gratis downloaden!
Weiterlesen
Blogbeitrag

Citrix: Fehler bei LTSR 2402 Cumulative Update 2 (CU2)

Das LTSR 2402 CU2-Update enthält fehlerhafte Signaturen, die zu Funktionsausfällen und Sicherheitswarnungen führen können. Citrix arbeitet an einer Lösung – erfahren Sie mehr über den Workaround und empfohlene Maßnahmen.
Weiterlesen
Blogbeitrag

NetScaler-Logs verwerten mit Vector & Prometheus

NetScaler TCP-Logs mit Vector verarbeiten und in Prometheus speichern – für eine saubere Visualisierung und einfache Analyse
Weiterlesen
Blogbeitrag

Provectus wird Acronis Gold Partner

Wir setzen auf die leistungsstarke Technologie von Acronis, um unseren Kunden eine zuverlässige Backup- und Recovery-Lösung zu bieten.
Weiterlesen
Blogbeitrag

Microsoft Sovereign Cloud und was sie für europäische Unternehmen bedeutet 

Microsoft Sovereign Private Cloud und was sie für europäische Unternehmen bedeutet
Weiterlesen
Whitepaper

Whitepaper – VDI-Guide

Hier erfahren Sie, welche Virtual Desktop Infrastructure (VDI) Ihr Unternehmen wirklich voranbringt – inklusive Architektur-Vergleich, Lizenzmodelle und Praxis-Tipps.
Weiterlesen
Blogbeitrag

Neue OneDrive-Funktion birgt Datenschutzrisiken

„Prompt to Add Personal Account to OneDrive Sync“. Eine Erweiterung, die erhebliche Auswirkungen auf Datenschutz und Compliance haben kann.
Weiterlesen
Blogbeitrag

NIS2 und DORA-Regulierung: Aufgeschoben aber nicht aufgehoben

Handlungsbedarf für Unternehmen und die IT – Die NIS2-Richtlinie sieht bei Verstößen empfindliche Sanktionen vor.
Weiterlesen
Whitepaper

Whitepaper – Citrix-Lizenzfeatures-DeviceTrust-Unicon-uberAgent

Nutzen Sie das volle Potential Ihrer Citrix-Lizenzen. Alle Details der neuen Features Devicetrust, Unicon, Uberagent – in unserem Whitepaper
Weiterlesen
Echt Ich

Echt Ich Alex

In ECHT ICH erfahrt ihr mehr über Alex, seinen Arbeitsalltag, seine Hobbys und warum er bei Provectus „ECHT ER“ sein kann.
Weiterlesen
Jetzt Blogbeitrag teilen
Xing LinkedIn Facebook Twitter