当前位置: 首页 > news >正文

谷歌警告云存储桶劫持攻击

黑客正瞄准被遗忘或配置错误的云存储桶,寻找敏感数据或资源,以便向他人提供恶意软件。谷歌分享了其防止悬挂存储桶接管的最佳实践,并敦促开发人员保护其云环境。

谷歌警告称,悬垂存储桶攻击是指开发人员删除存储桶,但应用程序代码、移动应用程序、公共文档或其他地方仍然存在对它的引用。

该科技巨头表示:“攻击者只需在自己的项目中声明相同的存储桶名称,即可有效劫持您的旧地址,从而可能为恶意软件提供服务,并窃取那些在不知情的情况下仍然依赖不再正式使用的存储桶的用户的数据。”

Google 建议对此类云存储采取谨慎的退役流程,并分享了有关保护悬空存储桶的四步建议。

首先,在删除任何存储桶之前,云管理员应该“花时间了解谁以及什么仍在访问该存储桶”。

日志会显示最近的流量,如果新请求来自旧版本的应用、第三方服务或用户,则应进行调查。来自机器人、数据爬虫和扫描器的流量可以放心忽略。

谷歌警告说:“要特别注意试图提取可执行代码、机器学习模型、动态网络内容(如 JavaScript)和敏感配置文件的请求。”

其次,Google 建议至少等待一周再删除存储桶。观察整个活动周期,例如每周报告、批处理作业以及不频繁的用户访问,将有助于增强信心。

帖子中写道:“在您确认至少一周内没有合法流量进入存储桶,并且您已更新所有遗留代码后,您就可以继续删除存储桶了。”

谷歌提醒用户,删除 Google Cloud 项目也会删除与其相关的所有资源,包括存储桶。

接下来,主动发现悬空的存储桶引用至关重要,包括分析日志中的 404 错误和扫描代码库中的过时引用。

“对同一个不存在的存储桶名称的大量失败请求是一个重大危险信号。”

Google 建议扫描代码库和文档,查找任何可能不再使用的存储桶名称的引用。如果开发人员发现不再拥有的悬空存储桶,应立即删除硬编码引用,并向用户部署修复程序。

“如果您发现一个悬空的存储桶名称可能对您或您的客户构成安全风险,请迅速采取行动。”

公司仍然拥有的悬空存储桶可以通过在其控制的安全项目中创建同名的新存储桶来回收。这些存储桶应使用严格的 IAM 策略锁定。

谷歌还分享了可能有助于开发人员识别悬空存储桶的检测脚本。

https://cloud.google.com/blog/products/identity-security/best-practices-to-prevent-dangling-bucket-takeovers

import re
import sys
from typing import Optional, Setimport requests
from requests.exceptions import RequestExceptiondef check_bucket(bucket_name: str) -> Optional[requests.Response]:try:with requests.Session() as session:response = session.head(f"https://storage.googleapis.com/{bucket_name}")return responseexcept RequestException as e:print(f"An error occurred while checking bucket {bucket_name}: {e}")return Nonedef sanitize_bucket_name(bucket_name: str) -> Optional[str]:# Remove common prefixes and quotesbucket_name = bucket_name.replace("gs://", "")bucket_name = bucket_name.replace("\"", "")bucket_name = bucket_name.replace("\'", "")bucket_name = bucket_name.split("/")[0]# Validate the bucket name format according to GCS naming conventionsif re.match("^[a-z0-9-._]+$", bucket_name) is None:return Nonereturn bucket_namedef extract_bucket_names(line: str) -> Set[str]:all_buckets: Set[str] = set()pattern = re.compile(r'gs://([a-z0-9-._]+)|'r'([a-z0-9-._]+)\.storage\.googleapis\.com|'r'storage\.googleapis\.com/([a-z0-9-._]+)|'r'([a-z0-9-._]+)\.commondatastorage\.googleapis\.com|'r'commondatastorage\.googleapis\.com/([a-z0-9-._]+)',re.IGNORECASE)for match in pattern.finditer(line):# The first non-empty group is the bucket nameif raw_bucket := next((g for g in match.groups() if g is not None), None):if sanitized_bucket := sanitize_bucket_name(raw_bucket):all_buckets.add(sanitized_bucket)return all_bucketsdef main(filename: str) -> None:with open(filename, 'r') as f:for i, line in enumerate(f, 1):bucket_names = extract_bucket_names(line)for bucket_name in bucket_names:response = check_bucket(bucket_name)if response.status_code == 404:print(f"Dangling bucket found: {bucket_name} (line {i}), {line}")if __name__ == "__main__":if len(sys.argv) != 2:print("Usage: python find_dangling_buckets.py <filename>")sys.exit(1)main(sys.argv[1])
http://www.lryc.cn/news/615190.html

相关文章:

  • 让大模型 “睡觉”:把版本迭代当作人类睡眠来设计(附可直接改造的训练作息表与代码)
  • n沟道增强型mos管
  • B.10.01.6-DDD领域驱动设计:从理论到落地的完整指南
  • Typora上传图片保存到assets目录下
  • 第十四届蓝桥杯青少年组省赛 编程题真题题解
  • stm32项目(24)——基于STM32的汽车CAN通信系统
  • WinForm 复合控件(用户控件):创建与使用指南
  • 深入 FastMCP 源码:认识 tool()、resource() 和 prompt() 装饰器
  • sqli-labs通关笔记-第39关 GET数值型堆叠注入(手工注入+脚本注入两种方法)
  • 数据分析框架从 “工具堆砌” 转向 “智能协同”
  • 大语言模型提示工程与应用:提示工程-提升模型准确性与减少偏见的方法
  • node.js 零基础入门
  • 学习嵌入式第二十四天
  • Kotlin 协程线程切换机制详解
  • M8-11 RFID模块通过RS485转Profinet网关与PLC通信的配置指南
  • 安装NodeJS和TypeScript简要指南
  • 虚拟机远程连接报错解决办法
  • 「iOS」————分类与扩展
  • 书生浦语第五期-L1G4-InternLM 论文分类微调实践(XTuner 版)
  • 代码随想录day60图论10
  • 快速使用selenium+java案例
  • Nginx 性能优化与动态内容处理
  • TOMCAT笔记
  • 七、《Serverless架构:按毫秒计费的成本革命》--从新浪AI推理平台50%效能提升看无服务器本质
  • 前端如何安全存储 API 密钥 —— 两种实用方案
  • CosyVoice 语音合成模型性能优化实战:从 CPU 瓶颈到 GPU 加速的完整解决方案
  • electron多进程设计
  • K8s-pod控制器
  • Baumer高防护相机如何通过YoloV8深度学习模型实现输电线路塔电缆检测分割(C#代码UI界面版)
  • DAY 37 作业(补)