首页 -> 安全研究

安全研究

紧急通告
绿盟科技紧急通告(Alert2010-09)

NSFOCUS安全小组(security@nsfocus.com)
http://www.nsfocus.com

.NET Framework ASP.NET Padding Oracle攻击信息泄露漏洞

发布日期:2010-09-21

CVE ID:CVE-2010-3332

受影响的软件及系统:
====================
Microsoft .NET Framework 4.0
Microsoft .NET Framework 3.5 SP1
Microsoft .NET Framework 3.5
Microsoft .NET Framework 2.0 SP2
Microsoft .NET Framework 1.0 SP3

综述:
======
.NET Framework ASP.NET处理应用会话中的敏感数据的加密机制上存在弱点,采用ASP.NET框架开发的Web应用受此漏洞的影响,远程攻击者可以利用此漏洞解密或篡改应用会话中包含的加密数据。对于Web应用会话中加密数据的获取和篡改导致的后果取决于具体ASP.NET应用的实现方式,如果在加密数据中设置了口令等敏感信息则可能导致应用受到非授权的访问。对于使用了ASP.Net 3.5 SP1版本的应用,加密数据的破解则会导致攻击者可以读取ASP.NET应用中任意文件的内容。

此漏洞是一个0day漏洞,相关的技术细节和利用代码已经公开,微软已经得知了此漏洞的存在并开始研究处理,但还未提供针对此漏洞安全补丁,强烈建议参照临时解决方案进行处理以免受此漏洞的影响。

分析:
======
Microsoft .NET Framework是一个流行的软件开发工具包。使用.NET Framework所编译的ASP.NET应用中没有正确地实现敏感数据的加密,攻击者可以解密并篡改敏感数据。

如果要理解这个漏洞,需要了解加密系统中的提示机制,当你提出问题时提示机制会给出某种形式的答案。此漏洞涉及到ASP.NET对加密信息中填充数据触发的提示,攻击者可以通过向Web服务器发送特定的密文文本,然后通过检查所返回的出错代码来判断数据是否被正确解密。通过反复上述操作,攻击者就可以收集到足够的信息用来解密剩余部分的密文文本。

成功利用这个漏洞的攻击者可以查看目标服务器上加密的数据,如View State字段中包含的加密信息,在高版本的ASP.NET框架中读取目标服务器上的ASP.NET应用文件,比如web.config。

解决方法:
==========
在安装漏洞相应的补丁之前,Windows用户可以采用以下的临时解决方案来免受漏洞的影响:

* 启用ASP.NET自定义错误并将所有的错误代码都映射到相同的出错页面。

如果ASP.NET应用中没有web.config文件:

对于.NET Framework 3.5 RTM

1. 在根目录中创建名为web.config的文本文件并注入以下内容:

<configuration>
<location allowOverride="false">
   <system.web>
     <customErrors mode="On" defaultRedirect="~/error.html" />
   </system.web>
</location>
</configuration>

2. 创建包含有通用出错消息的error.html文件并保存到根目录。

3. 或者,重新命名web.config文件中error.html文件指向已有的出错页面,但该页面必须显示通用内容。

对于.NET Framework 3.5 Service Pack 1及之后版本

1. 在根目录中创建名为web.config的文本文件并注入以下内容:

<configuration>
<location allowOverride="false">
   <system.web>
     <customErrors mode="On" redirectMode="ResponseRewrite" defaultRedirect="~/ErrorPage.aspx" />
   </system.web>
</location>
</configuration>

2. 如果擅长使用C#,推荐使用以下ErrorPage.aspx文件:

<%@ Page Language="C#" AutoEventWireup="true" %>
<%@ Import Namespace="System.Security.Cryptography" %>
<%@ Import Namespace="System.Threading" %>

<script runat="server">
        void Page_Load() {
        byte[] delay = new byte[1];
        RandomNumberGenerator prng = new RNGCryptoServiceProvider();

        prng.GetBytes(delay);
        Thread.Sleep((int)delay[0]);
        
        IDisposable disposable = prng as IDisposable;
        if (disposable != null) { disposable.Dispose(); }
    }
</script>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
    <div>
        An error occurred while processing your request.
    </div>
</body>
</html>

3. 如果擅长使用Visual Basic .NET,推荐使用以下ErrorPage.aspx文件:

<%@ Page Language="VB" AutoEventWireup="true" %>
<%@ Import Namespace="System.Security.Cryptography" %>
<%@ Import Namespace="System.Threading" %>

