※本記事は、https://www.secureworks.com/ で公開されている AZURE REDIRECT URI TAKEOVER VULNERABILITY を翻訳したもので、 2024年3月28日執筆時点の見解となります。
概要
Secureworks® Counter Threat Unit™(CTU)リサーチャーは、Azureのマルチテナントアプリケーションの脆弱性を発見しました。この脆弱性は、アプリケーションのリダイレクトURI(応答URLとも呼ばれる)に、アプリケーションには登録されているがAzureリソースには登録されていないサブドメインエントリーが含まれている場合に問題となります。リダイレクトURIのエンドポイントは認可コードフロー処理を容易にするために使用されますが、攻撃者によって、ユーザーの認証コードとIDトークンを窃取するために悪用される可能性があります。これらの情報を窃取した攻撃者は、認可コードを使用して被害ユーザーの権限でアクセストークンを取得し、そのユーザーのアカウントになりすましてマルチテナントアプリケーションとバックエンドのAzure APIにアクセスします。CTU™リサーチャーは、管理者が自組織のアプリケーション内にこの脆弱性が存在するか確認ためのコードを開発しました。
OAuth 2.0認可コードフロー
OAuth 2.0認可コードフローは、クライアントアプリケーションがWeb APIなどの保護されたリソースにアクセスするための認可を取得する際に使用されます(図1を参照)。
図1. OAuth 2.0認可コードフロー(出典:https://learn.microsoft.com/en-us/entra/identity-platform/v2-oauth2-auth-code-flow)
- クライアントアプリケーションが、OAuth 2.0によって保護されたリソースサーバーへのアクセスを試みます。
- リソースサーバーがクライアントアプリケーションをIDプロバイダー(Entra IDなど)にリダイレクトします。
- ユーザーが自身の認証情報をIDプロバイダーに提供します。
- IDプロバイダーがユーザーを認証し、クライアントアプリケーションのリダイレクトURIに認可コードを返します。リダイレクトURIは、IDプロバイダーがユーザーを認証した後に(リダイレクトを通じて)認可コードを送信する宛先を定義します。
- クライアントアプリケーションが認可コードをアクセストークンと交換します(リフレッシュトークンも一緒に取得する場合もあります)。
- クライアントアプリケーションが、保護されたリソースにアクセスするためにアクセストークンをリソースサーバーに渡します。
開発シナリオでは、リダイレクトURIの値は通常http://localhostに設定されます。本番環境では、Azureリソース、またはAzureの外部の組織によってホストされているサブドメインに設定します。
サブドメインの乗っ取り
サブドメインの乗っ取りは、攻撃者が標的ドメインのサブドメインに対する制御を取得することで発生します。Azureなどのサービスの更新を忘れた、またはサービスプロバイダーを変更したなどの理由で、組織がサブドメインに対する制御を失った場合、サブドメインの乗っ取りによる侵害を受けるリスクが高まります。
攻撃者は、組織が管理しなくなったものの、依然として組織の評判とリンクしているサブドメインにて悪性コンテンツを公開する可能性があります。また、攻撃者は乗っ取ったサブドメインを悪用して被害組織の従業員や顧客にフィッシングを仕掛ける場合もあります。このサブドメインは乗っ取られる前は正当なものであったため、受信者が悪性メールに変質していることに気付くのは困難です。
リダイレクトURIの乗っ取り
Azureサービスには、Microsoftが所有するドメインのサブドメインをユーザー組織が作成できるタイプのサービスが多数あります。Azure App Serviceでは、ユーザー組織は 「azurewebsites.com」ドメイン内の一意のサブドメインを使用するWebアプリケーションを作成できます。組織がサブドメインを作成できる他のサービスには、Azure Traffic ManagerプロファイルやMicrosoft Power BIなどがあります。
組織がアプリケーションを作成し、そのアプリケーションがOAuth 2.0認可コードフローで使用される場合、リダイレクトURIが有効であり、それを組織が所有しているという状態を常に維持する必要があります。しかし場合によっては、Azureアプリケーションが属するリソースグループが削除されたなどの理由で、組織のサブドメインに対する制御が失われている事態が生じることがあります。そのような状態では、攻撃者は組織の未所有リダイレクトURIを、攻撃者の用意したAzureリソースに登録できます。このAzureリソースに被害ユーザーの認可コードを窃取するコードを設置し、窃取した認可コードを使用することで、攻撃者は被害ユーザーになりすましてアクセストークンとリフレッシュトークンを取得します。また、そのマルチテナントアプリケーションを攻撃者のテナントに登録することで、動作確認を行うことも可能です。
組織のリダイレクトURIの制御を取得できれば、攻撃者は以下のような攻撃を実行できるようになります。
- 攻撃者は、標的組織の従業員にフィッシングリンクを送信します。このリンクは、redirect_uriパラメーターまたはreplyUrlパラメーターに侵害されたリダイレクトURIが含まれる、MicrosoftのURLです。
- 従業員がリンクをクリックすると、Azureへのログインを求められます(図2を参照)。
図2. ユーザー認証情報の入力を求めるプロンプト(出典:Secureworks) - この従業員がAzureにログインしても問題やエラーは表示されませんが、攻撃者はアクセストークンと交換する従業員の認可コード(図3を参照)の窃取に成功しています。
図3. 窃取された認可コード(Source:Secureworks)
未所有のリダイレクトURIの検知
以下のプロセスで、組織における未登録のリダイレクトURIを検知できます。
- 組織が所有するマルチテナントアプリケーションを特定します。
- 特定したアプリケーションの各々のリダイレクトURIをダンプします。
- URLスキームとポートを削除して、リダイレクトURIの完全修飾ドメイン名(FQDN)のみを保持します。
- 各FQDNのDNS Aレコード検索を実行して、DNSレコードが欠落しているFQDNがあるか判断します。DNSレコードが関連付けられていないFQDNは、攻撃者の主な標的となります。
CTUリサーチャーは、組織が未所有のリダイレクトURIを特定できるように、Linux用Azure CLIを利用する以下のbashスクリプトを作成しました。
#!/bin/bash # Set your organization's tenant ID tenantId="<Your Tenant ID>" # Function to strip URL scheme and port from FQDN strip_scheme_and_port() { local fqdn=$1 echo "$fqdn" | sed -e 's|^[^/]*//||' -e 's|:[^/]*$||' } # Function to print in green color print_green() { echo -e "\e[32m$1\e[0m" } # Get all multi-tenant applications owned by your organization apps=$(az ad app list --query "[?appRoles && (publicClient || identifierUris) && ownerId=='$tenantId']" --output json) # Extract and perform DNS A record lookup for each application echo "Performing DNS A record lookup for multi-tenant applications:" echo for row in $(echo "${apps}" | jq -c '.[]'); do appId=$(echo "${row}" | jq -r '.appId') replyUrls=$(echo "${row}" | jq -r '.replyUrls[]') echo "Application ID:${appId}" echo "Original ReplyUrls:${replyUrls}" # Strip URL scheme and port from each replyUrl for url in $replyUrls; do stripped_url=$(strip_scheme_and_port "$url") echo "Stripped URL:${stripped_url}" # Perform DNS A record lookup using host command if host "$stripped_url" >/dev/null 2>&1; then echo "DNS record found for $stripped_url." else # Print message in green for unregistered URLs print_green "[ + ] Unregistered URL Found:$stripped_url" fi echo done echo done
未登録である可能性のあるリダイレクトURIをすべて特定できたら、Azureリソースにアクセスしてこれらのサブドメインを登録し、攻撃者が悪用できないようにする必要があります。以下に挙げるルートドメインには、未登録のリダイレクトURIが多く見られます。
- ルートドメインがazurewebsites.comの場合、AzureリソースはAzure App Serviceです。未所有である可能性のあるリダイレクトURIをすべて特定できたら、Azureリソースにアクセスしてこれらのサブドメインを登録し、攻撃者が悪用できないようにする必要があります。
- ルートドメインがtrafficmanager.comの場合、AzureリソースはTraffic Managerプロファイルです。
結論
リダイレクトURIの乗っ取りは、サブドメインの乗っ取りの一種です。違いは、リダイレクトURIの乗っ取りの場合、攻撃者がアクセストークンとリフレッシュトークンを取得し、組織内のユーザーになりすましてテナント内でアクションを実行できる可能性があることです。アプリケーションのリダイレクトURIを確認し、未所有のサブドメインを取得することで、この種の攻撃を防ぐ可能性が高くなります。