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つのバイパス手法を時系列で示す。
| 名称 | 報告日 | 修正日 | 有効トークン発行 | 手法の概要 |
|---|---|---|---|---|
| GraphNinja | 2023年8月 | 2024年5月 | なし | 別テナントIDを認証エンドポイントに指定 |
| GraphGhost | 2024年12月 | 2025年4月 | なし | ログオンパラメータに無効値を送信して認証後処理を失敗させる |
| GraphGoblin | 2025年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 監視の整備に限られる。