技術 約4分で読めます

Azure Entra IDサインインログを未記録のまま認証する4つの手口をTrustedSecが公開

TrustedSec が Azure Entra ID のサインインログを完全にバイパスする4つの脆弱性を公開した。いずれも ROPC(Resource Owner Password Credentials)フローを標的にしており、根本原因は Azure 側のログ書き込みに使われている SQL インフラのカラムオーバーフローだと TrustedSec は推測している。

ROPC フローとは、ユーザー名とパスワードを直接 POST して OAuth2 アクセストークンを取得する認証フローで、レガシーシステムとの互換性のために残されている。現代のセキュリティガイドラインでは非推奨とされているが、エンタープライズ環境では依然として残っていることが多い。

4つの手口

TrustedSec が 2023〜2025 年にかけて発見した4つのバイパス手法を時系列で示す。

名称報告日修正日有効トークン発行手法の概要
GraphNinja2023年8月2024年5月なし別テナントIDを認証エンドポイントに指定
GraphGhost2024年12月2025年4月なしログオンパラメータに無効値を送信して認証後処理を失敗させる
GraphGoblin2025年9月26日2025年11月21日ありscope パラメータを約35,000回繰り返してSQLカラムをオーバーフロー
Graph******2025年9月28日2025年10月8日ありUser-Agent を5万文字以上にしてSQLカラムをオーバーフロー

GraphNinja と GraphGhost はトークンを発行しないが、GraphGoblin と Graph****** は有効なアクセストークンを発行しながらサインインログには一切記録されない。4件目の名称は著者が意図的に伏せており、Microsoft が正式報告前に修正してしまったため通常の開示プロセスを経ていない。

GraphGoblin の技術詳細

CVSS v3.1: 7.5(High)、CVSS v4.0: 8.7。CVE番号は非公開。

flowchart TD
    A[攻撃者] -->|ROPC POST<br/>scope × 35000回繰り返し| B[login.microsoftonline.com]
    B --> C{認証処理}
    C -->|認証成功| D[アクセストークン発行]
    C -->|ログ書き込み試行| E[SQLカラムオーバーフロー]
    E -->|書き込み失敗| F[サインインログ: 記録なし]
    D --> G[攻撃者がトークン取得]
    F --> H[SOC/SIEM: アラートなし]

攻撃は curl で再現できる。

curl -X POST "https://login.microsoftonline.com/${TENANT_ID}/oauth2/v2.0/token" \
  --data-urlencode "scope=$(for num in {1..10000}; do echo -n 'openid ';done)"

scope パラメータに openid を約1万〜3.5万回連結した文字列を送ることで、Azure のログ書き込み用 SQL カラムをオーバーフローさせる。認証自体は正常に完了してトークンが返ってくるが、ログ書き込みフェーズが失敗するため Entra ID のサインインログには何も残らない。

Graph****** の手法

こちらは User-Agent ヘッダーに5万文字以上の文字列を指定する。同じ ROPC エンドポイントを対象にしており、User-Agent フィールドのカラムをオーバーフローさせることでログ書き込みを回避する。Microsoft はこの脆弱性を TrustedSec の正式報告前に修正しており、バウンティプログラムを通じた開示プロセスは踏んでいない。

検出方法

通常のサインインログには記録されないため、検出には Microsoft E5 ライセンスが必要な Microsoft Graph Activity Logs を使う必要がある。TrustedSec が公開した KQL クエリは、Graph Activity Logs とすべてのサインインログを左外部結合し、対応するサインインログが存在しないトークン発行を検出する。

MicrosoftGraphActivityLogs
| where TimeGenerated > ago(8d)
| join kind=leftanti (union isfuzzy=true
    SigninLogs,
    AADNonInteractiveUserSignInLogs,
    AADServicePrincipalSignInLogs,
    AADManagedIdentitySignInLogs,
    MicrosoftServicePrincipalSignInLogs
    | where TimeGenerated > ago(90d)
    | summarize arg_max(TimeGenerated, *) by UniqueTokenIdentifier
)
on $left.SignInActivityId == $right.UniqueTokenIdentifier

左外部結合のキーは SignInActivityId(Graph Activity Logs 側)と UniqueTokenIdentifier(サインインログ側)。対応レコードが見つからないエントリがバイパスを示す。

Microsoft の対応と問題点

GraphGoblin は有効なトークンを発行しながらログに残らないにもかかわらず、Microsoft は「Moderate」に分類しバウンティ対象から外した。TrustedSec はこの判断に異議を唱えており、数千組織の侵入検知が機能しなくなるリスクを重大視している。

4件すべて修正済みだが、同種の手法がまだ残っていてもおかしくない。現状できる対策は、ROPC フローを停止できるなら停止することと、E5 環境での Graph Activity Logs 監視の整備に限られる。