计算机应用研究
APPLICATION RESEARCH OF COMPUTERS
2000　Vol.17　No.5　P.44-47



对基于TCP/IP协议的几个网络安全问题的分析与讨论
赵季中　宋政湘　齐勇
摘  要  从对TCP/IP协议的分析出发，针对TCP/IP协议本身存在的安全隐患，讨论了几种可能的攻击策略，并给出了针对这些攻击的一些防范措施，为基于TCP/IP协议的网络安全建设提供了建设性的参考。
关键词  TCP/IP协议  网络安全
1  引言
　　目前，网络技术得到日益广泛的使用。网络在带给人们方便的同时，网络上的不安全因素也给人们带来不少麻烦。
　　根据美国FBI的调查，美国每年因为网络安全造成的经济损失超过170亿美元。75%的公司报告财政损失是由于计算机系统的安全问题造成的。超过50%的安全威胁来自内部；只有17%的公司愿意报告黑客入侵，其它的由于担心负面影响而未声张。59%的损失可以定量估算。平均每个组织损失402,000美元。
　　入侵的来源首先是内部心怀不满的员工，其次为黑客，另外还有竞争者。
　　无论是有意的攻击，还是无意的误操作，都会给系统带来不可估量的损失。攻击者可以窃听网络上的信息，窃取用户的口令、数据库的信息；还可以篡改数据库的内容，伪造用户身份，更有甚者，攻击者可以删除数据库的内容，摧毁网络节点，释放计算机病毒。
网络系统的安全威胁主要来自以下几个方面：
　　(1)操作系统的安全性，目前流行的许多操作系统均存在网络安全漏洞；
　　(2)防火墙的安全性，防火墙产品自身是否安全，是否设置错误，需要经过认真检验；
　　(3)来自内部网用户的安全威胁；
　　(4)缺乏有效的手段监视网络系统的安全性；
　　(5)采用的TCP/IP协议簇本身的安全隐患。
　　由于TCP/IP协议在网络中的广泛应用以及TCP/IP协议本身在安全性上的缺陷，大多数攻击都是基于TCP/IP协议的。为了讨论基于TCP/IP协议的网络安全问题，有必要首先了解TCP/IP协议。
2  TCP/IP协议简介
　　TCP/IP是一个允许不同软硬件结构计算机进行通信的协议族，Internet就是建立在TCP/IP协议之上的。一个协议族通常是由不同的层次所组成，对于TCP/IP协议来说，通常可分为四层如表1。
表1

应用层
WWW，EMAIL，FTP等
传输层
TCP，UDP
网络层
IP
网络访问层
ARP，RARP，Hardware Interface