<script runat="server">
    Sub Page_Load()
        Dim delay As Byte() = New Byte(0) {}
        Dim prng As RandomNumberGenerator = New RNGCryptoServiceProvider()
        
        prng.GetBytes(delay)
        Thread.Sleep(CType(delay(0), Integer))
        
        Dim disposable As IDisposable = TryCast(prng, IDisposable)
        If Not disposable Is Nothing Then
            disposable.Dispose()
        End If
    End Sub
</script>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
    <div>
        An error occurred while processing your request.
    </div>
</body>
</html>

如果ASP.NET应用中已有web.config文件:

对于.NET Framework 3.5 RTM及之后版本

1. 在已有的web.config文件中插入以下内容:

<?xml version="1.0"?>
<configuration>
<configSections>
...
</configSections>
<appSettings>
...
</appSettings>
<connectionStrings>
...
</connectionStrings>

[<location allowOverride="false">
<system.web>
<customErrors mode="On" defaultRedirect="~/error.html" />
</system.web>
</location>]

<system.web>
...
</system.web>
<system.codedom>
...
</system.codedom>
</configuration>

2. 创建包含有通用出错消息的error.html文件并保存到根目录。

3. 或者,重新命名web.config文件中error.html文件指向已有的出错页面,但该页面必须显示通用内容。

对于.NET Framework 3.5 Service Pack 1及之后版本

1. 在根目录中创建名为web.config的文本文件并注入以下内容:

<?xml version="1.0"?>
<configuration>
<configSections>
...
</configSections>
<appSettings>
...
</appSettings>
<connectionStrings>
...
</connectionStrings>

[<location allowOverride="false">
<system.web>
<customErrors mode="On" redirectMode="ResponseRewrite" defaultRedirect="~/ErrorPage.aspx" />
</system.web>
</location>]

</configuration>

<system.web>
...
</system.web>
<system.codedom>
...
</system.codedom>
</configuration>

2. 如果擅长使用C#,推荐使用以下ErrorPage.aspx文件:

<%@ Page Language="C#" AutoEventWireup="true" %>
<%@ Import Namespace="System.Security.Cryptography" %>
<%@ Import Namespace="System.Threading" %>

<script runat="server">
        void Page_Load() {
        byte[] delay = new byte[1];
        RandomNumberGenerator prng = new RNGCryptoServiceProvider();

        prng.GetBytes(delay);
        Thread.Sleep((int)delay[0]);
        
        IDisposable disposable = prng as IDisposable;
        if (disposable != null) { disposable.Dispose(); }
    }
</script>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
    <div>
        An error occurred while processing your request.
    </div>
</body>
</html>

3. 如果擅长使用Visual Basic .NET,推荐使用以下ErrorPage.aspx文件:

<%@ Page Language="VB" AutoEventWireup="true" %>
<%@ Import Namespace="System.Security.Cryptography" %>
<%@ Import Namespace="System.Threading" %>

<script runat="server">
    Sub Page_Load()
        Dim delay As Byte() = New Byte(0) {}
        Dim prng As RandomNumberGenerator = New RNGCryptoServiceProvider()
        
        prng.GetBytes(delay)
        Thread.Sleep(CType(delay(0), Integer))
        
        Dim disposable As IDisposable = TryCast(prng, IDisposable)
        If Not disposable Is Nothing Then
            disposable.Dispose()
        End If
    End Sub
</script>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
    <div>
        An error occurred while processing your request.
    </div>
</body>
</html>

厂商状态:
==========
微软已经得到了漏洞相关的信息正在处理,但还没有发布安全补丁,我们建议在安装官方补丁之前应用本通告的临时解决方案以降低漏洞的威胁:

http://www.microsoft.com/technet/security/advisory/2416728.mspx

附加信息:
==========
http://www.nsfocus.net/vulndb/15780
http://www.microsoft.com/technet/security/advisory/2416728.mspx

声 明
==========

本安全公告仅用来描述可能存在的安全问题,绿盟科技不为此安全公告提供任何保证或承诺。由于传播、利用此安全公告所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,绿盟科技以及安全公告作者不为此承担任何责任。绿盟科技拥有对此安全公告的修改和解释权。如欲转载或传播此安全公告,必须保证此安全公告的完整性,包括版权声明等全部内容。未经绿盟科技允许,不得任意修改或者增减此安全公告内容,不得以任何方式将其用于商业目的。

关于绿盟科技
============

绿盟科技(NSFOCUS Co., Ltd.)是中国网络安全领域的领导企业,致力于网络和系统安全问题的研究、高端网络安全产品的研发、销售与网络安全服务,在入侵检测/保护、远程评估、 DDoS攻击防护等方面提供具有国际竞争能力的先进产品,是国内最具安全服务经验的专业公司。有关绿盟科技的详情请参见: http://www.nsfocus.com

© 2018 绿盟科技