CVE-2024-4985 漏洞背景与影响范围
GitHub Enterprise Server (GHES) 在 2024 年 5 月发布的安全更新中修复了一个编号为 CVE-2024-4985 的关键身份验证绕过漏洞。该漏洞的 CVSS 评分高达 10.0,属于最高严重级别。漏洞根源在于 GHES 在处理 SAML 单点登录(SSO)请求时,未能正确验证加密断言(Encrypted Assertions)的签名。攻击者利用该漏洞可以伪造 SAML 响应,从而绕过身份验证机制,获取对 GHES 实例的管理员访问权限。由于 GHES 通常部署在企业内部网络或云端的受控环境中,存储着大量的核心代码资产及 CI/CD 配置,该漏洞的潜在威胁极大,可能导致供应链攻击或敏感知识产权泄露。
漏洞主要影响启用了 SAML SSO 且配置了可选的“加密断言”功能的 GHES 实例。在这种配置下,GitHub 在处理来自身份提供者(IdP)的 SAML 响应时存在逻辑缺陷。通过利用 Zondex 等互联网测绘工具,安全研究人员可以识别暴露在公网或特定网段中的 GHES 登录界面,进而通过指纹识别确定其版本是否处于受影响范围内。
| 受影响版本系列 | 受影响版本范围 | 安全修复版本 |
|---|---|---|
| GitHub Enterprise Server 3.13 | < 3.13.0 | 3.13.0 |
| GitHub Enterprise Server 3.12 | < 3.12.4 | 3.12.4 |
| GitHub Enterprise Server 3.11 | < 3.11.10 | 3.11.10 |
| GitHub Enterprise Server 3.10 | < 3.10.12 | 3.10.12 |
| GitHub Enterprise Server 3.9 | < 3.9.15 | 3.9.15 |
SAML 身份验证机制与漏洞成因
在标准的 SAML SSO 流程中,服务提供者(SP,此处为 GHES)接收来自身份提供者(IdP)的 SAMLResponse。该响应通常包含用户的身份信息(Assertions),并由 IdP 的私钥进行签名。为了增强安全性,企业可以选择加密这些断言,确保敏感信息在传输过程中不被泄露。CVE-2024-4985 的核心问题在于 GHES 的 XML 解析器和 SAML 处理引擎在解密断言后,未能强制执行严格的签名验证流程。
具体而言,当 EncryptedAssertion 被使用时,GHES 的身份验证逻辑在某些特定条件下会跳过对 XML 签名的完整性检查。攻击者可以通过构造一个不包含合法 IdP 签名、但符合预期 XML 结构的加密断言包。如果 GHES 无法正确关联解密后的数据与信任锚点(Trust Anchor),它可能会错误地信任断言中的 NameID 或 Attribute 声明。这意味着攻击者只需知道目标用户的用户名或电子邮件,即可通过伪造的 SAML 响应登录为该用户,甚至获取 Site Administrator 权限。
XML 签名包装与解密逻辑缺陷
在 CVE-2024-4985 中,攻击者利用了对 XML 处理库的误用。当 SAML 响应被接收时,系统首先进行解密。然而,解密后的内容在重新进入验证流程时,逻辑上出现了断层。如果攻击者构造了一个看似合法但实际是由非法密钥(或完全没有有效签名)生成的加密元素,GHES 的漏洞逻辑可能会在解密后直接接受其中的声明,而不再追溯该声明是否源自受信任的 IdP 根签名。这种绕过方式绕过了基于非对称加密的信任链,使得 SSO 的安全防护形同虚设。
<!-- 简化版的伪造 SAML 响应结构示例 -->
<samlp:Response xmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol" ID="_faked_id" Version="2.0">
<saml:Issuer xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion">https://idp.attacker.com</saml:Issuer>
<saml:EncryptedAssertion xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion">
<xenc:EncryptedData Type="http://www.w3.org/2001/04/xmlenc#Element" xmlns:xenc="http://www.w3.org/2001/04/xmlenc#">
<!-- 攻击者通过特定手段生成的加密数据,旨在利用 GHES 的解密逻辑漏洞 -->
<xenc:CipherData>
<xenc:CipherValue>BASE64_ENCODED_PAYLOAD</xenc:CipherValue>
</xenc:CipherData>
</xenc:EncryptedData>
</saml:EncryptedAssertion>
</samlp:Response>
漏洞触发条件分析
要成功利用 CVE-2024-4985,必须满足以下几个先决条件:
- SAML SSO 已启用:实例必须配置为通过外部 IdP 进行身份验证,而不是使用内置的用户名/密码。
- 加密断言(Encrypted Assertions)已启用:这是该漏洞触发的关键配置项。该功能本意是增加安全性,但在受影响的版本中反而引入了攻击路径。
- 攻击者拥有网络可达性:攻击者需要能够访问 GHES 的
/login或相关 SSO 回调端点。
在安全审计过程中,研究人员可以使用 Secably 对企业内部的 GHES 实例进行针对性扫描,以检测是否存在此类配置缺陷及版本过旧的问题。由于该漏洞不需要初始权限(Pre-authentication),因此其风险等级被定为最高等级。
技术细节:解密后的二次验证缺失
深入分析 GHES 处理 SAML 的 Ruby 代码(GHES 核心主要基于 Ruby on Rails),可以发现其使用的 ruby-saml 库或其上层的封装代码在处理 EncryptedAssertion 时存在逻辑分支判断错误。正常流程应该是:
- 接收
SAMLResponse。 - 验证
SAMLResponse的顶级签名。 - 如果是加密断言,使用 SP 私钥解密。
- 关键步骤: 验证解密后的
Assertion内部签名。 - 提取用户信息。
此外,由于 GitHub 企业版支持通过管理控制台直接配置 SAML,某些管理员可能在配置时并未强制要求签名,这进一步放大了漏洞的利用空间。然而,即便配置了“强制签名”,由于代码逻辑中的验证路径绕过,防御措施仍然可能失效。
利用场景模拟
在实战渗透测试中,攻击者通常会进行以下操作:
- 通过 Recon 确认目标 GHES 的版本,识别其是否开启了 SAML。
- 分析目标的 IdP 协议格式,构造包含目标管理员
NameID的 SAML 断言。 - 使用特定的加密库(如
xmlsec1)对断言进行包装,确保其符合EncryptedAssertion的语法结构。 - 向 GHES 发送 POST 请求,将伪造的
SAMLResponse发送至/saml/consume端点。 - 如果漏洞利用成功,服务器将返回一个带有
user_sessionCookie 的响应,攻击者随后即可访问管理控制台。
修复建议与防御策略
针对 CVE-2024-4985,GitHub 官方已通过更新补丁彻底修复了 SAML 响应解析逻辑中的缺陷。最直接且有效的修复措施是将 GitHub Enterprise Server 升级到官方发布的最新版本。升级过程不仅修复了身份验证绕过逻辑,还加固了 XML 处理器对恶意结构的解析防御。
临时缓解措施
如果因业务原因无法立即升级,可以考虑以下临时补救措施:
- 禁用加密断言:如果 IdP 和 GHES 之间的通信通过加密通道(如强制 HTTPS/TLS)进行,且安全策略允许,可以暂时在 GHES 管理设置中禁用 SAML 的“Encrypted Assertions”功能。这会切断漏洞触发的必要条件,但会降低断言数据本身的机密性。
- 增强网络限制:通过 IP 白名单严格限制访问 GHES 登录端点的范围,仅允许企业内网或受信任的 VPN 网段访问。
- 监控审计日志:密切关注
auth.log和 SSO 登录日志,寻找异常的登录行为,特别是那些来源不明、且以管理员身份登录的记录。
升级后的版本引入了更严格的断言验证机制。修复后的代码强制要求在解密 EncryptedAssertion 后进行二次签名校验,并确保解密出的 XML 节点与预期的命名空间和父节点属性完全一致。这种深度防御策略有效防止了任何形式的 XML 签名包装攻击(XSW)或逻辑绕过。对于任何依赖 SAML 进行身份认证的企业级软件,CVE-2024-4985 提供了一个重要的警示,即加密并不等同于完整性验证,安全系统必须在每一个处理阶段维持信任链的连续性。