首页 -> 安全研究

安全研究

绿盟月刊
绿盟安全月刊->第18期->最新漏洞
期刊号: 类型: 关键词:
ISC Bind 8 TSIG缓冲区溢出漏洞

日期:2001-02-05

受影响的系统:  
ISC BIND 8.2.3BETA
ISC BIND 8.2.2 p1 - p7
ISC BIND 8.2.2
ISC BIND 8.2.1
ISC BIND 8.2


不受影响系统:  
ISC BIND 9.1
ISC BIND 9.0
ISC BIND 8.2.3
描述:
--------------------------------------------------------------------------------


BUGTRAQ ID : 2302

BIND是一个实现域名服务协议的服务器软件。它在Internet上被广为使用。它
在TSIG(传输签名)的实现上存在一个缓冲区溢出漏洞,可能允许远程攻击者
在BIND服务器上执行任意代码。由于溢出发生在DNS请求的初始化过程中,因此
并不需要攻击者控制任何地权威DNS服务器,而且此问题影响所有递归和非递归
的DNS服务器。

当收到一个DNS请求时,根据传输协议的不同,DNS请求的数据可能被存放到heap
区或者是堆栈中。如果收到的是UDP报文,函数datagram_read()负责将其读入
堆栈中的一个513字节大小的缓冲区(u.buf);如果收到的是TCP报文,函数
stream_getlen()负责将其读入位于heap区的一个64k大小的缓冲区(sp->s_buf).
BIND使用两个关键的变量来跟踪这些缓冲区的使用情况:一个包含缓冲区中的
实际长度,名为"msglen";另一个变量用来跟踪缓冲区的剩余长度,名为"buflen"

当BIND收到一个DNS信息后,msglen被初始化成从网络中接收到的数据长度。buflen
被初始化成用来读取这个消息的缓冲区的大小。(对于UDP报文为512字节,对TCP
报文为64k)。正常情况下,当BIND处理一个请求时,它会将回复记录附加到请求中
。然后它会编辑DNS头,使其反映出这种变化,并发送此响应报文。在此过程中,
BIND假设msglen加上buflen的大小等于缓冲区的原长度。

从BIND 8.2开始,在BIND处理一个DNS请求之前,它会检查DNS信息的附加区域,
检查是否有TSIG资源记录。函数ns_find_tsig()被用来进行这个检查。如果一
个有效的TSIG标记被找到,但相应的安全字(security key)却没有找到,BIND
将会报错,并绕过了正常的请求处理过程。结果,msglen和buflen都仍然保持
它们的初始值。

BIND将此请求看作时一个错误请求,它使用原来的请求缓冲区,在问题域中
增加一段TSIG信息。这时候,BIND假设请求缓冲区的大小仍然是msglen+buflen
.正常情况下,这是正确的,然而,在这种特殊情况下,msglen+buflen几乎是
实际缓冲区大小的两倍!这样,当BIND使用ns_sign()函数添加TSIG信息时,
它们将被填充在缓冲区之外。由于有效的安全字没有被发现,ns_sign()将
只会增加很少的一些字节,而且字节的内容也是有限的。因此这可能导致两
种类型的攻击。

对于UDP请求,请求缓冲区在堆栈中,攻击者可以使用一些固定的值来覆盖
datagram_read()函数保存在堆栈中的激活记录。在x86平台下,用0覆盖
保留栈帧指针的最小字节,可能导致该指针指向原来的DNS请求缓冲区。这
种单字节溢出可能导致执行任意代码。

对于TCP请求,请求缓冲区在heap区中。攻击者可以使用一些固定的值来覆盖
malloc()动态分配时的一些边界字节,这样下一个边界信息就可以从攻击者
控制的缓冲区中读取,这可能导致一个恶意的指针覆盖,攻击者也可能执行
任意代码。

<*来源:Anthony Osborne
        John McDonald of the COVERT Labs at PGP Security.
        COVERT-2001-01: Vulnerabilities in BIND 4 and 8

*>





--------------------------------------------------------------------------------
建议:

厂商补丁:

ISC已经提供了新的BIND 8.2.3下载,您也可以下载BIND 9.0或9.1.

下载地址:
http://www.isc.org/products/BIND/bind8.html
http://www.isc.org/products/BIND/bind9.html

版权所有,未经许可,不得转载