Avis de sécurité : Mettre à jour l’attribution de rôle pour l’authentification Microsoft Entra

Un bogue de sécurité a été découvert. Il affecte l’authentification Microsoft Entra pour Immersive Reader. Nous vous conseillons de changer les autorisations relatives à vos ressources Immersive Reader.

Background

Quand vous créez initialement vos ressources Immersive Reader et que vous les configurez pour l’authentification Microsoft Entra, vous devez octroyer des autorisations à l’identité de l’application Microsoft Entra afin d’accéder à votre ressource Immersive Reader. Cela s’appelle une attribution de rôle. Le rôle Azure qui était précédemment utilisé pour les autorisations était le rôle Cognitive Services User (Utilisateur Cognitive Services).

Un audit de sécurité a permis de découvrir que ce rôle d’utilisateur Cognitive Services dispose d’autorisations pour lister les clés. Cela est légèrement préoccupant, car les intégrations d’Immersive Reader impliquent l’utilisation de ce jeton d’accès Microsoft Entra dans les applications web et les navigateurs clients. Si le jeton d’accès est volé par un intervenant malveillant ou un attaquant, il existe un risque pour que ce jeton d’accès soit utilisé pour list keys de votre ressource Immersive Reader. Si un attaquant pouvait exécuter l’action list keys sur votre ressource, il obtiendrait la Subscription Key (clé d’abonnement) de votre ressource. La Subscription Key de votre ressource est utilisée comme mécanisme d’authentification et est considérée comme un secret. Si un attaquant disposait de la Subscription Key de la ressource, il pourrait effectuer des appels d’API valides et authentifiés vers le point de terminaison de votre ressource Immersive Reader, ce qui pourrait entraîner un déni de service en raison de l’utilisation accrue et de la limitation de votre point de terminaison. Cela permettrait également une utilisation non autorisée de votre ressource Immersive Reader, ce qui entraînerait une augmentation des frais sur votre facture.

Toutefois, dans la pratique, il est peu probable voire impossible que cette attaque ou l’exécution de code malveillant exploitant une faille de sécurité puisse se produire. Pour les scénarios Immersive Reader, les clients obtiennent des jetons d’accès Microsoft Entra avec une audience https://cognitiveservices.azure.com. Pour que l’action list keys de votre ressource aboutisse, le jeton d’accès Microsoft Entra doit avoir l’audience https://management.azure.com. En règle générale, cela n’est pas vraiment préoccupant, car les jetons d’accès utilisés dans le cadre des scénarios Immersive Reader ne fonctionnent pas pour list keys, car ils n’ont pas l’audience nécessaire. Pour modifier l’audience sur le jeton d’accès, un attaquant doit détourner le code d’acquisition du jeton et modifier l’audience avant l’appel à Microsoft Entra ID pour acquérir le jeton. Encore une fois, l’exécution de code malveillant exploitant une faille de sécurité est peu probable, car conformément à la meilleure pratique d’authentification d’Immersive Reader, nous conseillons aux clients de créer des jetons d’accès Microsoft Entra sur le back-end de l’application web, et non dans le client ou le navigateur. Dans ce cas, dans la mesure où l’acquisition du jeton a lieu sur le service back-end, il est peu probable, voire impossible, qu’un attaquant puisse compromettre ce processus et changer l’audience.

Le véritable problème se pose lorsqu’un client acquiert des jetons à partir de Microsoft Entra ID directement dans le code client. Nous déconseillons fortement cette pratique, mais dans la mesure où les clients sont libres de l’implémenter comme ils l’entendent, il est possible que certains clients le fassent.

Afin d’atténuer les préoccupations liées à l’utilisation éventuelle du jeton d’accès Microsoft Entra pour list keys, nous avons créé un rôle Azure intégré appelé Cognitive Services Immersive Reader User, qui ne dispose pas des autorisations pour list keys. Ce nouveau rôle n’est pas un rôle partagé pour la plateforme Azure AI services, contrairement au rôle Cognitive Services User. Ce nouveau rôle est spécifique à Immersive Reader, et n’autorise que les appels aux API d’Immersive Reader.

