OSS云存储相关安全风险

​ OSS服务作为一项重要的云上服务,承担了存储用户数据的重要功能。对象存储服务提供了细粒度的访问权限控制功能,以保证用户数据的安全性。如果使用OSS服务时安全意识不足或对访问权限以及访问策略错误理解,将会导致数据被非法访问或篡改,产生严重后果。

本文将介绍下相关OSS云存储相关方面的风险问题,老规矩先上一张图。

image-20230330091632227

0x00 础介绍

​ 对象存储OSS是一种云存储服务,可以存储大量非结构化数据,例如图像、视频和文本等。由于 OSS 是一种公共云服务,因此存在安全方面的问题。其中,最大的问题之一是数据隐私和安全。企业应该制定一些安全措施来保护数据的机密性和完整性。例如,使用加密技术对数据进行加密,并使用访问控制策略来限制用户对数据的访问。

​ 对象存储作为云原生的一项重要功能,面临着一系列安全挑战。但在对象存储所导致的安全问题中,绝大部分是由于用户使用此功能时错误的配置导致的。据统计,由于缺乏经验或人为错误导致的存储桶错误配置所造成的安全问题占所有云安全漏洞的16%。例如2017年美国新闻与金融信息公司道琼斯(Dow Jones & Company)发生用户数据泄露事件,安全研究人员在亚马逊云服务器上发现440万道琼斯客户的细节信息,被泄露信息包含客户姓名、ID、住址、订阅细节、信用卡后四位和部分电话号码。 道琼斯公司已确认此事,称有220万客户数据受影响,数据泄露的主要原因是道琼斯公司对服务器的权限配置错误。

下面将介绍下对象存储OSS产品中涉及的几个基本概念,方便后续对其涉及到的安全风险更好的了解。

存储空间(Bucket)

存储空间是用户用于存储对象(Object)的容器,所有的对象都必须隶属于某个存储空间。存储空间具有各种配置属性,包括地域、访问权限、存储类型等。用户可以根据实际需求,创建不同类型的存储空间来存储不同的数据。

对象(Object)

对象是OSS存储数据的基本单元,也被称为OSS的文件。和传统的文件系统不同,对象没有文件目录层级结构的关系。对象由元信息(Object Meta),用户数据(Data)和文件名(Key)组成,并且由存储空间内部唯一的Key来标识。对象元信息是一组键值对,表示了对象的一些属性,比如最后修改时间、大小等信息,同时用户也可以在元信息中存储一些自定义的信息。对象的生命周期是从上传成功到被删除为止。在整个生命周期内,除通过追加方式上传的Object可以通过继续追加上传写入数据外,其他方式上传的Object内容无法编辑。

OjbectKey

在各语言SDK中,ObjectKey、Key以及ObjectName是同一概念,均表示对Object执行相关操作时需要填写的Object名称。例如向某一存储空间上传Object时,ObjectKey表示上传的Object所在存储空间的完整名称,即包含文件后缀在内的完整路径,如填写为abc/efg/123.jpg。

Region(地域)

Region表示OSS的数据中心所在物理位置。用户可以根据费用、请求来源等选择合适的地域创建Bucket。一般来说,距离用户更近的Region访问速度更快。Region是在创建Bucket的时候指定的,一旦指定之后就不允许更改。该Bucket下所有的Object都存储在对应的数据中心,目前不支持Object级别的Region设置。

Endpoint(访问域名)

Endpoint表示OSS对外服务的访问域名。OSS以HTTP RESTful API的形式对外提供服务,当访问不同的Region的时候,需要不同的域名。通过内网和外网访问同一个Region所需要的Endpoint也是不同的。

6.AccessKey(访问密钥)

AccessKey简称AK,指的是访问身份验证中用到的AccessKey ID和AccessKey Secret。OSS通过使用AccessKey ID和AccessKey Secret对称加密的方法来验证某个请求的发送者身份。AccessKey ID用于标识用户;AccessKey Secret是用户用于加密签名字符串和OSS用来验证签名字符串的密钥,必须保密。

AccessKey包含以下三种:

  • Bucket的拥有者申请的AccessKey。
  • 被Bucket的拥有者通过RAM授权给第三方请求者的AccessKey。
  • 被Bucket的拥有者通过STS授权给第三方请求者的AccessKey。

