Compartilhar 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 a Leitura Avançada. Aconselhamos que você altere as permissões em seus recursos de Leitura Avançada.

Tela de fundo

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

Durante uma auditoria de segurança, foi descoberto 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 de Leitura Avançada envolvem o uso desse token de acesso do Microsoft Entra em aplicativos Web cliente e navegadores. Se o token de acesso foi roubado por um ator ou invasor incorreto, há uma preocupação de que esse token de acesso possa ser usado para list keys para o recurso Leitura Avançada. Se um invasor puder list keys para seu recurso, ele obterá Subscription Key para o recurso. O Subscription Key para seu recurso é usado como um mecanismo de autenticação e é considerado um segredo. Se um invasor tiver Subscription Key do recurso, ele permitirá que ele faça chamadas de API válidas e autenticadas para o ponto de extremidade de recurso do Leitura Avançada, o que pode levar à negação de serviço devido ao aumento do uso e da interrupção no ponto de extremidade. Ele também permitiria o uso não autorizado do recurso de Leitura Avançada, o que levaria a um aumento de encargos em sua fatura.

Na prática, no entanto, esse ataque ou exploração provavelmente não ocorrerá ou talvez nem seja possível. Para cenários de Leitura Avançada, os clientes obtêm tokens de acesso do Microsoft Entra com uma audiência de https://cognitiveservices.azure.com. Para que list keys seja bem-sucedido para seu recurso, o token de acesso do Microsoft Entra precisaria ter uma audiência de https://management.azure.com. Em termos gerais, isso não é muito importante, pois os tokens de acesso usados para cenários de Leitura Avançada não funcionariam para list keys, pois eles não têm o público-alvo necessário. Para alterar a audiência no token de acesso, um invasor teria que roubar o código de aquisição de token e alterar a audiência antes que a chamada fosse feita ao Microsoft Entra ID para adquirir o token. Novamente, não é provável que isso seja explorado porque, como melhor prática de autenticação da Leitura Avançada, recomendamos que os clientes criem tokens de acesso do Microsoft Entra no back-end do aplicativo Web, e não no cliente ou no navegador. Nesses casos, como a aquisição de token ocorre no serviço de back-back, não é tão provável ou talvez até mesmo possível que um invasor possa comprometer esse processo e alterar o público-alvo.

A verdadeira preocupação surge quando ou se algum cliente adquirir tokens do Microsoft Entra ID diretamente no código do cliente. Recomendamos isso fortemente, mas como os clientes são livres para implementar conforme for apropriado, é possível que alguns deles estejam fazendo isso.

Para atenuar as preocupações sobre qualquer possibilidade de usar o token de acesso do Microsoft Entra para list keys, criamos uma nova função do Azure interno 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 acontece com a função Cognitive Services User. Essa nova função é específica para Leitura Avançada e permite apenas chamadas para APIs de Leitura Avançada.

Aconselhamos TODOS os clientes a usar a nova função Cognitive Services Immersive Reader User em vez da função Cognitive Services User original. 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.

Essa recomendação se aplica a TODOS os clientes, para garantir que essa vulnerabilidade seja corrigida para todos, independentemente do cenário de implementação ou da probabilidade de ataque.

Se você NÃO fizer isso, nada será pausado. A função antiga continuará a funcionar. O impacto de segurança para a maioria dos clientes é mínimo. No entanto, aconselhamos que você migre para a nova função para atenuar as preocupações de segurança discutidas. Aplicar essa atualização é uma recomendação de consultoria de segurança; não é uma ordem.

Todos os novos recursos de Leitura Avançada que você criar com nosso script em Como: criar um recurso Leitura Avançada usarão automaticamente a nova função.

Atualizar a função e girar as chaves de assinatura

Se você criou e configurou um recurso de leitura avançada usando as instruções em Como: criar um recurso de leitura avançada antes de fevereiro de 2022, recomendamos que você execute a operação a seguir para atualizar as permissões de atribuição de função em TODOS os seus recursos de Leitura Avançada. 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. Isso ocorre caso as chaves tenham sido comprometidas pela exploração, e alguém está, na verdade, usando o recurso com autenticação de chave de assinatura sem o seu consentimento. A rotação das chaves renderiza as chaves anteriores inválidas e nega qualquer acesso adicional. Para os clientes que usam a autenticação do Microsoft Entra, que devem ser todos de acordo com a implementação atual do SDK da Leitura Avançada, a rotação das chaves não afeta o serviço da Leitura Avançada, pois 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 outra precaução.

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

Captura de tela do portal do Azure mostrando um recurso de Leitura Avançada com a seção Chaves e Ponto de Extremidade selecionada, que mostra os botões Regenerar Chaves na parte superior.

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

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

  2. Copie e cole o seguinte snippet 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 espaços reservados <PARAMETER_VALUES> 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 é semelhante ao seguinte. Aqui, colocamos cada parâmetro em uma linha própria para maior clareza, para que você possa ver todo o comando. Não copie ou use esse comando no momento. Copie e use o comando acima com seus próprios valores. Este exemplo tem valores fictícios para os <PARAMETER_VALUES>. O seu será diferente, conforme você criar 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 seu recurso de Leitura Avançada.
    ResourceName O nome do recurso de Leitura Avançada.
    AADAppIdentifierUri O URI do seu aplicativo do Microsoft Entra.

Próxima etapa