# 对象存储攻防

#### 对象存储是什么？ <a href="#toc1676270074" id="toc1676270074"></a>

对象存储（Cloud Object Storage，COS）是腾讯云提供的一种存储海量文件的分布式存储服务，用户可通过网络随时存储和查看数据。腾讯云 COS 使所有用户都能使用具备高扩展性、低成本、可靠和安全的数据存储服务。

COS 通过控制台、API、SDK 和工具等多样化方式简单、快速地接入，实现了海量数据存储和管理。通过 COS 可以进行任意格式文件的上传、下载和管理。腾讯云提供了直观的 Web 管理界面，同时遍布全国范围的 CDN 节点可以对文件下载进行加速。

每个云厂商对象存储叫法不一样，阿里云的OSS存储桶，华为云的OBS存储桶，腾讯云的COS存储桶，亚马逊云S3存储桶。这里主要以腾讯的COS存储桶来讲解，我们不需要掌握所有厂商存储桶只需要掌握一种基本都相通。

#### 对象存储的应用场景 <a href="#toc233168725" id="toc233168725"></a>

* &#x20;备份归档

对象存储可用于各种企业应用、数据库和非结构化数据的备份和归档。在需要使用时，可直接将存储的数据恢复到灾备主机或测试主机中。

&#x20;

* &#x20;静态网站托管

结合CDN加速、云服务器等产品，可实现对静态网站的托管，对大多数企业来说，可减轻管理上的负担。

&#x20;

* &#x20;图片和音视频等应用的海量存储

可用于图片、音视频、日志等海量文件的存储。各种终端设备、Web网站程序、移动应用可以直接向OSS写入或读取数据。

&#x20;

* &#x20;云端数据处理

上传文件到对象存储中，可以配合媒体处理服务和图片处理服务进行云端的数据处理。

&#x20;

阅读参考：

* &#x20;<https://cloud.tencent.com/document/product/436/8186>
* &#x20;<https://www.huaweicloud.com/zhishi/obs6.html>

#### 基本概念 <a href="#toc1856588947" id="toc1856588947"></a>

下面通过几个名词概念，进一步了解腾讯云 COS：

* &#x20;存储桶（bucket） ：是对象的载体，可理解为存放对象的“容器”。用户可以通过腾讯云控制台、API、SDK 等多种方式管理存储桶以及配置属性。例如，配置存储桶用于静态网站托管、配置存储桶的访问权限等。
* &#x20;对象（Object）：是 COS 的基本单元，可理解为任何格式类型的数据，例如图片、文档和音视频文件等。
* &#x20;地域（Region）：是腾讯云托管机房的分布地区，COS 的数据存放在这些地域的存储桶中。
* &#x20;访问域名（Endpoint）：对象被存放到存储桶中，用户可通过访问域名访问和下载对象。
* &#x20;存储类型（StorageClass）：指对象在 COS 中的存储级别和活跃程度。COS 提供多种存储类型：标准存储（多 AZ）、低频存储（多 AZ）、智能分层存储（多 AZ）、智能分层存储、标准存储、低频存储、归档存储、深度归档存储。每种存储类型适用于不同的业务场景，拥有不同的特性（例如对象访问频度、访问时延等）。
* &#x20;APPID
  * &#x20;APPID 是您在成功申请腾讯云账户后所得到的账号，由系统自动分配，具有固定性和唯一性，可在 账号信息 中查看。腾讯云账号的 APPID，是与账号 ID 有唯一对应关系的应用 ID。
  * &#x20;APPID 经常使用在存储桶名称上，完整的存储桶名称由用户自定义字符串和 APPID 组成，使用中划线“-”相连，例如 examplebucket-1250000000中的1250000000即为 APPID。
  * &#x20;ACL：访问控制列表（ACL）是基于资源的访问管理选项之一 ，用于描述一个访问权限行为。\
    在对象存储中，可用于管理存储桶和对象的访问。使用 ACL 可向其他主账号、子账号和用户组，授予基本的读、写权限。

#### 使用COS <a href="#toc753041319" id="toc753041319"></a>

在腾讯云控制台中，选择云产品 > 对象存储，进入 COS 控制台，按照界面提示开通 COS 服务。（如果您已开通，请跳过该步骤。）

<figure><img src="/files/CWsMW6BU4nWeJQqIIrsB" alt=""><figcaption></figcaption></figure>

* &#x20;所属地域：请选择与您业务（或用户数量）相对集中的物理区域所对应的 COS 地域，设置后不可修改。
* &#x20;名称：请输入自定义的存储桶名称。设置后不可修改，仅支持小写英文字母和数字，即\[a-z，0-9]、中划线“-”及其组合。
* &#x20;访问权限：存储桶默认提供三种访问权限：私有读写、公有读私有写和公有读写
* &#x20;请求域名：自动生成。创建完存储桶后，您可以使用该域名对存储桶进行访问。

<figure><img src="/files/uLFdmpgIqRIG7AJo2skl" alt=""><figcaption></figcaption></figure>

* &#x20;版本控制：开启后，上传的同名对象将保存历史版本。
* &#x20;多 AZ 特性：多 AZ 特性是存储桶的一个标识，当您打开多 AZ 配置后，您的数据将存放到同个地域的不同机房中，具有同城容灾的作用。
* &#x20;日志存储：为您记录跟存储桶操作相关的各种请求日志。
* &#x20;存储桶标签：存储桶标签作为管理存储桶的一个标识，您可以为存储桶设置标签，便于分组管理存储桶。
* &#x20;服务端加密：目前存储桶的加密方式支持 SSE-COS 加密（即由 COS 托管密钥的服务端加密

