云安全攻防(十)之 资源耗尽型攻击

news2024/11/24 7:32:38

资源耗尽型攻击

同为虚拟化技术,容器与虚拟机既存在相似之处,也有显著不同。在资源限制方面,无论使用 VMware、Virtual Box 还是 QEMU,我们都需要为即将创建的虚拟机设定明确的CPU、内存及硬盘资源阈值。在虚拟机内部进程看来,他真的处于一台被设定好的独立计算机之中,然而,容器运行时默认情况下并未对容器内部进程在资源使用上做任何限制,以Pod 为基本单位的容器编排管理系统在默认情况下同样未对用户创建的Pod做任何CPU、内存使用限制

缺乏限制使得云原生环境面临资源耗尽型攻击的风险。攻击者可能通过在一个容器内发起拒绝式服务攻击来大量占用宿主机的资源,从而影响到宿主机自身或宿主机上其他容器的正常运行。注意,这里我们讨论的是默认配置下资源限制缺失,从而导致容器的隔离性在一定程度上失效(影响到容器外系统或服务的正常运行),而非针对容器本身的拒绝式服务攻击

常见容易受影响的资源如下:

1)计算资源:CPU、内存等
2)存储资源:本地硬盘等
3)软件资源:内核维护的数据结构等
4)通信资源:网络带宽等

CPU 资源耗尽

毫无疑问,CPU资源大量消耗会对计算机的正常运行产生影响,在限制缺少的情况下一个容器几乎能够使用宿主机上几乎所有的算力

下面,我们借助压力测试工具 stress 测试一下,同时使用 htop 工具 来监测宿主机CPU的使用情况

首先,我们在宿主机上开启 htop 监控,然后再宿主机上运行一个容器,接着在测量一个容器并执行 uname -a 命令所需的时间,可见从执行命令到结束的时间约为0.81s

time docker run -it --rm ubuntu uname -a

在这里插入图片描述

现在,我们模拟大量占用CPU算力的场景,执行如下的命令,拉取压力测试工具 stress的 docker 镜像:

 docker pull joedval/stress

随机生成一个以“joedval/stress”镜像为基础的容器,设定权级为512,进行压力测试

time docker run -it --rm -c 512 joedval/stress --cpu 1

在这里插入图片描述

我们通过 htop 显示此时宿主机上的一个CPU核心使用率均为 100%,并且所花费的时间达到了31S

在这里插入图片描述

由此可见,在没有限制的情况下,恶意容器能够通过 CPU 算力耗尽的方式影响宿主机及其他容器的正常运行

内存资源耗尽

内存耗尽的表现也非常明显:应用交互及时性降低,服务响应时间或延长,在缺少限制的情况下,一个容器几乎能够占用宿主机上的所有内存

下面,我们借助压力测试工具stress测试一下,同时使用htop工具来检测一下宿主机内存的使用量

首先,我们在宿主机上打开 htop 监控,然后在宿主机上运行一个容器,接着再测量创建一个容器并执行uname -a 命令所需要的时间,可以见到从执行命令到结束花费了大约0.91S

在这里插入图片描述

现在我们模拟资源耗尽的场景,再第一次创建的容器中使用 stress 工具申请大量的存储空间,执行如下的命令:

stress --vm-bytes 800m --vm-keep -m 3

在这里插入图片描述

htop 显示此时宿主机上内存占用已经接近容量约为 1.77G,这时候我们在此测量创建一个容器并执行 uname -a 命令所需的时间已经变为 4.28S

在这里插入图片描述

由此可见,在没有限制的情况下,一个容器能够通过内存耗尽的方式影响宿主机及其其他容器的运行

进程表耗尽

事实上,除了硬件资源外,操作系统给还会提供很多软件资源,进程表就是其中之一,我们用经典的进程表耗尽案列——Fork炸弹——来分析这类软件资源无限制可能导致的问题。操作系统中一切行为都是以进程方式执行的。为了管理这些进程,操作系统内核维护了一张进程表,表的空间是有限的,一旦饱和,系统就无法再运行任何新程序,除非表中有进程终止

Fork炸弹,顾名思义,就是借助 fork 系统调用不断创建新进程,使进程表饱和,最终系统就无法正常运行,其中最经典的版本还是 bash 版本:

: () { : | : & } ; :