　　．网络访问层：又称为数据链路层、网络接口层，负责处理不同通信媒介的细节问题，与具体设备如以太网、令牌环网、网卡等有关。
　　．网络层：负责网络中的数据包传送，并定义了通用数据包格式和IP协议；IP提供了非面向连接的、非可靠的数据报服务；每一个Internet上的接口都必须有一个唯一的IP地址；网络层同时处理数据包路由和拥塞避免等事务。
　　．传输层：与源主机和目的主机之间的进程通信提供数据流(一个无报文丢失、重复和失序的正确的数据序列)。当一个源主机上运行的应用程序要和目的主机联系时，它就向传输层发送信息，以数据包的形式送到目的主机；传输层同时还处理流控，拥塞控制等事务。在传输层有两个端到端的协议：TCP和UDP。TCP为通信应用提供了可靠的数据流。UDP和TCP不一样的是它提供的是非可靠的，非面向连接的数据报传送。它不提供确认、发送排序和数据流控制，UDP信息可能会丢失、重复和次序颠倒，所以在应用层必须增加所需的可靠性。
　　．应用层：这一层包括所有的高层协议；例如：Telnet，一个远程登录的虚拟终端协议。Ftp，负责机器间的数据传输。
　　传输层与网络层在功能上的最大区别就是前者提供进程通信能力，后者不提供。在进程通信的意义上，网络通信的最终地址不仅仅是主机地址，还包括可以描述进程的某种标识符。为此，TCP/UDP提出协议端口(Protocol port)的概念，用于表示通信的进程端口是一种抽象的软件结构(包括一些数据结构和I/O缓冲区)。应用程序(即进程)通过系统调用与某些端口建立联编后，传输层传给该端口的数据都被相应进程所接收。端口操作类似一般的I/O操作，可以用一般的读写原语(Read、Write)访问。每一个端口都有一个叫端口号的整数标识符，TCP和UDP都允许长达16位的端口值。TCP使用一种介于集中和动态分配之间的端口分配方法，将端口分为保留端口和自由端口两部分。
　　通过对TCP/IP协议的了解，下面我们来分析和讨论几种基于TCP/IP协议的攻击及可能的对策。 
3  链路层上的攻击及对策
3.1  嗅探
　　网络嗅探就是利用网络上的接口接收不属于本主机的数据。因为为每一对主机建立专门的连接线路代价太高，计算机网络通常建立在共享信道上，在这种网络上嗅探特别方便。以太网就是这样一个共享信道的网络，其数据报头包含目的主机的硬件地址，只有硬件地址匹配的机器才会接收该数据包。一个能接收所有数据包的机器(或接口)被称为杂错节点。通常账户和口令等信息都以明文的形式在以太网上传输。一旦被黑客在杂错节点上嗅探到，用户就可能会遭到损害。
3.2  对策
　　网络分段：一个网络段包括一组共享低层设备和线路的机器，如交换机，动态集线器和桥等设备，可以对数据流进行限制，从而达到防止嗅探的目的。
　　加密：如果数据流中被加密部分过多，必须采用特殊的协议，则与现有的标准网络不相容。如果只对应用层加密，则大部分与网络和操作系统有关的敏感信息未被保护。
　　一次性口令技术：口令并不在网络上传输而是在两端进行字符串的匹配，客户端利用从服务器上得到的Challenge和自身的口令计算出或从列表中选择一个新的字符串并将之返回给服务器。在服务器上利用比较算法进行匹配，如果匹配，连接就被允许建立，所有的Challenge和字符串都只使用一次。
　　禁用杂错节点：安装不支持杂错的网卡，通常可以防止IBM兼容机进行嗅探。
4  网络层和传输层上的攻击及对策
4.1  ICMP通道
　　ICMP (Internet Control Message Protocol)是IP层的一部分。它在IP软件和机器(主机或路由器)间传送出错和控制信息的无连接协议。ICMP数据包被放置在IP数据报文中。ICMP的报头都有三个相同的域：种类(一个字节)、代码(一个字节)、校验和(两个字节)。ICMP报文结构如下：

