网络通信 频道

实例分析:抵抗ARP网络攻击有高招

    编者按:本文在分析针对ARP协议弱点进行ARP欺骗所产生的局域网安全问题的基础上,通过与传统的防止ARP欺骗的方法相比较,提出了一种新的防止ARP欺骗的方法,同时给出了具体的代码实现和详细的注释。

一:ARP协议介绍分析

   IP数据包常通过以太网发送。以太网设备并不识别32位IP地址:它们是以48位以太网地址传输以太网数据包的。因此,IP驱动器必须把IP目的地址转换成以太网目的地址。在这两种地址之间存在着某种静态的或算法的映射,常常需要查看一张表。地址解析协议(Address Resolution Protocol,ARP)就是用来确定这些映象的协议。ARP为IP地址到对应的硬件地址之间提供动态映射,这个过程是自动完成的,在每台主机上都有一个ARP高速缓存,这个高速缓存存放了最近IP地址到硬件地址之间的映射记录.高速缓存中每一项的生存时间一般为20分钟。

    ARP协议弱点

   ARP作为一个局域网协议,是建立在各个主机之间相互信任的基础上的,因此存在安全问题。

(I) 主机地址映射表是基于高速缓存的,动态更新的。由于正常的主机间的MAC地址刷新都是有时限的,这样恶意用户如果在下次交换前成功地修改了被欺骗机器上的地址缓存,就可进行假冒或拒绝服务攻击。

(II)可以随意发送ARP应答分组。由于ARP协议是无状态的,任何主机即使在没有请求的时候也可以做出应答,因此任何时候都可以发送ARP应答。只要应答分组是有效的,接收到ARP应答分组的主机就无条件地根据应答分组的内容刷新本机的高速缓存。

(III)ARP应答无须认证。由于局域网内的主机间通信基本上是相互信任的,因此,只要是收到来自局域网内的ARP应答分组,就会将其中的MA C/IP地址对刷新到本机的高速缓存中,而不进行任何认证。

1.3 ARP欺骗针对ARP协议的弱点,下面就举例说明如何进行ARP欺骗。
如图1所示:3台主机A,B,C

    我们通过主机A对主机B进行ARP欺骗。首先,在主机A上伪造一个ARP应答分组,在这个应答分组中,将主机A的ip地址192.168.0.3与主机A的MAC地址MAC1绑定,然后向主机B发送这个ARP应答分组。当主机B收到我们在主机A上伪造的ARP应答分组后,由于局域网内的主机间通信基本上是相互信任的,所以主机B就会更新自己的ARP高速缓存表,将192.168.O.3与MAC1相关联,那么在主机B广播ARP REQUEST包更新缓存之前,主机B发往主机C的所有数据报都将发往主机A,这样就对主机B成功地进行ARP欺骗。

    二.传统的防止ARP欺骗的方法介绍

  通过建立静态ARP表并且禁止某个网络接口做ARP解析来对抗ARP欺骗攻击.
在solaris系统或者linux系统下,通过编辑/etc/static-arp-entry文件,输入类似内容:

192.168.0.1 MAC1 192.168.0.3 MAC3

    在/etc/re2.d/S69inet启动脚本中加入/usr/sbin/arp-s-f/etc/static-arp-entry这条命令就设定了静态ARP表,破坏了动态ARP解析过程。但是,Solaris系统下的静态ARP表项可以被动态刷新,仅仅依靠静态ARP表项并不能对抗ARP欺骗攻击,Solaris系统中静态ARP表不会过期,相反纵容了ARP欺骗攻击,因为虚假的静态ARP表项不会自动超时消失。为了对抗ARP欺骗攻击,对于Solaris系统来说,应该结合“禁止相应网络接口做ARP解析”和“使用静态ARP表”的设置。在/etc/rc2.d/S69inet启动脚本中加入,/sbin/ifconfig netif- arp命令,netif接口不会发送和接收ARP报文,通过配合使用静态ARP表来完成正常网络通信.这种方法充分地防止了ARP欺骗,但是对网络影响较大,破坏了动态ARP解析过程,使局域网的灵活性降到了相当低的程度,局域网中随时加入一台主机都必须在主机上加入相应的静态ARP表项。怎样才能保证在防止ARP欺骗的同时又保持局域网的较大灵活性呢?下面,就来讨论一下在ARP输入模块中加入控制代码防止ARP欺骗的实现.

三.一种新的防止ARP欺骗的方法介绍及代码实现

   当一个ARP分组到达主机时,网络设备驱动程序会将它传递给ARP输入模块arp-in处理,因此我们可以在ARP输入模块中加入控制代码,对来自局域网中发送的ARP应答分组中的源MAC地址及源ip地址进行验证,以此来防止任何伪造的ARP应答分组对主机的高速缓存进行刷新达到欺骗的目的。具体如下:先取出ARP应答分组中源MAC地址将其与高速缓存中所有的MAC地址比较,在高速缓存中发现有相同的MAC地址,则取出与此MAC地址相对应的ip地址与ARP应答分组中的源ip地址相比较,如果不同则丢弃这个应答分组。代码实现:

/arp-in.c- arp-in* /
#include <conf.h>
#include <kerne1.h>
#include <network.h>
void arpsend(stmct arpentry* );
int arp-in(pni,pep)
struct netif *pni;
struct ep *pep;
{struct arp *parp (struct arp *)pep一>ep-data;
struct arpentry pae: ? ?
for(i=0;i<ARP-TSIZE;++i)
{
pae=&arptable[i];
if(memcmp(SHA(parp),pae一>hwa,EPALEN))//取出arp分组中的MAC地址与高速缓存中的源MAC地址比较
{
if(!memcmp(SPA(parp),pae一>pra,IPAlEN))//取出arp分组中ip地址与高速缓存中的源ip地址比较
{
freebuf(pep);
retum ok;
}
}
} ??

四.性能分析

  本方法建立在局域网的安全性与灵活性的基础上,采用对源MAC地址和源口地址在高速缓存中进行验证,并不是将网络安全关系单独建立在IP地址上或硬件MAC地址基础上,而是采用把网络安全关系建立在ip+mac的基础上,同时本方法的功能类似与静态的MAC地址与IP地址的绑定,使主机不能刷新MAC一>IP转换表,但是实现的策略又比静态绑定灵活,当局域网络中加入新的主机时,局域网上的主机接收到ARP应答分组,通过代码验证后发现高速缓存中无相同的MAC地址后,再取出IP,在高速缓存中加入相应的MAC一>IP绑定,所以此方法在相当大的程度上避免了ARP欺骗,防止了主机对任何ARP应答分组的响应,保证了局域网内信息的安全性和机密性,同时又保证了网络的灵活性能不受到很大的影响.

    由上面的分析可以看出,这种防止ARP欺骗的方法,通过在ARP输入模块arp-in中加入控制代码,改善了ARP协议中对来自同一局域网中的ARP应答分组不加以验证的弱点,保证了即使在局域网中也拥有较高的网络安全性能,这是对网络安全技术的有效扩展和补充,有较好的实际应用价值。

0
相关文章