AK/SK访问控制

原始AK/SK是指您在注册OSS服务时,系统自动分配的AK(Access Key ID) / SK(Secret Access Key)。主要用于对用户的调用行为进行鉴权和认证,相当于API专用的用户名及密码。您向OSS发送的每个请求,都需要通过鉴权认证通过后,OSS才会处理您的请求。

移动端场景使用原始AK/SK鉴权的交互过程如下图所示:

image-20230330092537813

使用原始的AK/SK下发到移动端势必会存在一定的安全风险,因此,原始AK/SK鉴权方式只推荐您在测试过程中使用,提供正式服务时推荐使用STS方式鉴权。

STS临时授权访问

BOS可以通过STS机制实现第三方的临时授权访问。STS(Security Token Service)是由OSS服务商提供的临时授权服务。通过STS,您可以为第三方用户颁发一个自定义时效和权限的访问凭证。第三方用户可以使用该访问凭证直接调用API访问OSS资源。

image-20230330092606510

使用STS的优点:

  • 不需要向第三方用户透露您的管理账号或AK/SK信息,只需要向STS申请一个临时访问凭证并颁发给第三方用户即可,且这个访问凭证拥有的权限和有效期均可由自己去定义。
  • 您不需要关注该权限的撤销问题,临时访问凭证在过期后会自动失效
  • STS临时访问的权限也需要进行严格把控,利用STS申请的AK/SK、临时凭证Token也会存在一定的安全风险

0x01 常见风险点

常见的OSS安全风险点有如下几种,下面将会分别进行介绍。

存储空间访问权限

存储空间(Bucket)是存储对象(Object)的容器。对象都隶属于存储空间,存储空间的访问权限(ACL)有以下三类:

访问权限 描述 访问权限值
私有 存储空间的拥有者和授权用户有文件的读写权限,其他用户没有权限操作文件。 oss.ACLPrivate
公共读 存储空间的拥有者和授权用户有文件的读写权限,其他用户只有读权限。请谨慎使用该权限。 oss.ACLPublicRead
公共读写 所有用户都有文件的读写权限。请谨慎使用该权限。 oss.ACLPublicReadWrite
image-20230330092659927

在上传文件(Object)时未指定文件的ACL,则文件的ACL均默认继承Bucket ACL。 故申请OSS Bucket一般禁止申请公共读写公共读写意味着互联网上任何用户都可以对该Object进行访问,并且向该Object写入数据。这有可能造成数据的外泄以及费用激增,若被人恶意写入违法信息还可能会影响公司商誉。

如果想加速文件访问,可以配置OSS 私有Bucket回源。但需要注意,开启OSS私有Bucket回源授权后,即授权CDN对您所有Bucket的只读权限,不只是对当前Bucket授权。

AccessKey泄漏

AccessKey是用户访问内部资源最重要的身份凭证。用户调用API时的通信加密和身份认证会使用API凭证(即基于非对称密钥算法的鉴权密钥对)。API凭证是云上用户调用云服务API、访问云上资源的唯一身份凭证。API凭证相当于登录密码。用户可以使用AccessKey(简称AK)构造一个API请求(或者使用云服务**SDK**)来操作资源。AccessKey包括AccessKey ID和AccessKey Secret。其中AccessKey ID用于标识用户,AccessKey Secret是用来验证用户身份合法性的密钥。AccessKey Secret必须保密。

但在实际开发过程中,部分开发人员意识不强。前端开发者有些会直接使用SDK**上传,硬编码AccessKey进行上传,这种方式极其危险,前端禁止使用该操作上传文件。可以让后端上传,或者通过STS服务颁发一个临时访问凭证。该临时访问凭证可在规定时间内访问OSS资源。临时访问凭证无需透露长期密钥,使OSS资源访问相对安全。但是同时STS认证权限存在问题仍然会导致严重后果**:

  1. 利用 AK/SK泄漏调用IAM权限进行用户级操作
  2. 利用 AK/SK泄漏调用Bucket相关权限操作

image-20230330093633261

文件覆盖风险

如果在配置存储桶时,管理员错误的将存储桶权限,配置为可写,这将会导致攻击者可上传任意文件到存储桶中,或覆盖已经存在的文件。

image-20230330093924697