**COSbrowser访问**

无需安装网页版：

<https://cosbrowser.cloud.tencent.com/login>

<figure><img src="/files/gybyfDxmNGF2R7SyEFLL" alt=""><figcaption></figcaption></figure>

<https://cosbrowser.cloud.tencent.com/>

<figure><img src="/files/WIjuNMbiOoWGl4TD2bNk" alt=""><figcaption></figcaption></figure>

#### 攻击场景 <a href="#toc1244316662" id="toc1244316662"></a>

**OSS初始访问**

* &#x20;云平台主 API 密钥泄露
* &#x20;对象存储 SDK 泄露
* &#x20;存储桶工具配置文件泄露
* &#x20;前端直传功能获取凭据
* &#x20;云平台账号非法登录

**云平台主API密钥泄露**

云平台的主 API 密钥相当于用户的登录密码，代表着账户拥有者的身份和对应的权限。API 密钥是由 SecretId 和 SecretKey 组成的，通过 API 密钥，用户可以访问云平台 API 并管理账户下的资源。然而，在某些攻击情景中，因为开发者开发和配置不安全，或者某些针对设备的入侵事件，主 API 密钥可能被泄露，攻击者可以假冒账户拥有者的身份，通过窃取的 API 密钥入侵云平台，非法操作存储服务并篡改、盗窃数据。

**对象存储 SDK 泄露**

云平台提供了对象存储服务，不仅包含多种 API 接口，还提供丰富的 SDK 供开发者使用。开发者在 SDK 初始化阶段需要配置存储桶名称、路径、地域等信息，以及永久密钥或临时密钥。这些信息被编写在代码中，供应用程序操作存储桶。然而，如果密钥代码片段泄露，例如开发者上传源代码到公开仓库或应用开发商未删除示例中的 SDK 凭据信息，将会导致凭据泄露，从而使对象存储服务遭受入侵。攻击者可以冒用凭据所有者身份攻击对象存储服务。

Github：

<figure><img src="/files/9MW9vIiUTPMqWv9A5Nsp" alt=""><figcaption></figcaption></figure>

**存储桶工具配置文件泄露**

对象存储服务在使用过程中，官方和开源社区为了方便用户操作存储桶，提供了大量的对象存储客户端工具。使用这些工具前，需要在工具的配置文件或配置项中填入存储服务相关信息和用户凭据，以便工具与存储服务进行交互。但是，在一些攻击场景下，例如开发者个人电脑被钓鱼攻击或开发者对象存储客户端工具配置文件被泄露，这些凭据和存储桶信息写在存储服务工具配置文件中的将会泄露出去，攻击者可以通过分析这些配置文件获取凭据，这些凭据往往是用户的云平台主 API 密钥，攻击者可以通过这些信息控制对象存储服务，甚至在一些严重的场景中，攻击者可以控制用户的所有云上资产。

&#x20;

**前端直传功能获取凭据**

在一些结合了对象存储服务、Web 开发和移动开发的场景中，开发人员选择使用前端直传功能来操作对象存储服务。这一功能指的是利用 iOS/Android/JavaScript 等 SDK 通过前端直接向对象存储服务进行访问。前端直传功能可以很好地节约后端服务器的带宽和负载，但是，为了实现这一功能，开发人员需要在前端代码中编写凭据，这样容易被攻击者轻易获取。然而，这并不代表这一功能不安全。如果遵守安全开发规范，比如使用临时密钥而不是永久密钥作为前端凭据，并按照最小权限原则生成临时密钥，就可以保证对象存储服务的安全。然而，如果实际应用中的开发人员没有遵循安全开发原则，比如使用了错误的永久密钥，或配置了错误的临时凭据权限，那么攻击者可以通过前端获得的凭据访问对象存储服务。攻击者可以通过分析前端代码或抓取流量来获得这些错误配置生成的凭据，并以此进行攻击。

<figure><img src="/files/jlAjOJWuav7zG1HreIMl" alt=""><figcaption></figcaption></figure>

阅读参考：

{% embed url="<https://cloud.tencent.com/developer/article/1884240>" %}

**拿到AK/SK无法利用场景**

通过小程序或者JS获取的AK/SK却无法利用是怎么回事？

&#x20;

什么是STS模式？

Web、iOS、Android 使用 COS 时，通过固定密钥计算签名方式不能有效地控制权限，同时把永久密钥放到客户端代码中有极大的泄露风险。STS提供的是一种临时访问授权。通过STS可以返回临时的AK\SK和STSToken，这些信息可以直接发给临时用户用来访问OSS，有效地解决权限控制问题。

&#x20;

临时密钥整体架构图：

<figure><img src="/files/tGLSGG7cMdYLhIPj59Qa" alt=""><figcaption></figcaption></figure>

STS模式中，accessKeyId、accessKeySecret和stsToken都是会变化，临时密钥有效时长，单位是秒，默认 1800 秒，如果当我们从小程序或APP中获取的AK/SK中无法获取存储桶的信息时，则是遇到了STS模式，获取到的AK/SK已过期。

{% code overflow="wrap" %}

```bash
 // 临时密钥有效时长，单位是秒，默认 1800 秒，目前主账号最长 2 小时（即 7200 秒），子账号最长 36 小时（即 129600）秒
config.put("durationSeconds", 1800);
```

{% endcode %}

&#x20;


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://lzcloudsecurity.gitbook.io/yun-an-quan-gong-fang-ru-men/di-si-zhang-gong-you-yun-gong-fang/dui-xiang-cun-chu-gong-fang.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
