前言
云存储是一个以数据存储和管理为核心的云计算系统,给我们提供了一种全新的数据信息存储模式。尽管云存储的安全问题稍有改善,但由于云存储自身的特点,决定了它在现有的技术方面存在一些安全风险,一旦云存储的安全防线被攻破,其中存储的数据将会被泄露。
云存储简介
a.对象存储(也叫作云存储)
对象存储(Object-Based Storage),也可以叫做面向对象的存储,现在也有不少厂商直接把它叫做云存储。说到对象存储就不得不提Amazon,Amazon S3 (Simple Storage Service) 简单存储服务,是 Amazon 的公开云存储服务,与之对应的协议被称为 S3 协议,目前 S3 协议已经被视为公认的行业标准协议,因此目前国内主流的对象存储厂商基本上都会支持 S3 协议。在 Amazon S3 标准下中,对象存储中可以有多个桶(Bucket),然后把对象(Object)放在桶里,对象又包含了三个部分:Key、Data 和 Metadata。
* Key 是指存储桶中的唯一标识符,例如一个 URL 为:https://teamssix.s3.ap-northeast-2.amazonaws.com/flag,这里的 teamssix 是存储桶 Bucket 的名称,/flag 就是 Key
* Data 就很容易理解,就是存储的数据本体
b.存储空间(Bucket)
存储空间是用户用于存储对象(Object)的容器,所有的对象都必须隶属于某个存储空间。存储空间具有各种配置属性,包括地域、访问权限、存储类型等。用户可以根据实际需求,创建不同类型的存储空间来存储不同的数据。
c.对象(Object)
对象是OSS存储数据的基本单元,也被称为OSS的文件。和传统的文件系统不同,对象没有文件目录层级结构的关系。对象由元信息(Object Meta),用户数据(Data)和文件名(Key)组成,并且由存储空间内部唯一的Key来标识。对象元信息是一组键值对,表示了对象的一些属性,比如最后修改时间、大小等信息,同时用户也可以在元信息中存储一些自定义的信息。对象的生命周期是从上传成功到被删除为止。在整个生命周期内,除通过追加方式上传的Object可以通过继续追加上传写入数据外,其他方式上传的Object内容无法编辑,您可以通过重复上传同名的对象来覆盖之前的对象。
d.AccessKey(访问密钥)
AccessKeyId和AccessKeySecret对称加密的方法来验证某个请求的发送者身份。AccessKeyId用于标识用户;AccessKeySecret是用户用于加密签名字符串和OSS用来验证签名字符串
云存储安全风险类型
以下配置演示均为阿里云存储环境,其它公有云配置可能略有不同。
01
Object可遍历风险
在创建 Bucket 时,可以选择是否公开,默认是 private 的权限,如果在错误的配置下,比如管理员选择了公共读或者公共读写,同时给了Listobject权限,就会导致存储桶可遍历的安全风险。
值得注意的是在只配置读写权限设置为公共读或公共读写的情况下,无法列出对象,但能够直接读取下载对应的文件。如果想列出 Object 对象,需要在 Bucket 授权策略中设置 ListObject。
如下图可遍历存储桶,存在批量泄露存储文件的风险。
02
Bucket桶爆破风险
当不知道 Bucket 名称的时候,可以通过爆破方式获得 Bucket 名称,这有些类似于目录爆破,只不过目录爆破一般通过状态码判断,而这个通过页面的返回内容判断。
对于阿里云OSS存储桶不存在有两种返回情况,分别是InvalidBucketName和NoSuchBucket。
InvalidBucketName:表示存储桶的名称不符合规范,属于无效的存储桶名称
NoSuchBucket:表示没有这个存储桶
当存储桶存在时,则会返回以下两种情况:
这种直接返回了存储桶遍历信息。
AccessDenied:表示没有ListObject权限,不可遍历
03
Bucket策略配置可读风险
如果管理员错误的配置了GetBucketPolicy策略,可能导致攻击者获取安全策略配置信息,导致不必要的安全风险。
利用阿里云REST接口获取策略配置信息,可以看到,管理员配置了对于任意认证主主体开放了所有 Action 的权限,存在极大的安全隐患。
04
任意文件上传与覆盖风险
当管理员错误的配置了PutObject策略时,此时攻击者可将任意文件上传至存储桶,或者说可以覆盖存储桶上已有的一个文件,存在很大的安全风险。
如上图所示,已成功上传了任意文件,如果目标的对象存储支持 html 解析,那就可以利用任意文件上传进行 XSS 钓鱼、挂暗链、挂黑页、供应链投毒等操作。
05
Bucket策略配置可写风险
05x1.获取受限敏感文件
当访问一个存储桶时,如果提示Access Denied,这时如果管理员错误的配置了PutBucketPolicy和GetBucketPolicy,此时就可以获取存储桶的配置策略,然后通过覆盖写入新配置从而获取存储桶的敏感文件。
利用阿里云CLI命令行工具获取OSS配置策略,更改Effect值Deny为Allow即可访问受限的敏感文件。
覆盖上传修改后的策略文件
覆盖策略成功,已可访问受限文件
当管理员错误的配置了PutBucketPolicy和GetBucketPolicy导致策略可写时,当业务网站引入了存储桶上的资源、图片或JS等,此时可以通过修改Effect为Deny,导致网站无法获取这些资源而瘫痪访问。
当管理员错误的配置了PutBucketPolicy和GetBucketPolicy导致策略可写时,攻击者便可以通过修改里面的资源,进行钓鱼或污染。
06
Bucket劫持与子域接管风险
在阿里云下,当 Bucket 显示 NoSuchBucket 说明是可以接管的,如果显示 Access Denied 则不行。在管理员给存储桶配置了域名解析,但是管理员将存储桶删除后,没有将域名解析的CNAME删除,这时访问域名就会出现NoSuchBucket的情况。这种情况攻击者可以通过注册同样的存储桶名称来劫持该域名,只需要上传任意的文件,就可以让劫持的域名或者存储桶显示攻击者想要的信息或页面,存在不小的安全风险。
通过新建与显示NoSuchBucket的存储桶HostID一样名称的Bucket即可劫持此存储桶或域名。
07
AccessKeyId,SecretAccessKey泄露风险
云环境相比传统环境,新增的一大风险即用户Access key的泄露风险。AK是应用程序调用云平台API时使用的认证凭据。一个用户的AK泄露往往代表用户在云平台最高权限的泄露,云环境中所有计算、存储资源对入侵者门洞大开。非法利用者甚至不需要为此单独开发工具,直接使用现成的产品就能直接获取用户在云内的所有资源列表。泄露安全危害极大,一般泄露途径有以下几种:
值得关注的风险案例
Bucket可遍历泄露敏感图片案例
从公开渠道了解到一个存储桶遍历泄露案例,通过拼接key路径可查看大量敏感图片。
AccessKey泄露案例
从公开渠道了解到一个AccessKey泄露案例,目标网站一个前端接口泄露了AK密钥,如下所示:
危害利用证明如下(基于开源工具aliyun-accesskey-Tools):
通过泄露的AK密钥轻松便获取了阿里云实例主机的Root控制权限,此外还可利用AK获取OSS存储资源以及接管云控制台。
总结
本文通过从错误的云存储配置角度介绍了常见云存储的攻击利用及相关风险,相反在日常开发运维角度这些安全风险问题必须得到重视,几点注意事项概括如下:
1、务必妥善保管AccessKey!不要以任何方式公开 AccessKey 到外部渠道(例如 Github、硬编码、JS前端代码),避免被他人利用造成安全威胁。建议使用RAM用户(而不是云账号)的 AccessKey 进行 API 调用,实现最小权限原则。
2、存储桶开放策略务必安全合理的配置,不建议配置一些高风险的权限策略。
3、废弃的存储桶务必同步删除CNAME域名解析,以避免不必要的风险
参考来源:
火线社区《阿里云 OSS对象存储攻防》
Freebuf《对象存储(OSS)攻防案例》
原文始发于微信公众号(上汽集团网络安全应急响应中心):浅谈云存储的配置安全风险
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论