上面的代码的原理就是以无限递归的形式不断创建新进程。尽管只有一行代码,在Bash执行后,如果没有其他限制,操作系统就会慢慢失去响应

图中,我们展示了三个终端,在左上的终端中,我们在虚拟机中创建了一个容器,然后执行 Fork 炸弹代码,下方的终端给出当前虚拟机的IP地址,右上的终端则在Fork炸弹执行几分钟后,尝试使用 SSH 远程登陆到虚拟机,可以发现,此时虚拟机已经失去响应了

在这里插入图片描述

由此,我们可以看出,在没有相关限制的情况下,容器内的Fork炸弹能够影响宿主机正常运行

存储资源耗尽

除了运行时的资源外,相对静态的存储资源也可能被耗尽。所有虚拟化的技术都必须依托实体,容器也不列外。归根结底,容器内存储的数据、文件的实际存储位置还是在实体机上。如果容器内新增加了一个1GB的文件,不考虑 NFS的情况下,那么宿主机上的磁盘理应会减少 1GB。如果容器没有存储空间限制,容器内的攻击者理论上能够耗尽宿主机的存储资源

首先,我们使用 df 命令 查看 一下宿主机可用的存储空间,执行如下的命令,可以看到可用空间还有60G

df -h | grep /dev/sda1

在这里插入图片描述

然后我们在容器内使用fallocate命令创建一个 5 GB 的文件

fallocate -l 5.0G ./bomb

然后我们通过两次df 命令的对比发现,创建后的可用空间比创建前少了 5.0GB

在这里插入图片描述

由此,我们可以推理出,在没有限制存储资源的情况下,我们在容器中大量使用磁盘的存储空间,可占用大量宿主机的磁盘存储空间,从而影响宿主机及其其他容器的运行

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/871914.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

使用GraphQL在Postman中进行API测试

GraphQL 是一种用于API的开源数据查询和操作语言,用于API的查询语言和运行时。它使客户端能够精确地指定其数据需求,并获得预测性地结果。GraphQL旨在提高API的效率、灵活性和可靠性。 Postman 是一款用于API开发的强大工具,它支持REST和Gra…

【Spring Cloud +Vue+UniApp】智慧建筑工地平台源码

智慧工地源码 、智慧工地云平台源码、 智慧建筑源码支持私有化部署,提供SaaS硬件设备运维全套服务。 前言:互联网建筑工地,是将互联网的理念和技术引入建筑工地,从施工现场源头抓起,最大程度的收集人员、安全、环境、材…

邵阳首个沉浸式民国风情街来了!!!上海滩既视感美哭了!

什么?你说你厌倦了繁华闹市里的车水马龙、厌倦了每天上下班的两点一线?你说你喜欢古街旧巷,踏着青苔遍地,去抚摸青砖脉络,去感受时代变迁,你恐怕还不知道,在天子湖隐藏着这么一处穿越之地&#…

初识mysql数据库之图形化界面

目录 一、好用的数据库图形化界面软件 1. Navicat 2. SQLyog 3. MYSQL Workbench 二、MYSQL Workbench基本使用 1. 安装 2. 远端连接 3. 执行sql语句 一、好用的数据库图形化界面软件 在以前的文章中,一共介绍了两种使用数据库的方式,分别为在l…

软件测试工程师的技能树

软件测试工程师是一个历史很悠久的职位,可以说从有软件开发这个行业以来,就开始有了软件测试工程师的角色。随着时代的发展,软件测试工程师的角色和职责也在悄然发生着变化,从一开始单纯的在瀑布式开发流程中担任测试阶段的执行者…

市面上最好用的4款免费ETL工具推荐

一、ETL介绍 ETL流程是数据仓库建设的核心环节,它涉及从各种数据源中抽取数据,经过清洗、转换和整合,最终加载到数据仓库中以供分析和决策。在数据仓库国产化的背景下,ETL流程扮演着重要的角色,今天我们就来讲讲ETL流…

Windows:解决MySQL登录ERROR 1045 (28000): Access denied for user ‘root‘@‘localhost‘ (using passwor=YES)问题

我在下载的MySQL是8.0.32版本,刚下的时候没什么问题第二天启动MySQL服务就出现了 ERROR 1045 (28000): Access denied for user rootlocalhost (using password: YES) 或 ERROR 1045 (28000): Access denied for user rootlocalhost (using password: NO) 这样的问题…

