Aviso de seguridad: actualización de la asignación de roles para la autenticación de Microsoft Entra

Se detectó un error de seguridad que afecta a la autenticación de Microsoft Entra para Immersive Reader. Le recomendamos que cambie los permisos en los recursos de Immersive Reader.

Fondo

Al crear inicialmente los recursos de Immersive Reader y configurarlos para la autenticación de Microsoft Entra, es necesario conceder permisos para que la identidad de la aplicación Microsoft Entra acceda al recurso Immersive Reader. Esto se conoce como asignación de roles. El rol de Azure que se usaba anteriormente para los permisos era el rol Usuario de Cognitive Services.

Durante una auditoría de seguridad, se descubrió que este rol de usuario de Cognitive Services tiene permisos para enumerar claves. Esto es un poco preocupante porque las integraciones de Immersive Reader implican el uso de este token de acceso de Microsoft Entra en aplicaciones web y navegadores cliente. Si un actor o atacante malintencionados robaron el token de acceso, existe una preocupación por que este token de acceso se pueda usar para list keys para el recurso Immersive Reader. Si un atacante pudiera enumerar claves (list keys) para su recurso, podría obtener la clave Subscription Key para el recurso. La clave Subscription Key del recurso se usa como un mecanismo de autenticación y se considera un secreto. Si un atacante tuviera la clave Subscription Key del cliente, podría realizar llamadas API válidas y autenticadas al punto de conexión de recursos de Immersive Reader, lo que podría generar una denegación de servicio debido al aumento en el uso y la limitación del punto de conexión. También permitiría el uso no autorizado del recurso de Immersive Reader, lo que podría generar un aumento de los cargos en su factura.

En la práctica, sin embargo, no es probable que se produzca este ataque o vulnerabilidad de seguridad, o puede que ni siquiera sea posible. Para escenarios de Immersive Reader, los clientes obtienen tokens de acceso de Microsoft Entra con una audiencia de https://cognitiveservices.azure.com. Para realizar list keys correctamente para el recurso, el token de acceso de Microsoft Entra debe tener una audiencia de https://management.azure.com. Por lo general, esto no es una gran preocupación, ya que los tokens de acceso usados para escenarios de Immersive Reader no funcionarían para list keys, ya que no tienen la audiencia necesaria. Para cambiar la audiencia en el token de acceso, un atacante tendría que secuestrar el código de adquisición del token y cambiar la audiencia antes de que se realice la llamada a Microsoft Entra ID para adquirir el token. De nuevo, no es probable que esto se aproveche porque, como procedimiento recomendado de autenticación de Immersive Reader, se aconseja que los clientes creen tokens de acceso de Microsoft Entra en el back-end de la aplicación web, no en el cliente ni en el navegador. En esos casos, dado que la adquisición de tokens se produce en el servicio back-end, no es tan probable (ni quizás incluso posible) que un atacante pueda poner en peligro ese proceso y cambiar el público.

La verdadera preocupación se produce si algún cliente adquiere tokens de Microsoft Entra ID directamente en el código del cliente. Recomendamos encarecidamente no hacerlo, pero como los clientes pueden implementar lo que les parezca adecuado, es posible que algunos terminen haciéndolo.

Para mitigar las preocupaciones sobre cualquier posibilidad de usar el token de acceso de Microsoft Entra para list keys, creamos un nuevo rol integrado de Azure denominado Cognitive Services Immersive Reader User que no tiene los permisos para list keys. Este nuevo rol no es un rol compartido para la plataforma de servicios de Azure AI como lo es el rolCognitive Services User. Este rol nuevo es específico para Immersive Reader y solo permite llamadas a Immersive Reader API.

Recomendamos a TODOS los clientes que usen el nuevo rol de Cognitive Services Immersive Reader User en lugar del rol de Cognitive Services User original. A continuación, verá un script que puede ejecutar en cada uno de los recursos a fin de cambiar los permisos de asignación de roles.

Esta recomendación se aplica a TODOS los clientes a fin de garantizar que todos apliquen la revisión para esta vulnerabilidad, sin importar el escenario de implementación o la probabilidad de un ataque.

Si NO lo hace, no se interrumpirá nada. El rol anterior seguirá funcionando. El impacto en la seguridad para la mayoría de los clientes es mínimo. Sin embargo, le recomendamos que migre al nuevo rol para mitigar los problemas de seguridad tratados. Aplicar esta actualización es una recomendación de asesoramiento de seguridad; no es un mandato.

Todo recurso nuevo de Immersive Reader que cree con el script que se indica en el artículo sobre la creación de un recurso de Immersive Reader usa automáticamente el rol nuevo.

Actualización del rol y rotación de las claves de suscripción

Si creó y configuró un recurso de Immersive Reader mediante las instrucciones de Procedimiento: Crear un recurso de Immersive Reader antes de febrero de 2022, le recomendamos que realice la siguiente operación para actualizar los permisos de asignación de roles en TODOS los recursos de Immersive Reader. La operación implica ejecutar un script para actualizar la asignación de roles en un recurso único. Si tiene varios recursos, ejecute varias veces este script (una para cada recurso).

Después de actualizar el rol mediante el siguiente script, también se recomienda rotar las claves de suscripción en el recurso. Esto es en caso de que sus claves se hayan visto comprometidas por la vulnerabilidad de seguridad, y alguien esté utilizando realmente su recurso con autenticación de clave de suscripción sin su consentimiento. La rotación de las claves representa las claves anteriores no válidas y deniega cualquier acceso adicional. En el caso de los clientes que utilizan la autenticación Microsoft Entra, que deberían ser todos según la implementación actual del SDK de Immersive Reader, la rotación de las claves no tiene ningún efecto en el servicio de Immersive Reader, ya que los tokens de acceso de Microsoft Entra se utilizan para la autenticación, no la clave de suscripción. La rotación de las claves de suscripción es simplemente una precaución adicional.

Puede rotar las claves de suscripción en Azure Portal. Vaya al recurso y, a continuación, a la sección Keys and Endpoint. En la parte superior, hay botones para las acciones de Regenerate Key1 y 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.

Uso de Azure PowerShell para actualizar la asignación de roles

  1. Para empezar, abra Azure Cloud Shell. Asegúrese de que Cloud Shell está establecido en PowerShell en la lista desplegable de la parte superior izquierda o escriba pwsh.

  2. Copie y pegue el siguiente fragmento de código en el 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. Ejecute la función Update-ImmersiveReaderRoleAssignment, reemplazando los marcadores de posición <PARAMETER_VALUES> por sus propios valores según corresponda.

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

    El comando completo tendrá un aspecto similar al siguiente. Aquí colocamos cada parámetro en su propia línea para mayor claridad, para que pueda ver el comando completo. No copie ni use este comando tal como está. Copie y use el comando con sus propios valores. Este ejemplo tiene valores ficticios de <PARAMETER_VALUES>. Los suyos serán diferentes, ya que se presentan con sus propios nombres para estos valores.

    Update-ImmersiveReaderRoleAssignment
        -SubscriptionName 'MyOrganizationSubscriptionName'
        -ResourceGroupName 'MyResourceGroupName'
        -ResourceName 'MyOrganizationImmersiveReader'
        -AADAppIdentifierUri 'https://MyOrganizationImmersiveReaderAADApp'
    
    Parámetro Comentarios
    SubscriptionName Nombre de la suscripción de Azure.
    ResourceGroupName El nombre del grupo de recursos que contiene el recurso de Immersive Reader.
    nombreDelRecurso Nombre del recurso de Immersive Reader.
    AADAppIdentifierUri El URI de la aplicación Microsoft Entra.

Paso siguiente