Nous conseillons à TOUS les clients d’utiliser le nouveau rôle Cognitive Services Immersive Reader User à la place du rôle Cognitive Services User d’origine. Nous avons fourni un script ci-dessous que vous pouvez exécuter sur chacune de vos ressources pour changer les autorisations d’attribution de rôle.

Cette recommandation s’applique à TOUS les clients, afin de s’assurer que cette vulnérabilité est corrigée pour tous, quel que soit le scénario d’implémentation ou la probabilité d’attaque.

Si vous ne le faites PAS, rien ne s’arrêtera. L’ancien rôle continuera à fonctionner. L’impact sur la sécurité est minime pour la plupart des clients. Toutefois, nous vous conseillons de migrer vers le nouveau rôle pour atténuer les problèmes de sécurité évoqués. L’application de cette mise à jour est une recommandation liée à un Avis de sécurité. Il ne s’agit pas d’une obligation.

Toutes les ressources Immersive Reader que vous créez avec notre script dans Guide pratique : Créer une ressource Immersive Reader utilisent automatiquement le nouveau rôle.

Mettre à jour le rôle et effectuer la rotation de vos clés d’abonnement

Si vous avez créé et configuré une ressource Immersive Reader en suivant les instructions fournies dans Guide pratique : Créer une ressource Immersive Reader avant février 2022, nous vous conseillons d’effectuer l’opération suivante pour mettre à jour les autorisations d’attribution de rôle sur TOUTES vos ressources Immersive Reader. L’opération consiste à exécuter un script pour mettre à jour l’attribution de rôle sur une seule ressource. Si vous avez plusieurs ressources, exécutez ce script plusieurs fois, une fois pour chaque ressource.

Une fois que vous avez mis à jour le rôle à l’aide du script suivant, nous vous conseillons également d’effectuer une rotation des clés d’abonnement sur votre ressource. Cela sera utile si vos clés sont compromises à la suite de l’exécution de code malveillant exploitant une faille de sécurité, et si quelqu’un utilise votre ressource avec une authentification par clé d’abonnement sans votre consentement. La rotation des clés permet de rendre les clés antérieures non valides, et de refuser tout accès ultérieur. Pour les clients qui utilisent l’authentification Microsoft Entra, ce qui doit être le cas de tout le monde conformément à l’implémentation actuelle du kit SDK Immersive Reader, la rotation des clés n’a aucun impact sur le service Immersive Reader, car les jetons d’accès Microsoft Entra sont utilisés pour l’authentification, et non la clé d’abonnement. La rotation des clés d’abonnement est juste une autre précaution.

Vous pouvez effectuer une rotation des clés d’abonnement dans le portail Azure. Accédez à votre ressource, puis à la section Keys and Endpoint. En haut, il y a des boutons pour Regenerate Key1 et Regenerate Key2.

Screenshot of the Azure portal showing an Immersive Reader resource with the Keys and Endpoint section selected, which shows the Regenerate Keys buttons at the top.

