{"id":921,"date":"2025-01-31T09:30:14","date_gmt":"2025-01-31T08:30:14","guid":{"rendered":"https:\/\/sparrow365.de\/?p=921"},"modified":"2025-02-25T22:17:44","modified_gmt":"2025-02-25T21:17:44","slug":"new-vulnerability-in-entra-id-users-were-able-to-change-their-own-username","status":"publish","type":"post","link":"https:\/\/sparrow365.de\/index.php\/en\/2025\/01\/31\/new-vulnerability-in-entra-id-users-were-able-to-change-their-own-username\/","title":{"rendered":"New Vulnerability in Entra ID: Users were able to change their own Username"},"content":{"rendered":"<h1>New Vulnerability in Entra ID: Users were able to change their own Username<\/h1>\n<p>Another Microsoft security vulnerability became known over the past week. It <strong>was<\/strong> possible for users and, under certain conditions, external users (<em>guests<\/em>) to change their so-called &quot;User Principal Name <strong>(UPN)<\/strong>.&quot; The UPN is the primary sign-in attribute used in the Microsoft world to determine identity.<\/p>\n<blockquote>\n<p><em>The <a href=\"https:\/\/sparrow365.de\/wp-content\/uploads\/2024\/01\/ComingSoon.png\">Bypass of Intune Compliant Device controls<\/a> is also still current<\/em><\/p>\n<\/blockquote>\n<p><br class=\"\"><\/p>\n<blockquote>\n<p>\u26a0\ufe0f <em>For hybrid users synchronized from Active Directory, changes were overwritten, but this still opened a window for potential misuse.<\/em> \u26a0\ufe0f<\/p>\n<\/blockquote>\n<p>In the Admin Center, a user could adjust the prefix (<strong><em>Max.Mustermann<\/em><\/strong>@&#8230;) and the domain (&#8230;@<strong><em>Firma.de<\/em><\/strong>) in their own profile, thereby also creating additional valid email addresses for themselves. This change could also be done via the API.<\/p>\n<p>Normally, although the field is shown as editable, you would see an error message when attempting to save:<\/p>\n<p><img decoding=\"async\" style=\"max-height:500px;\" src=\"https:\/\/sparrow365.de\/wp-content\/uploads\/2025\/01\/1_AttemptToSave.png\" alt=\"AttempToSaveUPNChange\" ><\/p>\n<p><br class=\"\"><br \/>\n<br class=\"\"><\/p>\n<p>Since <strong>at least<\/strong> January 22, 2025, that error message did not appear. The issue was <strong>fixed<\/strong> on January 24, 2025, in the afternoon. To date, Microsoft has not disclosed exactly how long the problem existed (<em>status as of January 29, 2025<\/em>).<\/p>\n<p><br class=\"\"><\/p>\n<hr \/>\n<h2>When were guest users able to change their sign-in name?<\/h2>\n<p>Entra ID offers various ways to manage guests. By default, their access is limited. If, however, guests are granted the same rights as regular users (<em>which I explicitly do not recommend!<\/em>), those rights included the ability to change their own UPN.<\/p>\n<p><img decoding=\"async\" style=\"max-height:300px;\" src=\"https:\/\/sparrow365.de\/wp-content\/uploads\/2025\/01\/3_GuestProblemSettings.png\" alt=\"ProblematicGuestAccess\" ><\/p>\n<p><br class=\"\"><br \/>\n<br class=\"\"><\/p>\n<hr \/>\n<h2>Why is changing the UPN a problem?<\/h2>\n<p>The following scenarios are immediately apparent to me, but there are certainly more ways to exploit the ability to change a UPN.<\/p>\n<h3>Impersonation<\/h3>\n<p>Changing the UPN also changes the <strong>email and chat address<\/strong>. This could allow users to conceal their identity (e.g. \u201cCEO@&#8230;\u201d), as the display name in the Office contact card is often not visible across organizations. Old UPNs remain associated with the mailbox, meaning unused addresses (e.g. &quot;WorksCouncil@&#8230;&quot;) could be misused to intercept emails. After an UPN-Change, Guests could also appear as internal employees.<\/p>\n<h3>Dynamic Groups<\/h3>\n<p>Automatic group rules often rely on email addresses. By changing the UPN, attackers could gain unauthorized access to <strong>organization-wide Teams<\/strong> or files. Naming conventions used for <strong>security mechanisms<\/strong> (such as Conditional Access) could also be circumvented by clever administrators.<\/p>\n<blockquote>\n<p><em><strong>Tip:<\/strong> Administrator controls should use explicit assignments and protected attributes.<\/em><\/p>\n<\/blockquote>\n<h3>Taking over inactive user accounts in connected applications<\/h3>\n<p>Even though active UPNs in Entra are unique, <strong>departed users\u2019 accounts<\/strong> may still exist in third-party applications. Since those accounts are often not deleted, this could allow extensive access to systems such as HR software or financial accounting.<\/p>\n<p><br class=\"\"><\/p>\n<hr \/>\n<h2>Searching for Misuse<\/h2>\n<p>We\u2019ve established the importance of taking a look at any changes that occured \u2013 but how can we find problematic UPNs over an unknown time period?<\/p>\n<blockquote>\n<p><em>Microsoft has announced that, in the event of misuse, they will contact the administrators of affected tenants. However, since neither the timing nor the details of this contact are known, it makes sense to proactively look for potential exploitation of this behavior wherever possible.<\/em><\/p>\n<\/blockquote>\n<p>Before we begin, it\u2019s important to note: without an Entra ID Premium license, <a href=\"https:\/\/learn.microsoft.com\/en-us\/entra\/identity\/monitoring-health\/reference-reports-data-retention#activity-reports\">Audit Logs are only retained for 7 days<\/a>. If these logs aren\u2019t forwarded to a Log Analytics Workspace or another archive, it\u2019s very unlikely you will be able to independently identify any misuse.<\/p>\n<blockquote>\n<p><em>Adding the storage solutions listed below after the fact will not recover lost data\u2014what\u2019s gone is gone.<\/em><\/p>\n<\/blockquote>\n<p><br class=\"\"><\/p>\n<h3>Parsing the Audit Log from the Portal<\/h3>\n<blockquote>\n<p>\u26a0\ufe0f <em>This approach cannot detect the incident discussed in the article, because the corresponding logs have expired from the retention period. However, it can serve as a template for future searches.<\/em> \u26a0\ufe0f<\/p>\n<\/blockquote>\n<p>The simplest way to access the Audit Logs is via the <a href=\"https:\/\/entra.microsoft.com\/#view\/Microsoft_AAD_IAM\/AuditLogList.ReactView\">Entra admin center<\/a>. <strong>Global Reader or Report Reader<\/strong> permission is sufficient.<\/p>\n<p>With Entra Premium licenses, such as those included in Enterprise plans, changes are retained for <strong>30 days<\/strong>.<\/p>\n<p><img decoding=\"async\" style=\"max-height:300px;\" src=\"https:\/\/sparrow365.de\/wp-content\/uploads\/2025\/01\/2_DownloadLogs.png\" alt=\"DownloadLogsFromAdminCenter\"><\/p>\n<p><br class=\"\"><br \/>\n<br class=\"\"><\/p>\n<p>While you can filter for user changes in the portal (Activity = &quot;Update User&quot;), even medium-sized tenants quickly become hard to manage in this view.<\/p>\n<p>It\u2019s therefore more practical to export the results and then analyze them with a script. Below is an example script that reads a CSV file of the Audit Logs and filters for suspicious changes:<\/p>\n<pre><code class=\"language-PowerShell\">param (\n    [parameter(Mandatory = $false)]\n    [string]$auditCSVPath\n)\n\n# If Path not provided or not found, prompt user to select the Audit Log Export\nif (-not $(Test-Path &quot;$auditCSVPath&quot;) ) {\n    Add-Type -AssemblyName System.Windows.Forms\n    $FileBrowser = New-Object System.Windows.Forms.OpenFileDialog -Property @{ \n        InitialDirectory = [Environment]::GetFolderPath(&#039;Desktop&#039;) \n        Filter = &#039;CSV Export (*.csv)|*.csv&#039;\n    }\n    $null = $FileBrowser.ShowDialog()\n    $auditCSVPath = $FileBrowser.FileName\n}\n\n$auditlogImport = import-csv $auditCSVPath\nif ($auditlogImport.Count -eq 250000) {\n    Write-Warning &quot;Please specify a (more restrictive) filter in the GUI or use the API, you have reached the maximum number of records&quot;\n}\n\n# Filter relevant entries\n$selfEdits = $auditlogImport | Where-Object {$_.Activity -eq &quot;Update user&quot; -and $_.Target1ObjectId -eq $_.ActorObjectId}\n$suspiciousEdits = $selfEdits | Where-Object {$($_ | ConvertTo-Json) -match &#039;&quot;UserPrincipalName&quot;,&#039; }\n\nif (-not $suspiciousEdits){ Write-Output &quot;No suspicious changes found&quot;; break }\n\n$Report = [System.Collections.Generic.List[Object]]::new()\nforEach ($item in $suspiciousEdits) {\n    $obj = [PSCustomObject][ordered]@{\n        &quot;Timestamp&quot; = &quot;$(get-date ($item.&#039;Date (UTC)&#039;) -Format &#039;dd-MMM-yyyy HH:mm&#039;)&quot;\n        &quot;User GUID&quot; = $item.Target1ObjectId\n        &quot;Old UPN&quot; = $item.ActorUserPrincipalName\n        &quot;New UPN&quot; =  $item.Target1UserPrincipalName\n    }\n    $report.Add($obj)\n}\n$Report | Out-gridview -Title &quot;Please verify, carefully, these UPN changes&quot;<\/code><\/pre>\n<p><br class=\"\"><\/p>\n<h3>Audit Log via the Graph API<\/h3>\n<blockquote>\n<p>\u26a0\ufe0f <em>This approach cannot detect the incident discussed in the article, because the corresponding logs have expired from the retention period. However, it can serve as a template for future searches.<\/em> \u26a0\ufe0f<\/p>\n<\/blockquote>\n<p>If you have elevated privileges, I recommended setting up an Enterprise App and directly using the <strong>Graph API<\/strong> to retrieve the Audit Logs. However, for the initial setup, you\u2019ll need the &quot;<strong>Privileged Authentication Administrator<\/strong>&quot; right.<\/p>\n<pre><code class=\"language-PowerShell\">Connect-MgGraph -Scope &quot;AuditLog.Read.All, Directory.Read.All&quot; -NoWelcome\n\n$filter = &quot;activityDateTime le 2025-01-25 and activityDisplayName eq &#039;Update user&#039;&quot; \n$auditLogs = Invoke-MgGraphRequest GET &quot;https:\/\/graph.microsoft.com\/v1.0\/auditLogs\/directoryaudits?`$filter=$filter&quot; -OutputType PSObject\n\n# Identify UPN Changes initiated by the user himself\n$upnchanges = $auditlogs.value | Where-Object {$_.targetresources.modifiedproperties.displayname -eq &quot;Userprincipalname&quot;}\n$suspiciousEdits = $upnchanges | Where-Object {$_.Initiatedby.user.id -eq $_.targetresources.id}\n\nif (-not $suspiciousEdits){ Write-Output &quot;No suspicious changes found&quot;; break }\n\n# Create and show report\n$Report = [System.Collections.Generic.List[Object]]::new()\nforEach ($item in $suspiciousEdits) {\n\n    $modifiedProperty = $item.targetresources.modifiedproperties | Where-Object {$_.displayname -eq &quot;Userprincipalname&quot;}\n\n    $obj = [PSCustomObject][ordered]@{\n        &quot;Timestamp&quot; = &quot;$(get-date ($item.activityDateTime) -Format &#039;dd-MMM-yyyy HH:mm&#039;)&quot;\n        &quot;User GUID&quot; = $item.Initiatedby.user.id\n        &quot;Old UPN&quot; = $modifiedProperty.oldValue\n        &quot;New UPN&quot; =  $modifiedProperty.newValue\n    }\n    $report.Add($obj)\n}\n$Report | Out-gridview -Title &quot;Please verify, carefully, these UPN changes&quot;<\/code><\/pre>\n<p><br class=\"\"><\/p>\n<h3>KQL in an Azure Log Analytics Workspace<\/h3>\n<p>If you have set up an <a href=\"https:\/\/entra.microsoft.com\/#view\/Microsoft_AAD_IAM\/DiagnosticSettingsMenuBlade\/~\/General\">export of the Audit Log<\/a> to an <strong>Azure Log Analytics Workspace<\/strong>, you benefit from potentially much longer retention periods and more efficient search options.<\/p>\n<p>Simply open the Log search and use the following KQL to display instances where a user changed their own UPN:<\/p>\n<pre><code class=\"language-KQL\">AuditLogs\n| where TimeGenerated between (datetime(2024-12-20) .. datetime(2025-01-25) ) \n| where OperationName == &quot;Update user&quot;\n\/\/Filter common Service Identities to reduce costly parsing\n| where not(Identity in (&quot;Azure MFA StrongAuthenticationService&quot;, &quot;Microsoft Substrate Management&quot;, &quot;Azure Credential Configuration Endpoint Service&quot;, &quot;Microsoft password reset service&quot;, &quot;Microsoft Online Services&quot;, &quot;Office 365 SharePoint Online&quot;))\n| extend Target = parse_json(TargetResources)[0]\n\/\/ Check whether the UPN was changed before we expand\n| where Target.modifiedProperties has &quot;UserPrincipalName&quot;\n| mv-expand Target.modifiedProperties\n| where tostring(Target_modifiedProperties.displayName) == &quot;UserPrincipalName&quot;\n\/\/ Add the Initiator to check whether the user changed himself\n| extend Initiatior = parse_json(InitiatedBy)\n| where tostring(Initiatior.user.id) == tostring(Target.id)\n| extend newValue = tostring(Target_modifiedProperties.newValue)\n| extend oldValue = tostring(Target_modifiedProperties.oldValue)\n| where newValue  != oldValue\n| project TimeGenerated, User_GUID = Target.id, newValue, oldValue<\/code><\/pre>\n<blockquote>\n<p><em>For no particular reason I would like to mention <a href=\"https:\/\/idefixwiki.no\/about\/\">Julian Rasmussen<\/a>.<\/em><\/p>\n<\/blockquote>\n<p><br class=\"\"><\/p>\n<h3>Purview Audit Log Search<\/h3>\n<blockquote>\n<p>\u26a0\ufe0f <em>This approach can be used for full results with an E3 license until June 18, 2025, and with an E5 license until December 20, 2025<\/em> \u26a0\ufe0f<\/p>\n<\/blockquote>\n<p>If it turns out the vulnerability has <strong>existed for more than 30 days<\/strong> or you only became aware of it late, there is an alternative\u2014even if no <strong>Log Analytics Workspace<\/strong> has been set up.<\/p>\n<p>The <a href=\"https:\/\/learn.microsoft.com\/en-us\/purview\/audit-solutions-overview\">Purview Audit Log<\/a> (also called the Exchange Unified Audit Log) stores compliance data for:<\/p>\n<ul>\n<li><strong>180 days<\/strong> with an E3 license  <\/li>\n<li><strong>365 days<\/strong> with an E5 license  <\/li>\n<\/ul>\n<p>This feature is enabled by default but requires specific permissions:<\/p>\n<ul>\n<li>Assignment of the <strong>Exchange<\/strong> role &quot;Audit Logs&quot; or &quot;View-Only Audit Logs&quot; (alternatively, Global Admin, but that\u2019s not recommended).  <\/li>\n<li>A <strong>Graph Enterprise App with appropriate permissions<\/strong>.\n<ul>\n<li>Privileged Authentication Administrator is required for initial setup.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>With these prerequisites in place, you can search the Unified Audit Log using the PowerShell script below:<\/p>\n<blockquote>\n<p><em>Inspired by <a href=\"https:\/\/practical365.com\/audit-log-query-api\/\">https:\/\/practical365.com\/audit-log-query-api\/<\/a><\/em><\/p>\n<\/blockquote>\n<pre><code class=\"language-PowerShell\">#Requires -modules Microsoft.Graph.Authentication\n\n# If you have a longer retention you may specify it (Default: 180 days)\nparam (\n    [parameter(Mandatory = $false)]\n    [int]$logRetentionDays = 180\n)\nConnect-MgGraph -scope &quot;AuditLogsQuery-Entra.Read.All&quot; -NoWelcome\n\n# Function to Handle Graph Pagination\nfunction Get-GraphData {\n    param (\n        [Parameter(Mandatory = $true)]\n        [string]$Uri,\n        [hashtable]$headers = @{},\n\n        [System.Collections.Arraylist]$result\n    )\n\n    $response = Invoke-MgGraphRequest -Method GET -Uri $Uri -Headers $headers -OutputType PSObject\n    $result.AddRange($response.value)\n\n    if ($response.&#039;@odata.nextLink&#039;) {\n        Get-GraphData -Uri $response.&#039;@odata.nextLink&#039; -headers $headers -result $result\n    }\n}\n\nWrite-Output &quot;Creating query...&quot;\n\n$SearchName = (&quot;UPNChange_$(Get-Date -format &#039;dd-MMM-yyyy HH:mm&#039;)&quot;)\n# Old version searching full retention period \n# [String]$StartDate = (Get-Date).AddDays(-$logRetentionDays).Tostring(&quot;yyyy-MM-ddT00:00:00Z&quot;)\n[String]$StartDate = &quot;2024-12-20T00:00:00Z&quot;\n# End on date the issue was fixed\n[String]$EndDate = &quot;2025-01-25T00:00:00Z&quot;\n\n$SearchParameters = @{\n    displayName           = &quot;$SearchName&quot;\n    filterStartDateTime   = &quot;$StartDate&quot;\n    filterEndDateTime     = &quot;$EndDate&quot;\n    serviceFilter         = &quot;AzureActiveDirectory&quot;\n    operationFilters      = @(&quot;Update user.&quot;)\n}\n$SearchQuery = Invoke-MgGraphRequest -Method POST -Uri &quot;https:\/\/graph.microsoft.com\/beta\/security\/auditLog\/queries&quot; -Body $SearchParameters\n$SearchId = $SearchQuery.Id\n\nWrite-Output &quot;Waiting for query completion...&quot;\n\ndo {\n    $search = Invoke-MgGraphRequest -Method GET -Uri &quot;https:\/\/graph.microsoft.com\/beta\/security\/auditLog\/queries\/$searchid&quot;\n    Start-Sleep -Seconds 10\n} while ( $search.status -notin @(&quot;failed&quot;, &quot;succeeded&quot;, &quot;cancelled&quot;) )\n\nIf ( $search.status -in @(&quot;failed&quot;, &quot;cancelled&quot;) ) { Write-Error &quot;The search did not complete successfully. Please check the Security &amp; Compliance Portal - https:\/\/security.microsoft.com\/auditlogsearch?viewid=Async%20Search&quot; ; break }\n\nWrite-Output &quot;Fetching results...&quot;\n\n$result = [System.Collections.Arraylist]::new()\n$Uri = (&quot;https:\/\/graph.microsoft.com\/beta\/security\/auditLog\/queries\/{0}\/records&quot; -f $SearchId)\nGet-GraphData -Uri $Uri -result $result\n\n$suspiciousEdits = $result | Where-Object {$_.auditdata.modifiedproperties.name -eq &quot;userprincipalname&quot; -and\n    ($_.auditData.Actor.id -match &quot;^\\w{8}([-]\\w{4}){3}-\\w{12}$&quot;) -eq ($_.auditData.Target.id -match &quot;^\\w{8}([-]\\w{4}){3}-\\w{12}$&quot;) }\n\nif (-not $suspiciousEdits) { Write-Output &quot;No suspicious changes found&quot;; break }\n\n$Report = [System.Collections.Generic.List[Object]]::new()\nforEach ($item in $suspiciousEdits) {\n    $modifiedProperty = $item.auditdata.ModifiedProperties | Where-Object {$_.name -eq &quot;userprincipalname&quot;}\n\n    $obj = [PSCustomObject][ordered]@{\n        &quot;Timestamp&quot; = &quot;$(get-date ($item.createdDateTime) -Format &#039;dd-MMM-yyyy HH:mm&#039;)&quot;\n        &quot;User GUID&quot; = $item.auditData.Actor.id -match &quot;^\\w{8}([-]\\w{4}){3}-\\w{12}$&quot;\n        &quot;Old UPN&quot; = $modifiedProperty.oldValue\n        &quot;New UPN&quot; =  $modifiedProperty.newValue\n    }\n    $report.Add($obj)\n}\n$Report | Out-gridview -Title &quot;Please verify, carefully, these UPN changes&quot;<\/code><\/pre>\n<blockquote>\n<p><a href=\"https:\/\/learn.microsoft.com\/en-us\/purview\/audit-search?tabs=microsoft-purview-portal#before-you-search-the-audit-log\"><em>Full Microsoft documentation<\/em><\/a><\/p>\n<\/blockquote>\n<p><br class=\"\"><\/p>\n<hr \/>\n<h2>What should I do if I find a suspicious UPN change?<\/h2>\n<ol>\n<li>\n<p><a href=\"https:\/\/learn.microsoft.com\/en-us\/entra\/identity\/users\/users-revoke-access\">Disable the affected account<\/a> immediately to prevent further misuse and limit access.<\/p>\n<\/li>\n<li>\n<p><strong>Contact the affected user<\/strong> to clarify the reason for the change. Check whether it was legitimate or if misuse occurred.<\/p>\n<\/li>\n<li>\n<p>If it is misuse, correct the UPN and <a href=\"https:\/\/charbelnemnom.com\/remove-the-smtp-proxy-address-in-azure-ad\/#Remove_The_SMTP_Proxy_Address\">remove all proxy addresses associated with the user account<\/a><\/p>\n<\/li>\n<\/ol>\n<p><br class=\"\"><\/p>\n<hr \/>\n<h2>Closing Remarks<\/h2>\n<p>It is good that Microsoft responded quickly and decisively to reports from the community. Nevertheless, it remains clear that <strong>independent reviews<\/strong> continue to be an important part of a <a href=\"https:\/\/www.microsoft.com\/de-de\/trust-center\/security\/secure-future-initiative#FAQ\">secure future<\/a> at Microsoft.<\/p>\n<blockquote>\n<p><strong>Further articles<\/strong> from colleagues who were involved early on:<\/p>\n<ul>\n<li><a href=\"https:\/\/ourcloudnetwork.com\/microsoft-accidentally-allows-users-to-update-their-own-username\/\">Daniel Bradley<\/a><\/li>\n<li><a href=\"https:\/\/office365itpros.com\/2025\/01\/24\/update-user-principal-names\/\">Tony Redmond<\/a><\/li>\n<\/ul>\n<\/blockquote>\n","protected":false},"excerpt":{"rendered":"<p>New Vulnerability in Entra ID: Users were able to change their own Username Another Microsoft security vulnerability became known over the past week. It was possible for users and, under certain conditions, external users (guests) to change their so-called &quot;User Principal Name (UPN).&quot; The UPN is the primary sign-in attribute used in the Microsoft world&#8230; &raquo; <a class=\"read-more-link\" href=\"https:\/\/sparrow365.de\/index.php\/en\/2025\/01\/31\/new-vulnerability-in-entra-id-users-were-able-to-change-their-own-username\/\">weiterlesen<\/a><\/p>\n","protected":false},"author":2,"featured_media":922,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[76,78],"tags":[80,84,167,88,90,96,98,103,240,456],"class_list":["post-921","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-me-id-en","category-powershell-en","tag-aad-en","tag-azure-ad-en","tag-cybersecurity-en","tag-entra-en","tag-entra-id-en","tag-graph-en","tag-graph-api-en","tag-powershell-en","tag-security","tag-vulnerability"],"_links":{"self":[{"href":"https:\/\/sparrow365.de\/index.php\/wp-json\/wp\/v2\/posts\/921","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/sparrow365.de\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/sparrow365.de\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/sparrow365.de\/index.php\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/sparrow365.de\/index.php\/wp-json\/wp\/v2\/comments?post=921"}],"version-history":[{"count":2,"href":"https:\/\/sparrow365.de\/index.php\/wp-json\/wp\/v2\/posts\/921\/revisions"}],"predecessor-version":[{"id":931,"href":"https:\/\/sparrow365.de\/index.php\/wp-json\/wp\/v2\/posts\/921\/revisions\/931"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/sparrow365.de\/index.php\/wp-json\/wp\/v2\/media\/922"}],"wp:attachment":[{"href":"https:\/\/sparrow365.de\/index.php\/wp-json\/wp\/v2\/media?parent=921"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/sparrow365.de\/index.php\/wp-json\/wp\/v2\/categories?post=921"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/sparrow365.de\/index.php\/wp-json\/wp\/v2\/tags?post=921"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}