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 Key
e 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 keys
criamos 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
.
Usar o Azure PowerShell para atualizar sua atribuição de função
Comece abrindo o Azure Cloud Shell. Verifique se o Cloud Shell está definido como PowerShell no menu suspenso superior esquerdo ou digitando
pwsh
.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" } }
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.