首页 -> 安全研究

安全研究

绿盟月刊
绿盟安全月刊->第46期->最新漏洞
期刊号: 类型: 关键词:
Microsoft Windows ASN.1库BER解码堆破坏漏洞

日期:2004-03-05

发布日期:2004-02-10
更新日期:2004-02-11

受影响系统:
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
描述:
--------------------------------------------------------------------------------
BUGTRAQ  ID: 9633,9635
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
ASN1BERDecChar16String
ASN1BERDecChar32String
ASN1BERDecEoid
ASN1BERDecGeneralizedTime
ASN1BERDecMultibyteString
ASN1BERDecOctetString
ASN1BERDecOpenType
ASN1BERDecSXVal
ASN1BERDecUTCTime
ASN1BERDecUTF8String
ASN1BERDecZeroCharString
ASN1BERDecZeroChar16String
ASN1BERDecZeroChar32String
ASN1BERDecZeroMultibyteString

<*来源:Derek Soeder (dsoeder@eeye.com)
  
  链接:http://www.eeye.com/html/Research/Advisories/AD20040210.html
        http://www.eeye.com/html/Research/Advisories/AD20040210-2.html
        http://www.microsoft.com/technet/security/bulletin/MS04-007.asp
*>

建议:
--------------------------------------------------------------------------------
厂商补丁:

Microsoft
---------
Microsoft已经为此发布了一个安全公告(MS04-007)以及相应补丁:
MS04-007:ASN.1 Vulnerability Could Allow Code Execution (828028)
链接:http://www.microsoft.com/technet/security/bulletin/MS04-007.asp

补丁下载:

Microsoft Windows NT? Workstation 4.0 Service Pack 6a

http://www.microsoft.com/downloads/details.aspx?FamilyId=92400199-B3D5-4826-98D4-F134849F5249&displaylang=en

Microsoft Windows NT Server 4.0 Service Pack 6a

http://www.microsoft.com/downloads/details.aspx?FamilyId=E8315430-90CD-4B20-8F54-58527932B588&displaylang=en

Microsoft Windows NT Server 4.0 Terminal Server Edition Service Pack 6

http://www.microsoft.com/downloads/details.aspx?FamilyId=D83B39D3-FF13-4D0B-B406-A225AED0D659&displaylang=en

Microsoft Windows 2000 Service Pack 2, Microsoft Windows 2000 Service Pack 3, Microsoft 2000 Windows Service Pack 4

http://www.microsoft.com/downloads/details.aspx?FamilyId=191853C4-A4D2-4797-A8C6-A2E663A53698&displaylang=en

Microsoft Windows XP, Microsoft Windows XP Service Pack 1

http://www.microsoft.com/downloads/details.aspx?FamilyId=0CC30297-D4AE-48E9-ACD0-1343D89CCBBA&displaylang=en

Microsoft Windows XP 64-Bit Edition, Microsoft Windows XP 64-Bit Edition Service Pack 1

http://www.microsoft.com/downloads/details.aspx?FamilyId=383C397F-9318-4AD5-9C2C-0577118A1E68&displaylang=en

Microsoft Windows XP 64-Bit Edition Version 2003, Microsoft Windows XP 64-Bit
Edition Version 2003 Service Pack 1

http://www.microsoft.com/downloads/details.aspx?FamilyId=FA280168-66E1-4B5F-958F-E178C3F61F7C&displaylang=en

Microsoft Windows Server 2003

http://www.microsoft.com/downloads/details.aspx?FamilyId=3D7FFFF9-A497-42FF-90E7-283732B2E117&displaylang=en

Microsoft Windows Server 2003 64-Bit Edition

http://www.microsoft.com/downloads/details.aspx?FamilyId=FA280168-66E1-4B5F-958F-E178C3F61F7C&displaylang=en
版权所有,未经许可,不得转载