- 存储
- 分布式文件系统
- 对象存储
- 后端
- 高可用
本篇文章基于 Ceph 官方安全公告 doc/security/CVE-2026-54330.rst 编写,系统讲解 Ceph RGW 的 AWS SigV4 签名验证缺陷:持有预签名 PUT URL 的攻击者可以附加任意x-amz-*请求头,从而获得超出签名者授权的权限。阅读本文后,你将完整理解该漏洞的技术根因(结合 RGW 源码验证逻辑)、CVSS 影响面、受影响与修复版本、修复补丁的源码级实现,以及涉及 multisite 部署时必须遵循的关键升级步骤与rgw_sigv4_insecure配置用法。
漏洞概览
CVE-2026-54330 是 Ceph RGW(RADOS Gateway)SigV4 处理器中一处**密码学签名验证不完善(Improper Verification of Cryptographic Signature)**缺陷:
- 任何持有**预签名 PUT URL(presigned PUT URL)**的人,都可以在请求中附加任意的
x-amz-*请求头; - RGW 会实际应用这些附加头部,从而使攻击者获得超出签名者(URL 签发者)本意的更多能力。
官方公告明确指出,该漏洞的补丁已包含在Tentacle 20.2.4与Squid 19.2.6(及后续版本)中。
技术背景:SigV4 对 x-amz-* 头的签名要求
AWS Signature Version 4(SigV4)的规范对请求头签名有严格要求:请求中出现的每一个x-amz-*头都必须被纳入签名,AWS S3 会直接拒绝携带未签名x-amz-*头的请求。而修复前的 Ceph RGW 行为与 AWS 不一致:
- RGW 只验证出现在
X-Amz-SignedHeaders列表中的头部; - 对列表中未出现的其余头部,RGW 直接忽略,不做签名校验。
这直接导致:未签名的x-amz-*头可以绕过签名检查。攻击者手中只要有一条预签名 PUT URL,就能注入签名者从未授权过的头部,将 URL 的权限放大,对机密性与完整性造成高影响。
这一背景在源码注释中亦有印证。在 src/rgw/rgw_auth_s3.cc 的修复代码中,开发者引用了 AWS IAM 用户指南 "Create a signed AWS API request" 的规定:
host头必须始终签名;- 请求中出现的任何
x-amz-*头都必须签名; content-type等标准头可以选择性签名(AWS 文档自身对该点存在两处矛盾表述,AWS 实际接受未签名的 content-type)。
漏洞根因:RGW 仅校验 SignedHeaders 中列出的头部
修复前的缺陷逻辑可以这样概括:SigV4 校验器从X-Amz-SignedHeaders或查询参数X-Amz-SignedHeaders中取出已声明签名的头部集合,然后只对这些头部做规范化(canonicalization)与签名比对;请求中实际携带的其它头部(尤其是x-amz-*系列)不在该校验范围内,因而可以任意篡改、追加而不破坏签名校验。
从源码结构看,签名头的解析入口分布在 src/rgw/rgw_auth_s3.cc 的三处:
parse_v4_query_string()(约 L286-L326):从查询字符串参数x-amz-signedheaders提取(预签名 URL 场景);parse_v4_auth_header()(约 L396-L439):从Authorization头的SignedHeaders字段提取;- 后续统一交由
get_v4_canonical_headers()(L730 起)按分号拆分的列表逐头处理。
关键点在于:旧逻辑只遍历 SignedHeaders 声明过的头,请求环境中多余的头部从未被核查,这正是 CVE-2026-54330 的根因所在。
攻击场景与影响(CVSS 分解)
官方公告给出的 CVSS 维度分解如下:
| 维度 | 评级 | 说明 |
|---|---|---|
| 机密性(Confidentiality) | 高 | 攻击者可通过注入x-amz-copy-source头并结合 public-read ACL,读取签名者身份可访问的每一个对象 |
| 完整性(Integrity) | 高 | 攻击者可写入、并可篡改预签名 URL 目标对象的 ACL |
| 可用性(Availability) | 无 | 不涉及 |
| 访问复杂度(Access Complexity) | 高 | 攻击者需要附加"选定的、但属任意"的 x-amz-* 头,才能授予超出签名者本意的额外能力 |
| 认证(Authentication) | 部分 | 攻击者需要获得一条预签名 URL |
| 权限获取(Gained Access) | 是 | 攻击者可将权限提升至签名账号被授权的范围,超出最初校验器所允许的边界 |
典型的攻击链为:
- 攻击者获得一条合法的预签名 PUT URL(例如通过日志泄漏、中间人观察或社交工程等方式);
- 在向 RGW 发起请求时,攻击者在 HTTP 请求头中附加
x-amz-copy-source(服务端拷贝源)等任意x-amz-*头; - 由于 RGW 只校验
X-Amz-SignedHeaders中列出的头,这些注入头不会被拒绝; - RGW 将注入头作为真实请求语义应用(如触发跨对象拷贝、修改 ACL),从而把一条"仅可 PUT 指定对象"的 URL 放大为"可读任意对象、可改写目标对象 ACL"的高权限凭据。
受影响与修复版本
- 受影响版本:所有先前的 Ceph RGW SigV4 实现均存在签名验证不完善问题(All prior versions)。
- 修复版本:
- Tentacle 20.2.4(及后续版本)
- Squid 19.2.6(及后续版本)
修复细节:强制校验 host 与全部 x-amz-* 头
根据官方公告的 Fix Details:补丁后的 RGW 会检查任何未被纳入签名的新增x-amz-*头是否出现在 SigV4 请求中;若存在此类未签名头,则直接拒绝该请求。
源码层面的修复位于 src/rgw/rgw_auth_s3.cc 的get_v4_canonical_headers()中,核心逻辑在rgw_sigv4_insecure配置项为false(默认值)时生效:
- 强制
host必须签名:若规范化结果中不包含host,直接返回失败并记录日志"Signature rejected: CanonicalHeaders must contain 'host'."(L788-L792)。 - 枚举请求中所有
HTTP_X_AMZ_开头的环境变量:通过info.env->get_map()与lower_bound("HTTP_X_AMZ_")遍历请求携带的全部x-amz-*头(L815-L837)。 - 单一例外:
x-amz-content-sha256被放行(continue),因为它已作为 HashedPayload 的一部分被签名(L826-L831)。源码注释也提示该例外未来可进一步限定为CredentialScope:service == s3的场景。 - 逐一比对:任何出现在请求中、却不在 CanonicalHeaders 集合里的
x-amz-*头(x-amz-content-sha256除外),都会触发拒绝,日志为"Signature rejected: '' supplied, but not in CanonicalHeaders."(L832-L836)。值得注意的是,修复刻意未强制content-type必须签名。源码注释(L793-L813)解释了两点原因: AWS 文档自相矛盾,而真实 S3 接受 content-type 未签名的请求;
minio-go 的流式签名器(ignoredStreamingHeaders)会在每次 PutObject 时丢弃 content-type,若强制要求会导致 Mimir、Loki、Thanos 等依赖 thanos-io/objstore 生态的客户端大量损坏。由于 CVE-2026-54330 的权限提升源自未签名的x-amz-*头,该部分仍被严格拒绝,因此保留 content-type 例外不会重新打开漏洞。
关键升级步骤:multisite 部署与 rgw_sigv4_insecure
补丁上线后产生了一个重要的兼容性副作用(官方公告 "Critical Upgrade Steps"):RGW 将拒绝host和x-amz-*头未包含在已签名子集中的 SigV4 请求。然而,multisite(多站点)同步所使用的REST 客户端此前正是会生成这类签名不完整的请求(见 src/rgw/rgw_rest_client.cc:x_meta_map中的x-amz-*元数据头会被转换为HTTP_X_AMZ_*环境变量并参与签名,但host等头的处理路径存在兼容性差异)。
因此升级时必须遵循以下顺序:
升级开始前:若你正在运行 multisite,必须先将配置项rgw_sigv4_insecure设置为true;升级所有集群:在所有集群都完成升级后;恢复安全默认:将该选项重新设置为false。该配置项在 src/common/options/rgw.yaml.in 中有完整定义:
类型:bool级别:advanced默认值:false适用服务:rgw标志:runtime(运行时即可生效,无需重启)支持旧式配置名(with_legacy: true),因此也可以沿用旧式rgw_sigv4_insecure = true写法描述:允许在 SigV4 上附加未签名的x-amz-头,从而可能造成权限提升;long_desc 明确提示:multisite 场景下需在所有集群升级完成前保持开启,之后务必关闭。配置示例(升级窗口期使用,multisite 全集群):
[client.rgw.] rgw_sigv4_insecure = true所有集群升级完成后,务必改回:
[client.rgw.] rgw_sigv4_insecure = false由于该选项带runtime标志,可通过ceph config set client.rgw. rgw_sigv4_insecure false方式在线调整并即时生效。
官方建议
公告给出的最终建议非常明确:
所有使用预签名 URL 功能的 Ceph 用户应尽早升级到已修复版本;在未应用补丁的情况下,官方不建议在任何场景下继续使用该功能。
这意味着在补丁就绪前,最稳妥的缓解手段是停用预签名 URL 功能;补丁应用后,再结合rgw_sigv4_insecure的窗口期配置完成 multisite 平滑升级。
回归测试与安全基线保障
仓库中专门新增了针对本漏洞修复的测试文件 src/test/rgw/test_rgw_auth_sigv4.cc,其中测试用例明确标注了两类性质:
[REGRESSION](回归测试):缺少"未签名 content-type 合法"修复时会失败,应用修复后通过——用于防止修复过度(误伤合法客户端)后再次出现兼容性回归,例如UnsignedContentTypeIsAccepted、SignedContentTypeIsCanonicalized、MinioGoStreamingTrailerPutObjectIsAccepted(覆盖 minio-go 流式带 trailer 的 PutObject 请求形态);[INVARIANT](不变式守卫):无论修复前后都通过,仅用于防止未来重构悄悄重新打开 CVE-2026-54330,例如FullySignedRequestIsAccepted(完整签名请求被接受)以及InsecureOptionRestoresOldBehaviour(验证rgw_sigv4_insecure=true恢复修复前行为,multisite 升级依赖此行为,L245-L252)。测试通过get_v4_canonical_headers()直接驱动核心校验函数(L74-L100),覆盖了普通请求与预签名请求(SignedHeaders 仅含host、X-Amz-*参数全部位于查询串)两种形态,其中就包括攻击场景:向预签名请求注入HTTP_X_AMZ_ACL: public-read等未签名头时校验失败(EXPECT_FALSE(canonicalize(...)))。
安全加固清单
针对本漏洞及同类风险,可采取如下加固措施:
立即升级:将 RGW 升级到 Tentacle 20.2.4+ 或 Squid 19.2.6+,并确认rgw_sigv4_insecure处于false(默认值,安全状态)。multisite 升级窗口期管理:严格按照"升级前开启 → 全部集群升级完成 → 关闭"的顺序操作,避免跨版本窗口内同步请求被误拒或长期暴露在非安全配置下。预签名 URL 治理:缩短预签名 URL 有效期、限制签发账号的权限范围、通过日志审计预签名 URL 的签发与使用,降低 URL 泄漏后的影响半径。监控拒绝日志:关注 RGW 日志中Signature rejected类别的记录(dout(5)级别),此类日志可能代表攻击尝试或客户端签名不规范的请求。参考与延伸阅读
官方安全公告原文:doc/security/CVE-2026-54330.rst修复核心实现:src/rgw/rgw_auth_s3.cc(get_v4_canonical_headers())配置项定义:src/common/options/rgw.yaml.in(rgw_sigv4_insecure)回归测试:src/test/rgw/test_rgw_auth_sigv4.ccmultisite REST 客户端签名路径:src/rgw/rgw_rest_client.cc安全公告索引:doc/security/index.rst致谢:该漏洞由 CLYSO 的 David Mohren 与 Mark Nelson 报告。赞分享存储分布式文件系统对象存储后端高可用相关推荐
Ceph RGW STS 会话令牌 CBC 位翻转提权漏洞(CVE-2026-39944)深度剖析与升级指引Ceph RGW STS 会话令牌 CBC 位翻转提权漏洞(CVE 2026 39944)深度剖析与升级指引 CVE 2026 39944 是 Ceph 对象网
Ceph RGW CVE-2021-3524 漏洞深度解析:CORS ExposeHeader 引发的 HTTP 响应头注入与修复验证Ceph RGW CVE 2021 3524 漏洞深度解析:CORS ExposeHeader 引发的 HTTP 响应头注入与修复验证 导读 CVE 2021
N_m3u8DL-RE 源码编译:3 条命令拿到任意平台的可执行文件N_m3u8DL RE 源码编译:3 条命令拿到任意平台的可执行文件 N_m3u8DL RE 源码编译就是为这个场景准备的:官方 Release 版本落后于代码
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考