IE8 RC1中的XSS过滤器增强与安全漏洞修复

本文详细介绍了IE8 RC1版本中对XSS过滤器的多项改进,包括修复了特定字节序列导致的绕过问题、NULL字符处理、PHP stripslashes函数相关攻击防护等,提升了浏览器的安全性能。

XSS Filter Improvements in IE8 RC1

周一发布了IE8 RC1。以下是XSS过滤器功能中最有趣的一些改进和错误修复:

一些字节序列允许根据系统区域设置绕过过滤器

包含某些字节序列的URL在某些区域设置中绕过了Beta 2过滤器实现。例如,在中文区域设置系统中,以下格式的URL将绕过过滤器: http://www.fabrikam.com?x=%A0<scriptalert();</script» 过滤器在将URL传递给正则表达式引擎之前对其进行URL解码。原始0xA0字节后跟0x3C字节(“<”)的存在可能导致MultiByteToWideChar失败。这是因为在中文和其他区域设置中,0XA0 0x3C不是有效的多字节字符。在这种情况下,失败会级联,导致正则表达式匹配无法不区分大小写。但更糟糕的是,在正则表达式代码的稍后部分,0xA0 0x3C序列将被解释为单个多字节字符。因此,<字符基本上会从输入中缺失,适当的启发式方法将无法检测到XSS。 IE8 RC1修复使正则表达式代码能够将所有输入视为单个字节流,而不是默认代码页中的字符(可能是多字节)。 Yosuke Hasegawa和80sec都在IE8 Beta 2版本中发现了这个错误。

HTTP响应中的NULL导致过滤丢弃HTTP响应数据块

代码中的相关缓冲区类已修订以修复此问题。

增加了针对涉及PHP stripslashes的攻击场景的保护

PHP中的stripslashes函数从输入中删除反斜杠。(它还将双反斜杠替换为单个反斜杠。)PHP开发人员在输出字符串之前调用stripslashes是很常见的。在这些情况下,如果输出启用了服务器端XSS错误,尽管有IE8 XSS过滤器,该错误仍然可能被滥用。 这是XSS过滤器架构概述中讨论的平台特定工件的一个例子: 上面简要提到的解码过程是灵活的,还可以考虑各种Web平台的工件。根据需要,过滤器基于对相同输入数据的替代解释生成额外的签名(见下文)。例如,由于格式错误的URLEncoded字符可能在不同的Web平台上处理不同,过滤器必须能够构建适当的签名。 这很好地描述了新行为——过滤器现在根据需要为输入的替代解释生成额外的签名。这些新签名旨在补偿PHP stripslashes功能的行为。 PHP“魔术引号”功能现在似乎已被弃用。如果PHP代码中使用stripslashes是由于魔术引号功能,那么应该预期stripslashes的使用将在网络上减少。无论如何,我们认为这个问题在今天似乎仍然足够普遍,值得在IE8 RC1中缓解。 Ronald van den Heetkamp确定了这个问题。

增加了针对仍支持过长UTF-8的服务器的攻击场景的保护

类似于上面描述的PHP Stripslashes更改,如果输入中识别出过长的UTF-8序列,我们现在生成并处理额外的签名。 虽然过长的UTF-8在RFC 3629中被明确禁止,但不幸的是,它在Web服务器平台上似乎仍然足够普遍,因此我们在代码中解决这个攻击向量是有意义的。 Amit Klein提供的反馈帮助确定了这个问题。

增加了针对注入FORM和ISINDEX元素的攻击场景的保护

虽然通常我们不阻止通用的HTML注入,但我们为这两个元素做了例外,因为它们启用了类似于注入脚本的攻击场景。 Gareth Heyes确定了ISINDEX元素。

OBJECT标签的CODETYPE属性现在被视为与TYPE属性相同

OBJECT标签的CODETYPE属性提供与TYPE属性相同的功能。在IE8 RC1中,这两个属性被视为相等。 Gareth Heyes确定了这个问题。

一般性能改进

例如:预验证以避免在某些情况下正则表达式的性能损失。

我要特别感谢IE团队的Dany Joly,他在完善IE8中的XSS过滤器实现方面做了非凡的工作。 继续前进到RTM! David Ross,MSRC工程 - 从事安全科学项目 发布内容“按原样”提供,不提供任何保证,也不授予任何权利。 更新 - 2009年2月11日:更改博客签名

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计