21年挖的对象存储漏洞到现在结束了吗?
字数 1477 2025-08-29 08:30:19

云对象存储response-*参数漏洞分析与防御指南

一、漏洞概述

2021年发现的云对象存储response-*参数漏洞是一个影响几乎所有主流云厂商对象存储服务的安全问题。该漏洞允许攻击者通过修改对象返回的HTTP头(特别是response-content-type)来改变对象的行为方式,最严重的利用场景是可造成跨站脚本攻击(XSS)。

二、漏洞演变历程

2.1 初始阶段:匿名修改response-*

漏洞表现

  • 最初发现时,攻击者无需任何认证即可直接在URL中增加response-*参数
  • 例如:?response-content-type=text/html可将原本是文本文件的对象以HTML格式返回
  • 腾讯云文档中曾明确展示此特性(修改response-content-typeapplication/octet-stream

修复措施

  • 云厂商禁止了匿名(未签名)GET请求中使用response-*参数
  • 未签名请求包含这些参数时返回400错误

2.2 绕过方式:通过临时密钥签名response-*

利用场景

  • 业务中常见的"客户端直传"模式:服务端生成临时密钥给客户端,客户端直接上传到OSS
  • 临时密钥通常限制了上传路径和content-type等

攻击方法

  1. 上传一个.txt文件(Content-Type为text/plain)
  2. 读取时通过签名URL设置?response-content-type=text/html
  3. 通过CDN域名访问,文件会被浏览器解析为HTML,导致XSS

关键点

  • 攻击者可生成带有?response-content-type=text/html签名的URL
  • 同样可修改response-content-disposition参数

修复方案

  • 使用服务端签名直传而非临时密钥
  • 通过policy严格限制上传参数
  • 参考阿里云服务端签名直传方案

2.3 第三方服务CDN的绕过

新攻击面

  • CDN支持回源OSS并支持私有对象读取
  • 通过CDN特性,无需自行签名即可修改response-*参数

攻击示例

  • 将PDF文件转为EXE文件下载(通过修改response-content-type

云厂商修复

  • 禁止GET请求使用response-content-type参数
  • 仅对历史使用过该参数的bucket保持兼容(需人工申请移除白名单)

三、防御建议

1. 上传策略配置

  • 通过policy严格限制content-type,禁止上传html、svg等危险类型
  • 注意:即使上传时指定了content-type,仍可通过response-content-type修改

2. 权限控制

  • 严格控制桶的读写权限
  • 禁用不必要的列目录权限

3. 域名隔离

  • 使用非业务域(非敏感域)进行CDN服务
  • 通过不同域名限制潜在危害范围

4. 开发规范

  • 严格遵循云厂商安全文档
  • 避免参数拼接不当
  • 避免以高权限(如sys_admin)挂载云存储

四、总结与展望

该漏洞经历了三次主要的攻防对抗:

  1. 匿名访问修复 → 临时密钥绕过
  2. 临时密钥修复 → CDN特性绕过
  3. CDN层面修复 → 历史bucket兼容性问题

由于部分业务仍依赖response-*特性,云厂商未完全禁用该功能,未来可能出现新的利用方式。安全团队应持续关注云存储安全配置,及时应用最新的安全实践。

五、参考资源

  1. 腾讯云GET Object API文档
  2. 阿里云服务端签名直传方案
  3. 阿里云私有对象读取限制
云对象存储response-* 参数漏洞分析与防御指南 一、漏洞概述 2021年发现的云对象存储response-* 参数漏洞是一个影响几乎所有主流云厂商对象存储服务的安全问题。该漏洞允许攻击者通过修改对象返回的HTTP头(特别是 response-content-type )来改变对象的行为方式,最严重的利用场景是可造成跨站脚本攻击(XSS)。 二、漏洞演变历程 2.1 初始阶段:匿名修改response-* 漏洞表现 : 最初发现时,攻击者无需任何认证即可直接在URL中增加 response-* 参数 例如: ?response-content-type=text/html 可将原本是文本文件的对象以HTML格式返回 腾讯云文档中曾明确展示此特性(修改 response-content-type 为 application/octet-stream ) 修复措施 : 云厂商禁止了匿名(未签名)GET请求中使用 response-* 参数 未签名请求包含这些参数时返回400错误 2.2 绕过方式:通过临时密钥签名response-* 利用场景 : 业务中常见的"客户端直传"模式:服务端生成临时密钥给客户端,客户端直接上传到OSS 临时密钥通常限制了上传路径和content-type等 攻击方法 : 上传一个.txt文件(Content-Type为text/plain) 读取时通过签名URL设置 ?response-content-type=text/html 通过CDN域名访问,文件会被浏览器解析为HTML,导致XSS 关键点 : 攻击者可生成带有 ?response-content-type=text/html 签名的URL 同样可修改 response-content-disposition 参数 修复方案 : 使用服务端签名直传而非临时密钥 通过policy严格限制上传参数 参考阿里云服务端签名直传方案 2.3 第三方服务CDN的绕过 新攻击面 : CDN支持回源OSS并支持私有对象读取 通过CDN特性,无需自行签名即可修改 response-* 参数 攻击示例 : 将PDF文件转为EXE文件下载(通过修改 response-content-type ) 云厂商修复 : 禁止GET请求使用 response-content-type 参数 仅对历史使用过该参数的bucket保持兼容(需人工申请移除白名单) 三、防御建议 1. 上传策略配置 通过policy严格限制content-type,禁止上传html、svg等危险类型 注意:即使上传时指定了content-type,仍可通过response-content-type修改 2. 权限控制 严格控制桶的读写权限 禁用不必要的列目录权限 3. 域名隔离 使用非业务域(非敏感域)进行CDN服务 通过不同域名限制潜在危害范围 4. 开发规范 严格遵循云厂商安全文档 避免参数拼接不当 避免以高权限(如sys_ admin)挂载云存储 四、总结与展望 该漏洞经历了三次主要的攻防对抗: 匿名访问修复 → 临时密钥绕过 临时密钥修复 → CDN特性绕过 CDN层面修复 → 历史bucket兼容性问题 由于部分业务仍依赖response-* 特性,云厂商未完全禁用该功能,未来可能出现新的利用方式。安全团队应持续关注云存储安全配置,及时应用最新的安全实践。 五、参考资源 腾讯云GET Object API文档 阿里云服务端签名直传方案 阿里云私有对象读取限制