注意

本文档适用于 Ceph 的开发版本。

CVE-2021-20288:cephx 中的未经授权的 global_id 重用

总结

Ceph 没有确保重新连接/续订的客户端在要求其 global_id 值时出示现有票证。能够进行身份验证的攻击者可以声明另一个客户端正在使用的 global_id,并可能干扰其他集群服务。

背景

Ceph 中每个经过身份验证的客户端或守护程序都被分配一个数字 global_id 标识符。该值假定在整个集群中是唯一的。当客户端重新连接到监视器(例如,由于网络断开)或续订其票证时,它们应该出示旧票证以证明先前拥有其 global_id,以便可以将其收回,从而在该客户端实例的生命周期内保持不变。

Ceph 没有正确检查旧票证是否有效,允许收回任意 global_id,即使该 global_id 正在被系统中的另一个活动客户端使用。

攻击者要求

任何潜在的攻击者必须

  • 拥有集群的有效身份验证密钥

  • 知道或猜测另一个客户端的 global_id

  • 运行修改后的 Ceph 客户端代码以收回另一个客户端的 global_id

  • 构造适当的客户端消息或请求以中断服务或利用 Ceph 守护程序关于 global_id 唯一性的假设

影响

保密性影响

None

完整性影响

部分。攻击者可能利用围绕 global_id 唯一性的假设来干扰其他客户端的访问或干扰 Ceph 守护程序。

可用性影响

高。攻击者可能利用围绕 global_id 唯一性的假设来干扰其他客户端的访问或干扰 Ceph 守护程序。

访问复杂性

高。客户端必须使用修改后的客户端代码才能利用其他 Ceph 守护程序行为中的特定假设。

认证

是。攻击者还必须经过身份验证,并且可以访问与它希望冒充或干扰的客户端相同的服务。

获得访问权限

部分。攻击者可以部分冒充另一个客户端。

受影响的版本

所有先前版本的 Ceph 监视器都未能确保 global_id 收回尝试是真实的。

此外,从 Luminous v12.2.0 开始的所有用户空间守护程序和客户端在提交 a2eb6ae3fb57 (“mon/monclient: hunt for multiple monitor in parallel”) 之后都未能安全地收回其 global_id。

所有版本的 Linux 内核客户端都正确进行身份验证。

已修复版本

  • Pacific v16.2.1(及更高版本)

  • Octopus v15.2.11(及更高版本)

  • Nautilus v14.2.20(及更高版本)

修复详情

  1. auth_allow_insecure_global_id_reclaim 设置为 false 时,打过补丁的监视器现在正确要求客户端安全地收回其 global_id。最初,默认情况下,此选项设置为 true,以便现有客户端可以继续运行而不会中断,直到所有客户端都升级。当此选项设置为 false 时,未打补丁的客户端在因间歇性网络中断导致其与监视器的连接断开后,将无法重新连接到集群,也无法在超时后(默认情况下为 72 小时)续订其身份验证票证。

    如果启用了 auth_allow_insecure_global_id_reclaim,则打过补丁的监视器会发出 AUTH_INSECURE_GLOBAL_ID_RECLAIM_ALLOWED 运行状况警报。可以使用以下命令静音此运行状况警报

    ceph health mute AUTH_INSECURE_GLOBAL_ID_RECLAIM_ALLOWED 1w
    

    尽管不推荐,但也可以使用以下命令禁用警报

    ceph config set mon mon_warn_on_insecure_global_id_reclaim_allowed false
    
  2. 打过补丁的监视器可以在新客户端通过身份验证后立即断开它们的连接(强制它们重新连接并收回),以确定它们是否安全地收回 global_id。这允许集群和用户快速发现客户端是否会受到要求安全 global_id 收回的影响:大多数客户端会立即报告身份验证错误。可以通过将 auth_expose_insecure_global_id_reclaim 设置为 false 来禁用此行为

    ceph config set mon auth_expose_insecure_global_id_reclaim false
    
  3. 打过补丁的监视器将对任何未安全收回其 global_id 的客户端或守护程序发出 AUTH_INSECURE_GLOBAL_ID_RECLAIM 运行状况警报。在禁用 auth_allow_insecure_global_id_reclaim 选项之前,应升级这些客户端,以避免中断客户端访问。

    默认情况下(如果未禁用 auth_expose_insecure_global_id_reclaim),客户端未能安全收回 global_id 将立即暴露并触发此运行状况警报。但是,如果已禁用 auth_expose_insecure_global_id_reclaim,则只有当客户端被迫重新连接到监视器(例如,由于网络中断)或客户端续订其身份验证票证(默认情况下为 72 小时)时,才会为客户端触发此警报。

  4. 身份验证票证的默认生存时间 (TTL) 已从 12 小时增加到 72 小时。由于我们以前没有确保客户端的旧票证在收回其 global_id 时有效,因此客户端可以容忍持续时间超过票证 TTL 的网络中断,并且仍然收回其 global_id。一旦集群开始要求安全 global_id 收回,断开连接时间超过 TTL 的客户端可能无法收回其 global_id,无法重新进行身份验证,并且在重新启动之前无法继续与集群通信。增加默认 TTL 是为了尽量减少此更改对用户的影响。

建议

  1. 用户应尽早升级到打过补丁的 Ceph 版本。

  2. 用户应尽早升级所有未打补丁的客户端。默认情况下,可以通过检查 ceph health detail 输出中是否存在 AUTH_INSECURE_GLOBAL_ID_RECLAIM 警报来轻松识别这些客户端。

  3. 如果无法立即升级所有客户端,则可以使用以下命令暂时静音运行状况警报

    ceph health mute AUTH_INSECURE_GLOBAL_ID_RECLAIM 1w  # 1 week
    ceph health mute AUTH_INSECURE_GLOBAL_ID_RECLAIM_ALLOWED 1w  # 1 week
    
  4. 在所有客户端都更新完毕且 AUTH_INSECURE_GLOBAL_ID_RECLAIM 警报不再出现后,应使用以下命令设置集群以防止不安全的 global_id 收回

    ceph config set mon auth_allow_insecure_global_id_reclaim false
    

由 Ceph 基金会为您呈现

Ceph 文档是由非营利性 Ceph 基金会 资助和托管的社区资源。如果您希望支持这项工作和我们的其他努力,请考虑 立即加入