　　PING命令发送一个ICMP回应请求(种类8)。任何收到回应请求的主机都会返送一个回应回答给源主机，此命令可用来检验一个目的主机是否可到达。请求和回答信息都包括一个可选的数据域，因为PING命令普遍存在于TCP/IP网络以及其子网中，所以防火墙和网络都允许PING通过而忽略了它的危险性―可被用来进行服务拒绝攻击。同时没有设备可以对PING报文中的数据域内容进行检测，利用PING还可以在得到允许的网络中建立秘密通道。有工具可以利用这一点在系统中开一个后门，搜集目标上的信息，并进行秘密通信。
4.2  检测和防止
　　如果ICMP回应被允许的话，那么数据包过滤将无法检测是否有秘密通道的存在。对ICMP这样一个无连接的协议，伪装的主机(利用伪造的IP地址)仍然可以将含有秘密数据的回应请求发到目标主机，引起该主机的回应，所以限定ICMP回应到信任主机是没有用的。现在已经有了只能数据包过滤器可以检测数据域的内容是否合法，但应用不是很广泛，也不能完全防止欺骗。最好的办法就是拒绝网络上的所有ICMP回应。
5  IP欺骗及对策
　　TCP/IP协议的信任机制十分方便、有用，但对攻击者来说却是十分脆弱的，因为身份确认机制只是基于IP地址的。IP欺骗攻击充分利用了确认的弱点，攻击者可以把他的主机EVIL.COM伪装成被主机TARGET.COM信任的主机FRIEND.COM。具体做法是在发出的所有数据包中都用信任主机FRIEND.COM的IP地址代替他的主机IP地址。被攻击主机就相信入侵者就是信任主机FRIEND.COM。
5.1  ARP欺骗
　　ARP (Address Resolution Protocol)用来进行32位的IP地址和物理地址(如以太网地址)的互相映射。该协议大致工作过程如下：IP数据包发送时会被发送到同一个子网中的主机或利用网关作第一个驿站。无论哪种情况，都需要以太网物理地址用来发送包含IP数据包的以太网物理帧。首先源主机先在ARP Cache中进行查询，如果找不到与IP地址相对应的物理地址，就会向网络上的所有主机广播一个包含目的主机IP地址、本机的物理地址和IP地址的特殊物理帧。每一个收到此帧的主机都会刷新自身ARP Cache中的IP－物理地址联编，同时，目的主机还会向源主机发送一个包含自身IP地址和硬件地址的ARP回答。源主机收到此回答后就会刷新Cache，此时就可以发送数据报了。
　　Cache中的数据通常几分钟后就会过期，攻击者就可以伪造IP－物理地址联系。攻击者可以暂时使用不工作的主机的IP地址，源主机可能关机、未与网络连接或被攻击者改变了原来的IP地址。过了几分钟后，Cache中的原数据过期后，攻击者就可以入侵信任服务器。
防止ARP欺骗：信任主机可以使得被信任主机的硬件地址常驻Cache，常驻Cache的数据不会在几分钟后过期，并可以用ARP等命令手工加入。
　　另外，可使用专门的安全ARP服务器来回答ARP请求；最后，由于路由器可以防止子网之间的ARP欺骗，要将被信任主机和不安全的子网分开。
　　检测ARP欺骗：服务器可以通过向RARP (Reverse Address Resolution Protocol)服务器询问来检测客户的ARP欺骗，RARP服务器保留着网络中硬件和相关IP地址的信息。
5.2  路由欺骗
　　每一个IP数据报或物理帧都在主机的网络层被检查，决定是转发给同一个子网中的主机(包括它自身)还是下一个驿站。
　　路由欺骗有几种方法，都是通过伪造路由表，错误引导非本地的数据报实现。
　　基于ICMP的攻击：当一个源的数据报必须发给另一个路由器时，当前路由器会给此源发送一个ICMP重定向错误信息。当源主机收到此信息时，会更新路由表。这样，通过发送非法的Redirect信息就可以进行路由欺骗。但是，因为忽略重定向信息并不影响数据报的发送，可以通过设置主机忽略重定向信息来防止路由欺骗。另外，检测本机的常驻ARP数据，看此信息是否来自合法的路由器，也可以防止路由欺骗。
　　基于RIP的攻击：现代计算机网络通常使用动态路由算法，普遍采用的算法是距离―向量算法：每一个路由器保留一个向量表指出到达目的主机的距离和路线，距离度量值由驿站的个数、延时、预期拥塞程度或数率决定，路由器累加编程进每个路由接口所花费的距离度量值并选择累加值最小的路由。网络中包括Active和Passive节点，Active节点周期性发送RIP报文到所有与其连接的Passive节点，通知它们当前的路由代价(距离度量值)，对每条路由，路由器一般只记忆在RIP更新路由过程中检测到的最小度量值。当发现一条较短路由时，则利用这条新路由代替先前的最短路由。因此，通过使用RIP特权的主机的520端口广播非法路由信息就可以达到欺骗的目的。所有的Passive节点都会受到影响。如果Passive节点中包括路由器，错误信息还会被扩散。防止RIP路由欺骗的方法就是禁止路由器被动使用RIP和限制被动使用RIP的范围。
　　基于源路由的攻击：一般来说，IP路由过程中是由路由器来动态决定下一个驿站。但是IP可以选择源路由，即由发送者指定路由。有以下两种形式：
　　严格源路由：给出完整的路径；
　　非严格源路由：发送者只是给出几个数据报必须经过的IP地址。
　　下面的例子给出这种攻击的形式：
　　服务器TARGET.COM扩展信任到包含FRIEND. COM(合法IP为vvv.xxx.yyy.zzz)的数个主机。攻击者想利用他的主机EVIL.COM冒充FRIEND.COM从TARGET.COM获得某些服务。首先，攻击者修改距离EVIL.COM最近的路由器，使得到达此路由器的包含目的地址vvv.xxx.yyy.zzz的数据报以EVIL.COM所在的网络为目的地；然后，攻击者将EVIL.COM的IP地址改为vvv. xxx.yyy.zzz；最后，EVIL.COM利用IP欺骗向TARGET. COM发送源路由(指定最近的路由器)数据包。当服务器回送数据包时，就传送到被更改过的路由器。只要在TARGET.COM的网络禁用此路由就可以防止这种攻击。
5.3  DNS欺骗
　　当主机必须将一个域名转化为IP地址时，它会向DNS名字服务器发送一个查询请求。同样，当要把IP地址转化成域名时，会发送一个反向查询请求。
　　当DNS服务器中的数据被攻击者破坏时，DNS欺骗就会发生。因为网络上的主机都信任DNS服务器，所以一个被破坏的DNS服务器可以将客户引导到非法的服务器，也可以欺骗服务器相信一个IP地址确实属于一个被信任客户。
　　通过在本机上保留一个域名和相应IP地址的数据库，可以部分防止DNS欺骗。每一个服务器至少要保留信任主机的信息。此外，一个冒充被信任客户的攻击者通常要进入负责保留攻击者的IP地址的DNS服务器，修改反向查询表。然而，合法域名和IP地址的联系通常由负责客户域名的DNS服务器保存。这两个服务器可以在物理上是独立的，就算不独立，正向和反向查询表也要保存在不同的文件中。这样，即使是反向查询表被破坏，也可以利用未受损的正向查询表进行检验 (这种方法尤其适用于对付来自外部网络的进攻) 。下面的例子将说明DNS欺骗是如何进行的。
　　一个攻击者修改DNS服务器(COMPROMISED. DNS.COM)上指向它的主机EVIL.COM的反向查询入口，使得他的主机看起来像被TARGET.COM信任的主机FRIEND.COM。当EVIL.COM向TARGET.COM发送请求时，TARGET.COM会去查询COMPROMISED. DNS.COM上的反向查询表，得到FRIEND.COM的假象。使用正向和反向查询表进行交叉查询可以防止这一类的攻击。
5.4  TCP连接欺骗和盲攻击
　　远程过程调用(Remote Procedure Call)可以使用户在不需输入密码的情况下执行远程操作，如UNIX系统下的rlogin、rcp、rsh等命令。主机间的信任关系可以很方便地设定。这样，用户就可以用rlogin、rsh等RPC命令从一台主机远程访问另一台主机而不需要在此输入口令。这些RPC命令是一些基于客户机/服务器的TCP应用。如果主机之间建立了上述的信任关系，它们就仅仅通过TCP包中的信源IP地址来进行用户身份的确认。RPC在带来方便的同时，也带来潜在的安全问题。TCP连接欺骗攻击就是一种利用这种信任关系的(基于IP欺骗)“盲”攻击。
　　防止TCP连接欺骗的方法包括：不使用基于IP地址的身份确认，关闭所有的RPC命令，或者让用户在使用RPC时输入口令。修改TCP模块，选择更好的ISN算法，使得TCP发送序号空间的增加和改变是随机的也是很好的方法。
6  拦截及对策
　　上述攻击都是基于信任主机机制的，当要求口令确认时，这些欺骗方法就失效了。拦截就是一种基于嗅探和IP欺骗的新攻击方法，攻击者通过在确认后拦截的方法来躲避一次性口令或其它严格的身份确认。当合法用户通过登录进入一个远程站点，攻击者可以拦截此连接来攻击站点。如果是管理员的连接被拦截，攻击者有可能更改超级口令或增加一个特权帐户。
攻击者可以使TCP连接两端进入不同步状态，此时，这两端就不能再进行数据交换，入侵者的主机就会向两端发送伪造的数据包。
　　最好的防止拦截的方法就是利用基于加密的终端协议，这些协议可以降低拦截的威胁。因为，尽管拦截者可能获得了正确的数据，但由于不能解密，并不能知道其内容。
7  服务拒绝攻击及对策
　　在服务拒绝攻击中，一个用户占用了太多的公用资源，使得没有资源留给其他用户。有两种服务拒绝攻击：第一种是攻击者破坏资源，使得其他用户无法使用；另一种是攻击者加载过多的服务将资源全部使用，同样使得其他用户无法使用。主要有以下几种攻击形式。
7.1  服务过载
　　当从一个主机向服务器发送太多的服务请求时，就会发生服务过载。在某些情况下，系统有可能会崩溃。一个典型的例子就是Finger炸弹。客户机用Finger来搜集主机上的用户信息，如果John在主机VICTIM. COM上有一个帐户，那么SNOOP.COM上的用户就可以执行以下的命令来攻击Finger John的帐户。
　　SNOOP >finger John@victim.com
　　此时finger命令被认为是从SNOOP主机上来的。如果以如下的形式：
　　SNOOP>finger John@victim.com@third.com
　　就会被认为是从third.com上传来的finger命令。
　　SNOOP&gt; finger John@@@@@@......@@victim. com就会让victim.com重复finger自身。如果重复次数足够多的话，内存、缓冲区、硬盘等都会被充满，使得机器崩溃。防止攻击的方法就是禁用finger服务。
7.2  信息淹没
　　当一个用户使得网络上的某个系统速度降低，防止它以正常的速度处理当前工作时，就会发生信息淹没，向服务器发送上千个ICMP回应请求(使用ping命令)就可以达到目的。这种手段通常用来攻击确认服务器，使得确认服务器工作过载，无法正常响应客户的请求。这就使得攻击者能够冒充合法的确认服务器，回答伪造的信息，从而获得特权帐户。信息淹没也可以用来阻塞网络。在两个提供标准TCP/UDP服务的端口间来回传送数据包也可以达到此目的。关掉可能产生无限序列的服务就可以防止这种攻击。
7.3  阻塞
　　TCP用来建立连接的三次握手协议可被用来进行一种服务拒绝攻击，即前面提到的TCP连接欺骗中用来阻塞FRIEND的方法。服务器(FRIEND)向客户机(EVIL冒充的UNREACH)发送一个SYN/ACK信息但却收不到ACK信息，建立了一个半连接。服务器在内存中建立一个队列用来放置所有的等待连接，这个队列的大小是有限的，当等待连接过多时就会溢出。尽管半连接一段时间后就会被清除，但只需不断给服务器发送伪造的SYN请求就可以抵消清除的效果。为了防止这类攻击，可以增加等待连接的队列的长度并减少半连接的保存时间。
8  结论
　　综上所述，由于TCP/IP协议本身存在的一些缺陷，给网络安全带来了一些隐患，必须采取一些附加的安全防范措施。我们这里仅讨论了一些针对TCP/IP协议的安全问题，而由操作系统和防火墙所带来的网络安全问题是大家需要另外注意的问题。
赵季中(西安交通大学计算机科学与技术系  西安 710049)
宋政湘(西安交通大学计算机科学与技术系  西安 710049)
齐勇(西安交通大学计算机科学与技术系  西安 710049)
参考文献
1，周明天, 汪文勇. TCP/IP网络原理与技术. 北京: 清华大学出版社, 1993
2，D. Brent Chapman. 构筑因特网防火墙. 北京: 电子工业出版社, 1998
收稿日期：1999-12-16
