MS10-070 导致 Asp.NET MVC AntiForgery 令牌出现问题?

MS10-070 导致 Asp.NET MVC AntiForgery 令牌出现问题?

KB2418241、KB2416473 和 KB2416451 均参考http://www.microsoft.com/technet/security/bulletin/MS10-070.mspx

上周五在我们的 Windows Server 2003 机器上安装了此补丁之后,我们发现此类错误发生率显著增加:

System.Web.Mvc.HttpAntiForgeryException: A required anti-forgery token was not 
supplied or was invalid. ---> System.Web.HttpException: Validation of viewstate MAC
failed. If this application is hosted by a Web Farm or cluster, ensure that <machineKey> 
configuration specifies the same validationKey and validation algorithm. AutoGenerate
cannot be used in a cluster. ---> System.Web.UI.ViewStateException: Invalid viewstate. 

设置如下:

  • Web 应用程序在 Web 群集中运行,并且 NLB 设置为客户端亲和性:单一。
  • 两个独立的 Web 应用程序之间存在重定向,并且它们的 machineKey 元素均使用显式 validationKey 和 decryptionKey 元素相同。
  • 验证方法设置为“SHA1”,解密方法设置为“AES”

    (此外,自安装微软更新之前以来,没有重新部署过应用程序)。

这些错误当然可能是由实际的 CSRF 攻击引起的,但考虑到安装更新时出现的数量和峰值,我认为这种可能性不大。

此更新是否存在任何已知问题可能会导致这种情况?(甚至更好的是,有任何已知的解决方法吗?)

答案1

这个问题确实是由安全更新引起的。更新通过对加密数据进行额外签名改变了验证方式。这包括 AntiForgeryToken cookie。

如果用户重新启动浏览器或者以其他方式清除所有会话 cookie,问题就会消失。

评论中也提到了这一点http://weblogs.asp.net/scottgu/archive/2010/09/27/asp-net-security-update-shipping-tuesday-sept-28th.aspx

After installing the patch, I was quite freaked out to find requests to my site
failing  - 500s.  But only in one browser.  To sum up: If you have an MVC site, 
and are using Html.AntiForgeryToken() - any existing browser sessions will need 
to be closed and reopened so that the session cookie that was generated before 
the patch was applied, for that antiforgery token, can be killed.   Your existing 
users may need to be informed of this - I can't see anyway to change the name of that 
cookie.

从 MVC 1 升级到 MVC 2 时也可能会遇到此问题:

http://weblogs.asp.net/james_crowley/archive/2010/03/18/beware-upgrade-to-asp-net-mvc-2-0-with-care-if-you-use-antiforgerytoken.aspx

在这两种情况下,如果您无法强制用户重新启动浏览器,则解决方法是编辑应用程序代码并重新部署。您可以编辑应用程序,以便在发生异常时从传入请求中清除 AntiForgeryToken cookie,然后通过调用 Html.AntiForgeryToken() 重新发布令牌 cookie。但是,在这样做时,您必须注意只在适当的位置执行此操作(例如错误页面或其他页面不是修改数据)——否则,您将失去对 CSRF 攻击的所有保护,这也是使用防伪造令牌的全部原因。

相关内容