Utiliser Azure PowerShell pour mettre à jour votre attribution de rôle

  1. Commencez par ouvrir Azure Cloud Shell. Assurez-vous que Cloud Shell est défini sur PowerShell dans la liste déroulante en haut à gauche, ou sinon tapez pwsh.

  2. Copiez et collez l’extrait de code suivant dans le shell.

    function Update-ImmersiveReaderRoleAssignment(
        [Parameter(Mandatory=$true, Position=0)] [String] $SubscriptionName,
        [Parameter(Mandatory=$true)] [String] $ResourceGroupName,
        [Parameter(Mandatory=$true)] [String] $ResourceName,
        [Parameter(Mandatory=$true)] [String] $AADAppIdentifierUri
    )
    {
        $unused = ''
        if (-not [System.Uri]::TryCreate($AADAppIdentifierUri, [System.UriKind]::Absolute, [ref] $unused)) {
            throw "Error: AADAppIdentifierUri must be a valid URI"
        }
    
        Write-Host "Setting the active subscription to '$SubscriptionName'"
        $subscriptionExists = Get-AzSubscription -SubscriptionName $SubscriptionName
        if (-not $subscriptionExists) {
            throw "Error: Subscription does not exist"
        }
        az account set --subscription $SubscriptionName
    
        # Get the Immersive Reader resource 
        $resourceId = az cognitiveservices account show --resource-group $ResourceGroupName --name $ResourceName --query "id" -o tsv
        if (-not $resourceId) {
            throw "Error: Failed to find Immersive Reader resource"
        }
    
        # Get the Microsoft Entra application service principal
        $principalId = az ad sp show --id $AADAppIdentifierUri --query "objectId" -o tsv
        if (-not $principalId) {
            throw "Error: Failed to find Microsoft Entra application service principal"
        }
    
        $newRoleName = "Cognitive Services Immersive Reader User"
        $newRoleExists = az role assignment list --assignee $principalId --scope $resourceId --role $newRoleName --query "[].id" -o tsv
        if ($newRoleExists) {
            Write-Host "New role assignment for '$newRoleName' role already exists on resource"
        } 
        else {
            Write-Host "Creating new role assignment for '$newRoleName' role"
            $roleCreateResult = az role assignment create --assignee $principalId --scope $resourceId --role $newRoleName
            if (-not $roleCreateResult) {
                throw "Error: Failed to add new role assignment"
            }
            Write-Host "New role assignment created successfully"
        }
    
        $oldRoleName = "Cognitive Services User"
        $oldRoleExists = az role assignment list --assignee $principalId --scope $resourceId --role $oldRoleName --query "[].id" -o tsv
        if (-not $oldRoleExists) {
            Write-Host "Old role assignment for '$oldRoleName' role does not exist on resource"
        }
        else {
            Write-Host "Deleting old role assignment for '$oldRoleName' role"
            az role assignment delete --assignee $principalId --scope $resourceId --role $oldRoleName
            $oldRoleExists = az role assignment list --assignee $principalId --scope $resourceId --role $oldRoleName --query "[].id" -o tsv
            if ($oldRoleExists) {
                throw "Error: Failed to delete old role assignment"
            }
            Write-Host "Old role assignment deleted successfully"
        }
    }
    
  3. Exécutez la fonction Update-ImmersiveReaderRoleAssignment en remplaçant les espaces réservés <PARAMETER_VALUES> par vos propres valeurs, le cas échéant.

    Update-ImmersiveReaderRoleAssignment -SubscriptionName '<SUBSCRIPTION_NAME>' -ResourceGroupName '<RESOURCE_GROUP_NAME>' -ResourceName '<RESOURCE_NAME>' -AADAppIdentifierUri '<MICROSOFT_ENTRA_APP_IDENTIFIER_URI>'
    

    La commande complète ressemble à ce qui suit. Ici, nous avons placé chaque paramètre sur sa propre ligne pour plus de clarté, ce qui vous permet de voir l’ensemble de la commande. Ne copiez pas, ou n’utilisez pas cette commande en l’état. Copiez et utilisez la commande avec vos propres valeurs. Cet exemple contient des valeurs factices pour les <PARAMETER_VALUES>. La vôtre sera différente, car vous allez utiliser vos propres noms pour ces valeurs.

    Update-ImmersiveReaderRoleAssignment
        -SubscriptionName 'MyOrganizationSubscriptionName'
        -ResourceGroupName 'MyResourceGroupName'
        -ResourceName 'MyOrganizationImmersiveReader'
        -AADAppIdentifierUri 'https://MyOrganizationImmersiveReaderAADApp'
    
    Paramètre Commentaires
    SubscriptionName Nom de votre abonnement Azure.
    ResourceGroupName Nom du groupe de ressources qui contient votre ressource Immersive Reader.
    Nom_ressource Nom de votre ressource Immersive Reader.
    AADAppIdentifierUri URI de votre application Microsoft Entra.

Étape suivante