首页 -> 安全研究
安全研究
安全漏洞
多家厂商IPSEC实现远程拒绝服务攻击漏洞
发布日期:2002-10-19
更新日期:2002-10-23
受影响系统:
Apple MacOS X Server 10.2描述:
Apple MacOS X 10.2 (Jaguar)
FreeBSD FreeBSD 4.6-STABLE
FreeBSD FreeBSD 4.6-RELEASE
FreeBSD FreeBSD 4.6
NetBSD NetBSD 1.6 beta
NetBSD NetBSD 1.5.3
NetBSD NetBSD 1.5.2
NetBSD NetBSD 1.5.1
NetBSD NetBSD 1.5 x86
NetBSD NetBSD 1.5 sh3
FreeS/WAN FreeS/WAN 1.9.6
FreeS/WAN FreeS/WAN 1.9.5
FreeS/WAN FreeS/WAN 1.9.4
FreeS/WAN FreeS/WAN 1.9.3
FreeS/WAN FreeS/WAN 1.9.2
FreeS/WAN FreeS/WAN 1.9.1
FreeS/WAN FreeS/WAN 1.9
Global Technology Associates GNAT Box Firmware 3.3
Global Technology Associates GNAT Box Firmware 3.2
Global Technology Associates GNAT Box Firmware 3.1
BUGTRAQ ID: 6011
CVE(CAN) ID: CVE-2002-0666
IPSEC是一套IP安全扩展,提供验证和加密功能,它包含两种类型的包ESP和AH,分别有IP协议50和51代表。
多个IPSec实现在处理畸形ESP包的时候存在问题,远程攻击者可以利用这个漏洞进行拒绝服务攻击。
ESP(封装安全负载)是提供包级别加密的IPSEC协议,在多数情况下,它也包含其他级别的验证。ESP包一般类似如下:
+---------------------------+
| IP header (proto 50) |
+---------------------------+
| SPI | 4 字节
+---------------------------+
| Sequence number | 4 字节
+---------------------------+
| ...data... | M 字节负载
+---------------------------+
| Auth data | N 字节, 根据算法
+---------------------------+
SPI是安全参数索引,这个SPI与IP目标地址一起标识这个包属于SA(Security Assocation)。SA(和它们的SPIs)可以手工建立,或者通过使用ike/isakmp密钥协商来动态建立。序列号增加数值用于防止回放攻击。Auth data的大小由SA使用的特定加密验证算法确定,不过一般都是12字节。
当接收上面这样的一个包时,IPSEC实现会查询基于SPI的相应SA,检查序列号,然后校验数据是否正确。
在IPSEC实现中存在一个错误,其没有检查auth data是否真正提供了,或者检查不充分或不正确。结果可导致可以伪造包含已知源,目的地址,SPI和高序列号码,非常短的ESP包,发送给IPSEC实现处理时使内核出现错误。
为了演示,下面是FreeBSD 4.6的实现代码:
esp_input.c: esp4_input ()
多处代码查询基于SPI的SA和序列号检查防止回放攻击,然后,由219行开始:
{
u_char sum0[AH_MAXSUMSIZE];
u_char sum[AH_MAXSUMSIZE];
const struct ah_algorithm *sumalgo;
size_t siz;
指出签字必须有多大:
sumalgo = ah_algorithm_lookup(sav->alg_auth);
if (!sumalgo)
goto noreplaycheck;
siz = (((*sumalgo->sumsiz)(sav) + 3) & ~(4 - 1));
if (AH_MAXSUMSIZE < siz) {
ipseclog((LOG_DEBUG,
"internal error: AH_MAXSUMSIZE must be larger than %lu\n",
(u_long)siz));
ipsecstat.in_inval++;
goto bad;
}
接下来,它简单的拷贝从包最后开始的签字字节而没有进行数据是否存在检查,不过假如签字不提供的话这还不是致命的错误,它会简单的拷贝IP头部分然后验证会导致失败。
m_copydata(m, m->m_pkthdr.len - siz, siz, &sum0[0]);
然后代码校验签字。'off'在之前已经被计算过,是esp数据在包中开始处的偏移量。假定IP头为20字节,忽略任何链路层数据,off值将为20。如果我们发送的ESP包只包含SPI和序列号,m_pkthdr.len将为28字节。如果验证数据假定为96位,即为12字节,然后计算m->m_pkthdr.len - off - siz应该为-4。但是'siz'的类型是size_t,是无符号类型,因此(假定为32位整数)实际传递给esp_auth的大小为4294967292。
if (esp_auth(m, off, m->m_pkthdr.len - off - siz, sav, sum)) {
ipseclog((LOG_WARNING, "auth fail in IPv4 ESP input: %s %s\n",
ipsec4_logpacketstr(ip, spi), ipsec_logsastr(sav)));
ipsecstat.in_espauthfail++;
goto bad;
}
在esp_core.c中:
int
esp_auth(m0, skip, length, sav, sum)
struct mbuf *m0;
size_t skip; /* offset to ESP header */
size_t length; /* payload length */
struct secasvar *sav;
u_char *sum;
'length'也是size_t类型,因此长度会仍旧为4294967292,虽然有部分安全检查,但没有检查出这个问题:
/* sanity checks */
if (m0->m_pkthdr.len < skip) {
ipseclog((LOG_DEBUG, "esp_auth: mbuf length < skip\n"));
return EINVAL;
}
if (m0->m_pkthdr.len < skip + length) {
ipseclog((LOG_DEBUG,
"esp_auth: mbuf length < skip + length\n"));
return EINVAL;
}
第二个安全检查本来应该检查出问题,但是IPSEC实现却没有,因为'skip + length'表达式的值再次是无符号类型,因此20加4294967292(-4)获得值16,接下来,代码尝试对
length'字节的内存进行校验导致内核错误。
<*来源:Todd Sabin of Bindview.
链接:http://razor.bindview.com/publish/advisories/adv_ipsec.html
*>
建议:
厂商补丁:
Apple
-----
目前厂商已经发布了升级补丁以修复这个安全问题,请到厂商的主页下载:
MacOS X 10.2和MacOS X Server 10.2已经提供如下补丁:
Apple MacOS X 10.2 (Jaguar):
Apple Patch MacOSXUpdate10.2.1.dmg.bin
http://download.info.apple.com/Mac_OS_X/061-0139.20020918.gTbn8/2z/MacOSXUpdate10.2.1.dmg.bin
Apple MacOS X Server 10.2:
Apple Patch MacOSXServerUpdate10.2.1.dmg.bin
http://download.info.apple.com/Mac_OS_X/061-0141.20020918.64tP4/0Z/MacOSXServerUpdate10.2.1.dmg.bin
FreeBSD
-------
目前厂商已经发布了升级补丁以修复这个安全问题,请到厂商的主页下载:
FreeBSD已经在CVS中提供相应补丁,FreeBSD 4.7-RELEASE不存在此问题。
FreeBSD FreeBSD 4.6 -STABLE:
FreeBSD Patch esp_input.c#rev1.1.2.7
http://www.freebsd.org/cgi/cvsweb.cgi/src/sys/netinet6/esp_input.c#rev1.1.2.7
FreeBSD FreeBSD 4.6 -RELEASE:
FreeBSD Patch esp_input.c#rev1.1.2.7
http://www.freebsd.org/cgi/cvsweb.cgi/src/sys/netinet6/esp_input.c#rev1.1.2.7
FreeBSD FreeBSD 4.6:
FreeBSD Patch esp_input.c#rev1.1.2.7
http://www.freebsd.org/cgi/cvsweb.cgi/src/sys/netinet6/esp_input.c#rev1.1.2.7
NetBSD
------
NetBSD 1.6和Current不受此漏洞影响。
FreeS/WAN
---------
目前厂商还没有发布补丁升级,请随时关注厂商的主页:
http://www.freeswan.org/
浏览次数:3349
严重程度:0(网友投票)
绿盟科技给您安全的保障