Azure Entra ID 登录日志是企业安全运营的核心数据源,SIEM 告警、威胁狩猎、入侵检测都依赖于此。安全研究员 Nyxgeek 于 2025 年发现了两种全新的登录日志绕过方法,攻击者可通过发送特殊构造的认证请求,在不留下任何登录痕迹的情况下获取有效令牌。这一发现意味着攻击者可以在管理员毫不知情的情况下完成凭证验证和令牌窃取,严重威胁依赖登录日志进行威胁检测的企业。

GraphGoblin 绕过技术的核心在于 scope 参数的特殊构造。攻击者在 OAuth2 ROPC(资源所有者密码凭证)流程的 scope 字段中重复写入有效值,例如将单一的 "openid" 重复 10,000 次形成 "openid openid openid …" 的超长字符串。该字符串通过了 scope 格式验证(因为每个单独的 scope 值都是合法的),但在写入数据库时溢出了 SQL 列长度限制,导致整条登录记录插入失败并被丢弃,而令牌仍然被正常返回给攻击者。

第二种绕过(文中以 Graph* 代替)更为直接,攻击者仅需在 HTTP 请求的 User-Agent 字段写入约 50,000 字符的超长字符串即可触发相同的日志溢出行为。两种技术的根本原因都是数据库字段长度验证不足 —— 微软在设计日志写入逻辑时未充分考虑边界情况,导致超长输入引发 INSERT 操作失败,记录被静默丢弃而不产生任何告警。

从攻击面来看,任何使用 Azure Entra ID( 原 Azure AD)的组织都受到影响。攻击者仅需知道目标租户的 tenant ID 和一个有效的 Application ID 即可发起攻击,无需事先获取任何特权。这种无差别攻击使得密码喷洒、凭证填充等大规模攻击成为可能,且完全绕过基于登录日志的检测规则。值得注意的是,这两枚漏洞都能返回完整的访问令牌而非仅仅验证密码有效性,使攻击者可直接利用令牌调用 Microsoft Graph API。

对于已修复的漏洞,防御重心转向检测与监控。安全团队可在 Log Analytics 中执行 KQL 查询,对比 MicrosoftGraphActivityLogs 与 SignInLogs 的 SessionId 字段。若某 Graph 活动的 SessionId 在登录日志中无对应记录,则表明该认证请求可能绕过了日志记录。需注意此检测方案要求组织拥有 E5 许可证以启用 Graph 活动日志。

推荐的检测查询使用 leftanti 联接方式找出缺失的登录记录。第一个查询基于更细粒度的 SignInActivityId 与 UniqueTokenIdentifier 进行匹配,适用于减少误报场景;第二个查询基于 SessionId 进行宽匹配,适用于需要更宽松检测的场景。管理员应根据自身环境噪声水平选择合适的查询,并创建 Azure Monitor 告警规则实现自动化通知。

根本原因分析表明,微软在认证流程的日志模块缺乏充分的模糊测试与边界值测试。连续四年(2023 至 2025)发现四起登录日志绕过漏洞,且均涉及简单的参数溢出攻击,这暴露了安全开发流程中的系统性缺陷。建议企业不仅依赖微软的日志记录,还应启用额外的审计手段(如第三方 SIEM 集成、Azure AD 条件访问策略监控),并定期进行基于身份的威胁狩猎。


参考资料

  • TrustedSec: Full Disclosure: A Third and Fourth Azure Sign-In Log Bypass Found
  • CloudBrothers: Detect threats using Microsoft Graph activity logs - Part 2