技术
拒绝服务技术的创新已经基本尘埃落定,而上个世纪最后十年的发明也逐渐遥远。然而,随着宽带接入、自动化和如今家庭计算机功能的日益强大,使得对拒绝服务攻击的研究有些多余。尤其是当我们发现一些本已在90年代末销声匿迹的古老的攻击方式,(例如land ,其使用类似的源和目标 IP 地址和端口发送 UDP 信息包)这些攻击技术 现在又卷土重来时,这个结论就更加显而易见。在这一方面唯一的进步就是可以发起并行任务,从而可以通过简单的 486 处理器所无法实现的方式来显著提高攻击强度。
另一个要考虑的重点是事实上IP堆栈似乎并未正确地安装补丁程序。计算机不再会因为单一的信息包而崩溃;但是,CPU操作会为了处理这种信息包而保持高速运行。因为补丁失效期间生成的信息包是有限的,所以要实现有效的攻击并不容易。可能是技术提高得太快。不管是什么原因,这些陈旧过时的攻击方式现在又卷土重来,而且还非常有效。
使用拒绝服务
拒绝服务攻击开始可能只是为了“取乐”,对系统操作员进行某种报复或是实现各种复杂的攻击,例如对远程服务的隐形欺骗。某人因在某一信道上遭到侮辱后也经常会将IRC服务器作为攻击目标。这种情况下的网络和因特网使用是“保密的”,这些攻击对其造成的影响微乎其微。
随着时间的流逝,因特网逐渐成为一种通信渠道,hacktivism(网络激进主义)越来越流行。地理政治形势、战争、宗教问题、生态等任何动机都可能成为对公司、政治组织或甚至国家的IT基础架构发动进攻的动机。
最近的拒绝服务攻击更多的是与联机游戏有关。某些玩家对在游戏中被人杀死或丢失他们喜爱的武器不满意,因此发动拒绝服务攻击,许多服务器已经成为这种攻击的牺牲品。
但是如今使用拒绝服务的目的大多数是纯粹的敲诈勒索。越来越多的企业开始依赖他们的IT基础架构。邮件、关键数据、甚至电话都通过网络来处理。如果没有这些主要的通信渠道,大多数公司都难以在竞争中幸存。而且,因特网还是一种生产工具。例如,搜索引擎和博彩web 站点都完全依赖网络连接。
因此,随着公司直接或间接地依赖因特网,原有的敲诈信逐渐转变成数字形式。首先在短暂而非紧要的时间段内发动攻击。然后受害者就不得不支付“保护费”。
网络协议攻击
这些攻击瞄准传输信道,并因此以IP堆栈作为攻击目标,IP堆栈是内存和 CPU 之类关键资源的进入点。
SYN洪水
SYN洪水是典型的基于概念的拒绝服务攻击,因为这种攻击完全依赖于TCP连接的建立方式。在最初的 3 向握手期间,服务器填写保存内存中会话信息的 TCB(传输控制块)表。当服务器收到来自客户机的初始 SYN 信息包时,向客户机发送回一个 SYN-ACK 信息包并在 TCB 中创建一个入口。只要服务器在等待来自客户机的最终 ACK 信息包,该连接便处于 TIME_WAIT 状态。如果最终没有收到 ACK 信息包,则将另一个 SYN-ACK 发送到客户机。最后,如果经多次重试后,客户机没有认可任何 SYN-ACK 信息包,则关闭会话并从 TCB 中刷新会话。从传输第一个 SYN-ACK 到会话关闭这段时间通常大约为 30 秒。
在这段时间内,可能会将数十万个SYN信息包发送到开放的端口且绝不会认可服务器的SYN-ACK 信息包。TCB 很快就会超过负荷,且堆栈无法再接受任何新的连接并将现有的连接断开。因为攻击者不用接收来自服务器的 SYN-ACK 信息包,所以他们可以伪造初始 SYN 信息包的源地址。这就使得跟踪攻击的真实来源更加困难。此外,因为 SYN-ACK 信息包没有发送到攻击者,所以这样还为攻击者节省了带宽。
生成这种攻击很容易,只要在命令行输入一条命令就足够了。
#hping3--rand-source–S –L 0 –p
存在的变体也很少,通常为了增加CPU的使用率会将某些异常添加到SYN 信息包。这些可能是序列号或源端口0等合法的异常。
SYN-ACK洪水
SYN-ACK洪水的作用基础是令CPU资源枯竭。从理论上讲,这种信息包是 TCP 3 向握手的第二步,而且在 TCB 中应该有对应的入口。浏览 TCB 将会使用 CPU 资源,尤其 TCB 很大时会耗用更多的 CPU 资源。因此,负荷较重时,这种对资源的使用会影响系统性能。
这也就是SYN-ACK攻击所仰仗的利器。向系统发送一个巨荷的SYN-ACK 信息包会显著增加系统 CPU 的使用率。因此,用于组织 TCB 的哈希算法和哈希表大小之选择会影响攻击的效率(请参阅“概念”和“逻辑缺陷”)。而且,因为这些 SYN-ACK 信息包不属于现有的连接,所以目标机器不得不将 RST 信息包发送到源机器,从而增加了链路上的带宽占用率。对于 SYN 洪水,攻击者为了避免接收到 RST,当然可以伪造源机器的 IP 地址,这样还可以提高攻击者的可用带宽。
这也只需要一条简单的命令就可以进行这种攻击。
一个重要因子是由第三方服务器基于反射机制而生成SYN-ACK信息包的能力。在将SYN 信息包发送到服务器的开放端口时,该服务器将 SYN-ACK 信息包发送回源机器。此时任何服务器都可能为这种攻击充当中继。发送到服务器的简单 SYN 信息包带有伪造的源,其发送到目标时生成 SYN-ACK 返回目标。这种技术让跟踪更加困难。而且,在某些情况下,还可以绕过某些防伪机制。尤其当目标和攻击者属于同一干道而且部署的 uRPF (参阅“防伪”) 距离目标机器和攻击者足够远时,更有可能避开防伪机制。
通过与SYN洪水联结还可以提高此种攻击的强度。SYN洪水在TCB 中创建入口,而TCB因此变得越来越大。由于此时浏览 TCB 所需的时间更长,所以 SYN-ACK 洪水的功效大大增加。
UDP洪水
UDP同样天生就是拒绝服务攻击的传播媒介。按照指定,在封闭端口上接收UDP信息包的服务器将无法到达 ICMP 端口的信息包发送回给源机器。ICMP 信息包的数据部分填充有原始 UDP 信息包中的至少前 64 个字节。因为没有标准限度或额度,所以很可能在封闭的端口上发送巨量的信息包。在为生成 ICMP 而进行负荷极大的必需操作时,,错误的信息包消耗了大量 CPU 资源,最终导致CPU 资源枯竭。
同样,也可以从命令行生成这种攻击。而且,也可以通过伪造而使得ICMP信息包不会降低攻击者的带宽。
异常
异常属于特殊情况,其可以令IP堆栈出现行为错误而造成各种不同的后果,例如崩溃、冻结等等。异常可划分为两大类:非法数据和隔离异常。
非法数据是标准所不予考虑的或予以显式否定的值或内容。大于指定长度的信息包、重叠的TCP标记组合、含非空认证序列号的SYN 信息包或甚至错误的选项类型都属于基于非法数据的异常攻击。
隔离异常是基于那些堆栈不能正常处理的异常情况(即便从标准的视角看它们完全合法)。著名的“死亡之ping”就是关于巨型(但仍然合法)ICMP回显请求信息包。如果信息包带有相同的源地址、目标地址和端口,其仍然是合法的,不过对IP 协议栈有害。古老的 land 攻击最近已脱胎换骨成为 imland,而且正在破坏 IP协议栈。只有少数异常攻击仍然能够利用单一信息包击倒系统。大多数堆栈都已打上补丁程序,而且可能大多数异常都已经过测试和开发。然而,处理这种信息包仍然会占用 CPU 的不少资源。当5 年前异常攻击出现并得到补丁程序的修补时,攻击能力还受到 CPU 和带宽的限制。处理异常情况时产生的额外计算负担不太重要。如今,工作站与服务器之间的差距日益缩小,而且任何人都可以使用宽带。这种条件下可能发动巨型负荷的异常,使得目标机器的 CPU 资源枯竭。
同样,也可以从单一的命令行实现这种攻击。
#hping3--rand-source–SAFRU –L 0 –M 0 –p --flood
同样,仍然可以选择进行伪造来进行有效有效攻击。
应用程序级攻击
网络已证明易受攻击。然而网络只是全球系统中的传输部分,是中断通信的良好手段。不过,应用程序通常是实际的攻击目标,而且这些应用程序也受到无数的拒绝服务问题的袭扰。
基于会话的攻击
大多数应用程序连接是通过会话(通常经过TCP机制的标识) 来处理。同步会话的数量是影响给定应用程序性能的重要因素,因此必须限制会话的数量。如果该限制只是基于网络和传输信息(IP+TCP),那么生成拒绝服务是很容易的。一次简单的攻击便可打开 TCP 会话并让这些会话保持打开状态,从而可以迅速填满所有可用的会话槽,阻止建立任何新的会话。这种“待决”会话攻击是与 SYN 洪水等价的 7 层攻击。但是如果在第 4 层上需要有数千兆数据流量,则需要在几秒内发送数千个信息包来阻止建立任何新的会话,。
例如,很容易在web服务器上实施这种攻击。
完整和合法的会话也可以破坏应用程序,简单的F5攻击只需保持F5 键处于按下状态就可以强制完全刷新在 Internet Explorer 上加载的 web 页面。使用这种古老而简易的攻击,便会仅仅因为需要服务的 web 页面数过多而导致资源枯竭。这种会话洪水攻击还可以破坏通信信道的其他关键路径。
− 电信链接:从服务器传送到客户机的数据量可以填满与因特网的链接。这种情况下,通过该链接无法进行任何通信;针对性的拒绝服务攻击漫延至全球;
− 服务器应用程序:大量同步连接可以达到服务器处理同步会话能力的上限,这种攻击类似于“待决的”会话攻击。如果未设置上限,则处理大量会话时可能消耗绝大多数的系统资源。
− 第三方应用程序:大多数应用程序都链接到中间软件和数据库。在任一情况下,由于这些第三方应用程序在处理原始应用程序发出的巨量请求时可能遇到内部问题,因此就可能出现瓶颈。这些结果也可能是内部缺陷造成的(如下所述)。
继F5攻击技术之后,会话洪水技术便再无发展。不过,人们已发现且广泛使用平衡因子而使得这种攻击仍然是拒绝服务中一种最恶性的可能情形。
概念和逻辑缺陷
开发的应用程序是为了在正常情况下提供特定的服务,而攻击的目的就是令应用程序的行为方式出现异常。这种攻击的某些机制是通用的,但是这种攻击的大多数机制是专用于各个不同应用程序的概念和逻辑,因此想要罗列出全部有缺陷的应用程序和消灭这些缺陷的方法是不可能的。
内部
内存处理显然是可以导致拒绝服务攻击的第一内部机制。简单的“缓冲溢出”使得重写堆栈成为可能,从而让应用程序乃至整个系统都不稳定。在不同级别的应用程序通道中缺少输入检查,也使得攻击会沿着第三方应用程序传播而增加攻击的可能性。
然而,内部缺陷更加难以琢磨,更加难以修补。依赖于NFA引擎的规则表达式可能极具危险性。NFA引擎分析表达式的所有可能路径。如有一个字符令搜索失效,该引擎便会返回前一个匹配点并重试表达式的所有组合。若针对精心制作的输入而启动像通配符 * 之类极耗资源的运算符和像 (int|integer) 之类 OR 条件的组合,则会产生致命的影响。
SQL也是逻辑攻击的一种明显传播媒介,因为在大型而复杂的表格上,SQL查询可能在应用程序级生成不同的错误行为。首先遇到的缺陷就是缺少索引和数据库结构中通常使用的字符串列。如果没有正确的索引,涉及对同一个表的多个列进行筛选和排序操作的SQL 请求便会产生指数级数量的操作,这会消耗巨量的 CPU 资源并显著增加应用程序响应时间。如果搜索和排序的字段是字符串,则这些操作消耗的资源甚至会更多。
第二种缺陷与内存有关。在超大型表中,类似于“SELECT*”的请求可能产生数百万个结果。临时数据库结构和用于存储结果的应用程序结构消耗大量内存,结果可能会导致各种后果:数据交换过量、响应时间延长或整个系统拒绝服务。
另一种重要的拒绝服务攻击可以针对用于组织和搜索内存中数据的哈希函数来实施。哈希表入口是指向对象链接表的指示符。搜索操作需要两个步骤。首先,计算哈希函数以在哈希表中查找匹配的入口。然后,逐个比较列表中的对象。冲突是这种机制的第一个缺陷。如果哈希表不够大和/或哈希算法使得容易产生冲突,便可能会产生多个入口而与哈希表中相同的入口匹配。按这种方式对表格进行的任何搜索操作都将需要执行很多运算,而且消耗CPU资源,其本身很可能导致拒绝服务,或者会加强针对依赖于这种机制的某个应用程序的攻击效果。
运行模式
每个应用程序都有特定的功能和运行方式。因此要描述出所有的缺陷是不可能的。然而,某些典型和有效的示例可以对常见的无掩蔽性操作提供线索。
DHCP服务器容易遭受的攻击尽管很微小但却能快速耗尽其可用IP地址的池。前面已经分析过协议本身的缺陷(请参阅第 3 层连接攻击)。除此之外,在 DHCP 交换的第一阶段中,DHCP 服务器在没有得到来自客户机的任何确认情况下会锁定 IP 地址。令 DHCP 服务器用尽可用的 IP 地址便只是使用 chaddr 数据字段中指定的不同 MAC 地址来发送多个 DHCPDISCOVER 请求的问题。甚至不需要伪造 MAC。广播、缺少认证和“早期处理”组合起来构成拒绝服务攻击的关键因素。
另一种“先进”的攻击是基于设计不良的运行方式,这就是DNS服务器的洪水攻击。当DNS 服务器接收到对不在其缓存中的名称之解析请求,或当请求指定应答必须具有权威性时,服务器将请求发送到 TLD(顶级域名)服务器,以便获得域的 SOA(颁发机构起始)地址。一旦获得该地址,目标 DNS 服务器便向 SOA 服务器发出另一个请求以便解析该请求的名称。获得应答后,便立即将这些应答发送回给客户机。由于不需要由客户机进行认证,且客户机与服务器之间的通信是基于 UDP 协议,所以很轻易就可以将数千个请求从伪造的来源发送到服务器。可以对不同级别的攻击效率作如下区分。
− 针对不存在的域上主机之请求:这种情况下,TLD 将一个错误发送到目标 DNS 服务器,该服务器再将该错误转发到客户机。这种影响相对较低,而且需要攻击者提供大量请求。然而,很轻易就可以创建一个工具来生成这种攻击,因为任何字段(主机、域)可以是随机的,且不必是真实字段。
− 针对极少数现有域上主机之请求:这种情况下,目标服务器就每个域向 TLD 发送一个请求以获取 SOA。然后,把来自攻击者的每个请求转发到 SOA。不存在的主机会生成错误。另一方面,与现有主机有关的请求从 SOA 生成应答,这些应答是转发到源的较大信息包。这种情况下,较高的数据流量和更重要的处理可以提高攻击的效率。因为查找几个现有的域比较简单,所以这种攻击仍然相对容易实施。然而,攻击的效率主要取决于这些域的 SOA 对目标服务器发送给它们的大量请求进行处理的能力和这些域上众多主机名的可用性。
− 针对多个现有域上主机之请求。在这最后一种情况下,几乎所有发送到目标服务器的请求都会令目标服务器产生到 TLD 的请求,随后便是到 SOA 的请求和对应答的处理。这种攻击很难实施,因为它需要定义包含数千个现有域和主机的列表。然而,它特别有效,只在每秒内进行几千次请求就能使得大多数 DNS 服务器崩溃。
这种DNS的情况之出现大都是因为使用无态协议,使得攻击者可在不受影响的情况下在服务器端产生较高的数据流量和处理负荷。
对上下文和会话的处理是应用程序中另一常见的重要缺陷。在SMTP服务器对HELO 命令参数的有效性实施特定检查的情况下,由于不能对结果进行即时处理而会增强这一缺陷的影响。根据标准,只有出现 RCPT TO 命令时才可以拒收邮件。因此,建立一个会话并发出数千个 HELO 请求将会让目标服务器重复处理参数,这些参数通常位于规则的表达式上。最糟糕的情况是在执行名称解析时,因为这会添加更多的处理和数据流量。因为单条 HELO 命令约有 100 个字节,所以有可能从通过宽带接入而连接到因特网的标准 PC 对邮件服务器发动十分有效的攻击。如果一检测到异常便中断会话,则这种攻击不可能实现。
改善效率
大多数拒绝服务攻击实施起来非常简单。然而某些情况下,标准PC和宽带接入并不足以发动有效的攻击。尤其当在目标基础结构上实施群集和负载平衡之类机制时更是如此。在此情况下将会把一个单一的目标IP 地址物理链接到许多服务器,从而产生大规模攻击需求。
有两种方式能使得攻击在这种情况下有效。第一种方式是找到一些提高攻击媒介能力(信息包、会话的数量或带宽等)的平衡因子。第二种方式取决于影响通信路径上设备或资源的某些副作用。
小型信息包
最常见的副作用是需由内联网络或安全设备来处理的巨量小型信息包的影响。根据在这些设备上实施的功能,将信息包从一个接口转发到另一个接口可能需要若干操作。简单的路由器必须根据其路由表做出决策。在信息包筛选操作中,必须检查第4层标头来验证筛选器。有态检验因需要检查会话表而增加了复杂性。像逆向代理等最后一个应用程序层设备必须在第7 层处理信息包。像信息包销毁或 NAT 等某些其他操作甚至需要更多的处理,因为必须重写信息包并重新计算若干校验和。
小型信息包产生的影响很容易用数字来说明。一般来说,指定用于处理特定带宽的设备在处理64字节的信息包时几乎不能提供大于10% 声明性能的吞吐量。任何依赖于小于 100 字节信息包的攻击可能首先会令路由器和防火墙崩溃,而不仅仅是影响目标服务器。