详解双向链表

1.创建一个新的节点的函数 LTNode*BuyLTnode(LTDataType x) {LTNode* newnode (LTNode*)malloc(sizeof(LTNode));if (newnode NULL){perror("malloc");return NULL;}newnode->next NULL;newnode->prev NULL;newnode->data x;return newnode; } 2.哨兵位…

Java中创建线程三种方式

继承Thread类创建线程实现Runnable接口创建线程使用Callable和Future创建线程 继承Thread类 /*** 使用集成Thread的方式实现多线程*/ public class Match1 {public static void main(String[] args) {Runner liuxiang new Runner();//创建一个新的线程liuxiang.setName(&quo…

智慧餐饮系统jsp酒店点餐订餐管理java源代码

本项目为前几天收费帮学妹做的一个项目,Java EE JSP项目,在工作环境中基本使用不到,但是很多学校把这个当作编程入门的项目来做,故分享出本项目供初学者参考。 一、项目描述 智慧餐饮系统 系统有1权限:管理员 智慧餐…

2023国赛数学建模E题思路分析

文章目录 0 赛题思路1 竞赛信息2 竞赛时间3 建模常见问题类型3.1 分类问题3.2 优化问题3.3 预测问题3.4 评价问题 4 建模资料 0 赛题思路 (赛题出来以后第一时间在CSDN分享) https://blog.csdn.net/dc_sinor?typeblog 1 竞赛信息 全国大学生数学建模…

【电脑配置】新电脑买回来怎么配置?

【电脑配置】新电脑买回来怎么配置? 前记1. 系统激活步骤记录1.1 前期流程1.2 问题:PIN设置的时候卡住1.3 非联网状态下的后续激活步骤1.4 设置安全验证:PIN 2. 浏览器和联网3. office软件4. 数据迁移5. 编程环境搭建5.1 JDK1.8安装5.2 pytho…

Opencv4基于C++基础入门笔记:图像 颜色 事件响应 图形 视频 直方图

文章目录: 一:环境配置搭建 二:图像 1.图像读取与显示 main.cpp 运行结果 2.图像色彩空间转换 2.1 换色彩 test.h test.cpp main.cpp 运行结果 2.2 照片换背景 test.h test.cpp main.cpp 运行结果 …

网页制作神器—ElementUI(小白入门超详细)

目录 一、前置准备 ⚓ 二、引入ElementUI 📄 三、使用ElementUI ⚙️ 一、前置准备 ⚓ 1、安装相关环境,使用VsCode或者webstrom初始化Vue 项目 软件环境下载地址:软件 - 坚果云 - |同步|备份|无限空间 vue-cli安装: np…

Linux-C++开发项目:基于主从Reactor模式的高性能并发服务器

目录 1.项目介绍2.1项目部署2.2安装版本较高的编译器 2.项目开发过程2.1网络库模块开发2.1.1简单日志宏的实现2.1.2Buffer模块实现2.1.3Socket模块实现2.1.4Channel模块实现2.1.5Poller模块实现2.1.6TimerWheel模块实现2.1.7EventLoop模块实现2.1.8整合测试12.1.9LoopThread模块…

Python:23种Pandas核心操作方法

前言 大家早好、午好、晚好吖 ❤ ~欢迎光临本文章 Pandas 是一个 Python 软件库,它提供了大量能使我们快速便捷地处理数据的函数和方法。 一般而言,Pandas 是使 Python 成为强大而高效的数据分析环境的重要因素之一。 在本文中,作者从基本…

LeetCode530. 二叉搜索树的最小绝对差

530. 二叉搜索树的最小绝对差 文章目录 [530. 二叉搜索树的最小绝对差](https://leetcode.cn/problems/minimum-absolute-difference-in-bst/)一、题目二、题解方法一:中序遍历递归方法二:迭代 一、题目 给你一个二叉搜索树的根节点 root ,返…

一篇打通,pytest自动化测试框架详细,从0到1精通实战(一)

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 pytest单元测试框…

js设置css变量控制页面一行展示指定个数的元素

前置知识: CSS变量之var()函数的应用——动态修改样式 & root的使用 flex相关知识 场景: 动态设置给父元素内子元素设置每行排列几个 通过 document.body.style.setProperty(--itemNum, 5)设置样式变量,然后通过给父元素设置display: f…