COS使用不当的安全修复指引

1、风险说明
使用COS(云对象存储)功能时,在上传/下载文件、临时密钥生成及预签名URL场景中,安全风险通常源于不安全的实现或配置。本文章将针对不安全的实现和配置提供安全修复建议。

2、常见的COS安全风险:
a)越权操作文件(如下载、覆盖、删除)
b)COS文件目录泄露
c)桶接管
d)跨站脚本攻击(XSS)


一、不安全的参数拼接
1、扫描特征:外部参数拼接/传递到以下的代码位置中:
a)临时密钥的Policy(Action、Resource)
b)预签名的文件名
c)后端封装时的文件名
d)COS SDK的BucketURL

2、安全要求:
a)不允许未经校验的前端参数直接拼接到目录名、文件名中
b)不允许传入根目录
c)不允许../、/、..等会导致目录遍历的字符

3、加固建议:
3.1、目录&文件名格式:
3.1.1、文件名随机生成
a)uuid
b)长度>12的随机数字+字母

3.1.2、如果目录和文件名从外部参数获取,则需要进行参数校验
a)仅允许`0-9a-zA-Z`的文件名

3.1.3、应对文件名后缀和Content-Type进行白名单校验(参考2.2)

3.2、在不同的用户场景下,目录和文件名设计:
3.2.1、当无需用户登录即可上传时
a)目录/文件名必须包含服务端生成的随机值,否则可能会导致文件覆盖或者遍历

3.2.2、当需要用户登录后再上传
a)单个用户数据用单独目录进行隔离
b)将文件路径和用户的关系存储到数据库,在下载操作时校验文件路径与用户的关系


二、不安全的Action
1、扫描特征:创建临时密钥时的Policy的Action字段值中包含*号

2、安全要求:
a)不允许cos: * 、cos:Put*等模糊范围,范围应遵循最小权限原则
b)不允许cos:ListMultipartUploads 权限,会导致正在分片上传的文件列表泄露
c)不允许的Action(例如GetObject)和写(PutObject)同时存在

3、加固建议:
a)仅提供cos:PutObject、cos:GetObject等必要的Action
b)Action的范围在读对象和写对象时要拆分

三、不安全的Resource
1、扫描特征:创建临时密钥时的Policy的Resource字段值中包含*号

2、安全要求:
a)范围应遵循最小权限原则
b)不允许将目录设置为*
c)不允许将目录设置为不属于用户隔离目录的*

3、加固建议:
a)设置为此次上传/下载的文件名

四、不安全的Condition
1、扫描特征:创建临时密钥时的Policy的Resource字段值中包含*号

2、安全要求:
a)cos:content-type的限制不允许设置为*

3、加固建议:
3.1、在访问文件场景中(GetObject)
a)string_equal_ignore_case/response-concent-type为白名单(参考COS最佳安全实践白名单)

3.2、在上传文件场景中(PutObject)
a)string_equal_ignore_case/cos:content-type为白名单(参考COS最佳安全实践白名单)
b)string_equal/cos:x-cos-forbid-overwrite为true,强制携带禁止文件覆盖的请求头部
c)显式指定x-cos-acl为固定的ACL,防止上传对象时ACL被修改

注意:在访问文件和上传文件场景中,content-type和repsonse-concent-type条件不能同时配置。


五、不安全的预签名配置
1、扫描特征:使用COS SDK创建预签名时的signHost字段设置成False

2、安全要求:
a)不允许在调用GetPresignedURL时,signHost参数设置成false

3、加固建议:
3.1、签名的文件名(路径)参考文件名设计
3.2、有效期:临时密钥有效期限制在15分钟
3.3、增加Header签名:
a)cos:x-cos-forbid-overwrite为true,强制携带禁止文件覆盖的请求头部
b)显式指定x-cos-acl为固定的ACL,防止上传对象时ACL被修改
c)Content-Type:text/html加入签名以限制文件的类型

 

posted @ 2025-07-11 11:41  小碗吃不胖的  阅读(22)  评论(0)    收藏  举报