【转载】ASP.NET 发现重大资安弱点影响范围涵盖 ASP.NET 1.1 ~ 4.0

几天前从 ScottGu's Blog 得知了一个 ASP.NET 的重大资安弱点,微软紧急的在最短时间内推出安全性更新,目前已正式发佈至 Windows Update 网站,各位 IT 人员随时都能透过 Windows Update 套用这次的安全性重大更新,以确保 ASP.NET 网站能够正常运作。由於这次的安全性更新被归类為「重大」等级,所以各位还是尽可能早更新、早安心,不要等出事了才反应喔!

本次的重大安全更新主要解决了一个在 ASP.NET 执行环境下可能会被进行阻断服务攻击 (DoS;Denial of Service) 的问题,由於这类攻击手法已於 2011-12-28 在德国的 Chaos Communication Congress 骇客年会中被公开,研究员 Julian Wälde 与 Alexander Klink 在现场展示如何透过一个自订的表单攻击目前市面上多个知名的 网站应用程式框架 (Web Application Frameworks),其中包括 PHP 4, PHP 5, Java / JSP, Apache Tomcat, Jetty, ASP.NET, Python, v8, … 等,他可以利用极少的 HTTP Requests 瘫痪现有的网站伺服器,而且不仅仅是 ASP.NET 可能受害,许多其他 Web 框架依然无法倖免於难!

还好目前微软已再极短的时间内推出安全性更新,请各位开发人员抽空更新主机。

以下是套用 Windows Update 时会看到与 .NET Framework 相关的安全性更新,不同的作业系统与版本可能会有不同的选项出现,以下只是 Windows 7 SP1 x86 环境下 .NET 3.5.1 的安全性更新示意图:

 

请注意:套用之后可能会被要求重开机或强制重开机,安装此更新时请做好测试或其他因应措施。

技术摘要说明

我们在开发 ASP.NET 网站时通常都会使用 Request.Form 物件来取得透过瀏览器 POST 过来的资料,而此物件型别為 NameValueCollection 类别,该类别储存 Key 的方式是透过杂凑运算的方式计算出来的 (hash-table data-structures),主要目的就是為了用极快的速度找到该 Key 的对应资料,不过此类别自行实做了有别於 .NET Framework 内建的杂凑演算法,它会将所有传入的 Key 都先转换為大写,并使用名為 DJBX33X (Dan Bernstein's times 33, XOR) 的杂凑演算法进行计算,这将导致此演算法有机会遭到 Meet-in-the-middle 攻击。

骇客能利用这个弱点实做出轻易可达成的 杂凑碰撞攻击 (Hash collision attacks),此类攻击可透过传入大量的 POST 资料并且夹带许多特别计算过的 Key 值,让这些 Key 值在这些 Hash-table 中產生出相同的杂凑值,如此一来在这个 Hash-table 中就会出现许多拥有相同杂凑值的 Key,这便是「杂凑碰撞」的由来。而这类杂凑碰撞的情况正是 DJBX33X 演算法的致命伤,当一个 NameValueCollection 中存在著过多的「杂凑碰撞」就会导致电脑花上许多时间对该 Hash-table 进行运算,所以会让 ASP.NET 执行绪花上数十分鐘到数小时的时间来操作相对应的 Key 值,如此一来便会耗尽网站伺服器的 CPU 资源,进而达到阻断服务的目的。

备註:在此 阻断服务 的意思是指让网站执行速度变慢或完全无法回应其他人的要求。

如下图示 0 ~ 5 区块便是运算出来的「杂凑值」,而 EzEz, EzFY, FYEz, FYFY 等等就是示意传入的 Key 值,当你要 Hash-table 中进行 插入 (insert)、查找 (lookup)、删除 (delete) 键值(Key) 时,每次都会花上 O(n2) 的复杂度进行运算,当拥有重复杂凑值的 Key 越来越多时,电脑对此 Hash-table 所花费的运算成本也会更高。

 

 

 

研究员提到:由於 IIS 的「关闭时间限制」预设值為 90 秒 (如下图示),如果骇客连接到 ASP.NET 网站的网路速度為 30 kbit/s 的情况下,就能让主机上某一个 Core2 等级的核心异常忙碌,若拥有 1 Gigabit/s 的频宽便能同时间瘫痪约 30,000 个核心,所以就算你的主机丛集架构多弹性或多坚固,都很有可能只要一台机器就能瘫痪你整个机房的 Web Farm 主机。

这样的攻击手法可称為一个「有效率的阻断服务攻击」,因此微软便将此攻击视為「重大资安弱点」。

 

 

2012/1/2 补充资讯

以下是 Efficient Denial of Service Attacks on Web Application Platforms 这场演讲的完整录影,将近一小时 ( http://www.youtube.com/watch?v=R2Cq3CLI6H8 ),关於 ASP.NET 相关的解说是从 26:55 ~ 31:26 这段时间,可以点选 这个连结 看我剪辑过的版本,或直接看所有的解说(包含攻击展示)。

 

註:下载高解析度的版本 http://bit.ly/rKwW58

本次微软推出的安全性更新主要是让 ASP.NET 在处理 HTTP POST 要求时最多只能接受 1,000 个参数,一般来说不会有人透过 POST 传递表单资料超过 1,000 个栏位 ( 以笔者的经验来说,传过最多的一次是 700 个栏位,当时是个问卷系统 ),如果传数参数超过 1,000 笔的话,就会出现 HttpException (0x80004005): The URL-encoded form data is not valid. (英文) 或 HttpException (0x80004005): URL 编码型式资料无效。 (中文) 例外状况,如下图示:

 

 

 

若你的 Web 应用程式真的会传递超过 1,000 个栏位时,这个预设值也是可以设定的,请修改网站根目录下的 web.config 档,并在 <appSettings> 区段加上一组 aspnet:MaxHttpCollectionKeys 设定即可:

<appSettings> 
  <add key="aspnet:MaxHttpCollectionKeys" value="2500" /> 
</appSettings>
 

最后提醒

此问题并不只限於 ASP.NET 平台,其他像是 Java、PHP、JRuby、Python 等知名的 Web Application Framework 都是在受害的范围内,请适时做出适当的更新与处理。

备註:PHP 5.4.0 RC4 新增了一个 max_input_vars 选项可控制输入的参数的总数,此举将可有效降低此弱点所带来的衝击。 还好我们有微软当靠山,有这种问题只要 Windows Update 一下就能解决了,各位 ASP.NET 开发人员有没有觉得很幸福呢! ^__^

 

 

 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值