如果错误配置权限,可以通过去除掉PutObject权限方式解决。但如果必须使用到该权限,该如何做呢?

在Web、App等应用开发中,经常会发生此类问题。例如场景:在一个Web应用使用对象存储来存储用户上传视频,且通过客户端直传的方式将用户上传的视频上传至Bucket中,并希望在存储桶/app/路径中存储桶用户的头像,由于后端开发时为了方便而进行了不规范的存储桶Policy配置,在生成用户用以上传视频的临时密钥时直接将此临时密钥允许访问的 resource 指定为 acs:oss:::app/image/路径。 这样以来,系统为每个用户所生成的用以上传的临时密钥虽然不相同,但是这个临时密钥都拥有acs:oss:::app/image/路径中的所有资源的读写权限,这将会带来严重的安全问题

此时可通过控制Policy,限制生成的临时认证权限。通过每个用户的用户标识来为每一个用户设置一个独用的路径,例如可以在为用户生成临时密钥时,将policy中resource 指定为 acs:oss:***:***:app/image/${user_id}/

Bucket接管风险

当我们正常进行测试并访问static-good-boy.huoxian.cn。

1、static-good-boy.huoxian.cn指向了static-good-boy.oss-cn-beijing.aliyuncs.com这个子域名

2、static-good-boy.oss-cn-beijing.aliyuncs.com这个桶不存在

也就是说我只要申请 static-good-boy这个桶,那么我就可以控制static-good-boy.oss-cn-beijing.aliyuncs.com的内容,而static-good-boy.huoxian.cn指向了static-good-boy.oss-cn-beijing.aliyuncs.com,就相当于变相的控制了static-good-boy.huoxian.cn,而在static-good-boy.huoxian.cn上窃取其他huoxian.cn子域名的一些cookie等信息是有很大可能的~

image-20230330095020126

创建同名Bucket

image-20230330095041385

创建完成后,上传文件进行测试

<html>
<meta>
take over by mkdd~<br>
<input value="click" onclick="alert(document.cookie)">
</html>

成功上传后访问链接,成功接管OSS服务

static-good-boy.huoxian.cn/mkdd.html

image-20230330095137450

XSS风险

如果目标的对象存储支持 html 解析,那就可以利用任意文件上传进行 XSS 钓鱼、挂暗链、挂黑页、供应链投毒等操作,常见的文件有SVG、html等文件,会被OSS解析。研发在使用对象存储时,需要根据业务需要在服务端先校验文件后缀类型,再校验Content-Type是否属与此后缀类型相匹配;储存方需要对文件后缀类型与文件MIME强关联,例如禁止jpeg后缀的文件MIME变成text/html。

image-20230330095231355

内容安全

除了常见的OSS应用安全之外,还有上传内容安全也值得注意。随着业务的急剧发展,上面的数据呈现爆炸式增长。上传大量的的视频、图片,这些日益增长的内容中充斥着各种不可控的风险因素,例如色情视频和图片、涉政暴恐内容、各种垃圾广告等。随着政府监管的日渐严格,网站及平台需要加强对网站内容的管理和检测。所以对于上传文件的输入点,需要接入风控进行审核

0x02 安全建设意见

数据加密

使用加密技术对数据进行加密,保护数据的机密性和完整性。同时,应该确保加密密钥的安全性。

强化身份认证

采用多重身份认证方式,例如密码、短信验证码、生物识别等,以提高用户身份认证的安全性。

访问控制

采用访问控制策略控制用户对数据的访问权限,限制不必要的访问。

数据备份和恢复

建立相应的备份和恢复策略,以确保在出现故障或存在勒索行为时可以快速恢复数据。

安全漏洞管理

  1. 采用网络安全技术,例如防火墙、入侵检测系统等,加强对OSS的网络安全保护。
  2. 建立安全漏洞管理机制,及时发现和修复潜在的安全漏洞,以减少安全风险。

安全监管

建立安全监管机制,对企业的安全管理进行监管,确保企业的安全策略得到执行。

安全审计

定期对 OSS 进行安全审计,及时发现和修复潜在的安全漏洞。

安全培训

对员工进行安全培训,提高员工的安全意识和安全素养,降低因员工操作失误导致的安全问题。

Author

ol4three

Posted on

2022-07-27

Updated on

2023-03-30

Licensed under


Comments