|
Microsoft ASN.1库BER解码堆破坏漏洞(1) 受影响系统: Microsoft Windows XP Professional SP1 Microsoft Windows XP Professional Microsoft Windows XP Home SP1 Microsoft Windows XP Home Microsoft Windows NT 4.0SP6a Microsoft Windows NT 4.0SP6 Microsoft Windows NT 4.0SP5 Microsoft Windows NT 4.0SP4 Microsoft Windows NT 4.0SP3 Microsoft Windows NT 4.0SP2 Microsoft Windows NT 4.0SP1 Microsoft Windows NT 4.0 Microsoft Windows 2003 Microsoft Windows 2000SP4 Microsoft Windows 2000SP3 Microsoft Windows 2000SP2 Microsoft Windows 2000SP1 Microsoft Windows 2000 描述: -------------------------------------------------------------------------------- CVE(CAN) ID: CAN-2003-0818
Abstract Syntax Notation 1 (ASN.1)是用于多个应用程序和设备的数据标准,允许数据可在各种平台传递。Microsoft ASN.1库广泛使用在Windows安全子系统,包含kerberos、NTLMv2验证,及使用各种证书的应用程序(SSL、EMAIL数字签名、ActiveX控件签名)。
Microsoft ASN.1库实现上存在整数溢出漏洞,远程攻击者可以利用这些漏洞造成堆破坏从而执行恶意指令。漏洞影响MSASN1.DLL相关的应用,其中比较常见的是LSASS.EXE和CRYPT32.DLL(任何使用CRYPT32.DLL的应用程序)。
ASN.1基本编码规则(BER)基本概念是一个灵活的编码二进制数据的编码方案。每片数据按照描述如何解释下面值数据的类型号,然后是数据长度,最后是数据本身,通过提供超大值(从0xFFFFFFFD到0xFFFFFFFF)给长度字段,可在堆分配函数中产生整数溢出,虽然有地方对这个值长度进行确认和检查,不过在验证函数中独立的指针算法会导致漏洞发生。
1、当一个简单的值(这个值由原子数据组成)由MSASN1解码时,ASN1BERDecLength()调用来获得值长度,然后把这个值长度传递给ASN1BERDecCheck()函数确保数据实际存在。
2、ASN1BERDecCheck()验证无符号数据"pointer_to_start_of_data + reported_length_of_data"是否小于或者等于"pointer_to_start_of_BER_block + total_size_of_BER_block",如果检查没通过,函数返回错误,并停止解码(本来ASN1BERDecCheck()函数检查也存在问题,不过微软在Windows 2000 SP4和Windows Server 2003中已经在函数中增加额外的比较进行修补了)。
3、如果函数调用ASN1BERDecLength()然后尝试分配内存和拷贝数据(如ASN1BERDecOctetString(),不过不是ASN1BERDecOctetString2()),它就会传递解码的长度给DecMemAlloc(),然后分配结果,此函数的操作也即:"LocalAlloc(LMEM_ZEROINIT, (length + 3) & ~3)."
4、如果DecMemAlloc()函数成功返回,调用函数然后使用原始解码的长度作为计数字节长度通过memcpy()把数据拷贝到已经分配的堆缓冲区中,就会触发溢出。
如果在第一步ASN1BERDecLength()解码的长度非常大,就会在第二步ASN1BERDecCheck()增加长度到当前数据指针时发生整数溢出。更明确的是,如果长度数据范围在0xFFFFFFFD 到0xFFFFFFFF之间,会通过ASN1BERDecCheck()的检查,在完成DecMemAlloc()调用后,长度的总和会变为零,LocalAlloc()成功的分配零长度堆段,但由于memcpy()在处理超长长度数据进行拷贝时没有任何检查,结构可出现堆破坏,临近的任何数据可被任意数据覆盖。
最简单的方法产生此条件是构建一个简单八位字符串(tag 04h),'length-of-length'设置为4,length设置为0xFFFFFFFF的编码,对应字节为'04h/84h/FFh/FFh/FFh/FFh',根据MSASN1客户使用的解码函数,可触发此漏洞。以下是受此漏洞影响的解码函数:
ASN1BerDecCharString
|