Partilhar via


Comunicado de segurança: Atualizar atribuição de função para autenticação do Microsoft Entra

Foi descoberto um bug de segurança que afeta a autenticação do Microsoft Entra para o Immersive Reader. Recomendamos que você altere as permissões em seus recursos do Immersive Reader.

Fundo

Quando você cria inicialmente seus recursos do Leitor Imersivo e os configura para autenticação do Microsoft Entra, é necessário conceder permissões para a identidade do aplicativo Microsoft Entra para acessar seu recurso Leitor Imersivo. Isso é conhecido como uma atribuição de função. A função do Azure que era usada anteriormente para permissões era a função Usuário dos Serviços Cognitivos.

Durante uma auditoria de segurança, descobriu-se que essa função de Usuário de Serviços Cognitivos tem permissões para listar chaves. Isso é um pouco preocupante porque as integrações do Immersive Reader envolvem o uso desse token de acesso do Microsoft Entra em aplicativos Web e navegadores cliente. Se o token de acesso foi roubado por um agente ou atacante mal-intencionado, há uma preocupação de que esse token de acesso possa ser usado para list keys o seu recurso Immersive Reader. Se um invasor pudesse list keys para o seu recurso, ele obteria o para o Subscription Key seu recurso. O Subscription Key para o seu recurso é usado como um mecanismo de autenticação e é considerado um segredo. Se um invasor tivesse o recurso , ele permitiria que ele fizesse chamadas de API válidas Subscription Keye autenticadas para seu ponto de extremidade de recurso do Leitor Imersivo, o que poderia levar à Negação de Serviço devido ao aumento do uso e da limitação no seu endpoint. Também permitiria o uso não autorizado do seu recurso Immersive Reader, o que levaria a um aumento das cobranças na sua fatura.

Na prática, no entanto, esse ataque ou exploração não é provável que ocorra ou nem seja possível. Para cenários de Leitor Imersivo, os clientes obtêm tokens de acesso do Microsoft Entra com um público de https://cognitiveservices.azure.com. Para obter êxito list keys para o seu recurso, o token de acesso do Microsoft Entra precisa ter um público de https://management.azure.com. De um modo geral, isso não é uma grande preocupação, uma vez que os tokens de acesso usados para cenários de Leitor Imersivo não funcionariam para list keys, pois não têm o público necessário. Para alterar a audiência no token de acesso, um invasor teria que sequestrar o código de aquisição do token e alterar a audiência antes que a chamada seja feita para o Microsoft Entra ID para adquirir o token. Novamente, isso provavelmente não será explorado porque, como uma prática recomendada de autenticação do Immersive Reader, recomendamos que os clientes criem tokens de acesso do Microsoft Entra no back-end do aplicativo Web, não no cliente ou navegador. Nesses casos, como a aquisição do token acontece no serviço de back-end, não é tão provável ou talvez até possível que um invasor possa comprometer esse processo e alterar o público.

A verdadeira preocupação vem quando ou se algum cliente adquirir tokens do Microsoft Entra ID diretamente no código do cliente. Nós desaconselhamos fortemente isso, mas como os clientes são livres para implementar como acharem melhor, é possível que alguns clientes estejam fazendo isso.

Para mitigar as preocupações sobre qualquer possibilidade de usar o token de acesso do Microsoft Entra para , list keyscriamos uma nova função interna do Azure chamada Cognitive Services Immersive Reader User que não tem as permissões para list keys. Essa nova função não é uma função compartilhada para a plataforma de serviços de IA do Azure como Cognitive Services User a função. Esta nova função é específica do Immersive Reader e só permite chamadas para APIs do Immersive Reader.

Aconselhamos TODOS os clientes a usar a nova Cognitive Services Immersive Reader User função em vez da função original Cognitive Services User . Fornecemos um script abaixo que você pode executar em cada um dos seus recursos para alternar as permissões de atribuição de função.

Esta recomendação aplica-se a TODOS os clientes, para garantir que esta vulnerabilidade é corrigida para todos, independentemente do cenário de implementação ou probabilidade de ataque.

Se você NÃO fizer isso, nada vai quebrar. A antiga função continuará a funcionar. O impacto na segurança para a maioria dos clientes é mínimo. No entanto, recomendamos que você migre para a nova função para mitigar as preocupações de segurança discutidas. A aplicação desta atualização é uma recomendação de aviso de segurança; não é um mandato.

Todos os novos recursos do Leitor Imersivo que você criar com nosso script em Como: Criar um recurso de Leitor Imersivo usam automaticamente a nova função.

Atualize a função e alterne as chaves de assinatura

Se você criou e configurou um recurso de Leitor Imersivo usando as instruções em Como: Criar um recurso de Leitor Imersivo antes de fevereiro de 2022, recomendamos que execute a seguinte operação para atualizar as permissões de atribuição de função em TODOS os seus recursos de Leitor Imersivo. A operação envolve a execução de um script para atualizar a atribuição de função em um único recurso. Se você tiver vários recursos, execute esse script várias vezes, uma vez para cada recurso.

Depois de atualizar a função usando o script a seguir, também recomendamos que você gire as chaves de assinatura em seu recurso. Isto no caso de as suas chaves terem sido comprometidas pela exploração e alguém estar realmente a utilizar o seu recurso com autenticação de chave de subscrição sem o seu consentimento. Girar as chaves torna as chaves anteriores inválidas e nega qualquer acesso adicional. Para clientes que usam a autenticação do Microsoft Entra, que deve ser todos por implementação atual do SDK do Leitor Imersivo, girar as chaves não tem efeito sobre o serviço Leitor Imersivo, já que os tokens de acesso do Microsoft Entra são usados para autenticação, não a chave de assinatura. Girar as chaves de assinatura é apenas mais um cuidado.

Você pode girar as chaves de assinatura no portal do Azure. Navegue até o recurso e, em seguida, até a Keys and Endpoint seção. Na parte superior, há botões para Regenerate Key1 e 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.

Usar o Azure PowerShell para atualizar sua atribuição de função

  1. Comece abrindo o Azure Cloud Shell. Verifique se o Cloud Shell está definido como PowerShell no menu suspenso superior esquerdo ou digitando pwsh.

  2. Copie e cole o seguinte trecho de código no 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. Execute a função Update-ImmersiveReaderRoleAssignment, substituindo os <PARAMETER_VALUES> espaços reservados por seus próprios valores, conforme apropriado.

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

    O comando completo se parece com o seguinte. Aqui colocamos cada parâmetro em sua própria linha para clareza, para que você possa ver todo o comando. Não copie nem use este comando no estado em que se encontra. Copie e use o comando com seus próprios valores. Este exemplo tem valores fictícios para o <PARAMETER_VALUES>. O seu será diferente, pois você cria seus próprios nomes para esses valores.

    Update-ImmersiveReaderRoleAssignment
        -SubscriptionName 'MyOrganizationSubscriptionName'
        -ResourceGroupName 'MyResourceGroupName'
        -ResourceName 'MyOrganizationImmersiveReader'
        -AADAppIdentifierUri 'https://MyOrganizationImmersiveReaderAADApp'
    
    Parâmetro Comentários
    SubscriptionName O nome da sua assinatura do Azure.
    ResourceGroupName O nome do grupo de recursos que contém o recurso Leitor Imersivo.
    ResourceName O nome do seu recurso Immersive Reader.
    AADAppIdentifierUri O URI do seu aplicativo Microsoft Entra.

Próximo passo