首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 其他教程 > 开源软件 >

ActiveX保险:改进和最佳实践

2012-06-30 
ActiveX安全:改进和最佳实践概述本文的主要内容本文主要描述了在Internet Explorer 7中,通过默认的“Active

ActiveX安全:改进和最佳实践
概述本文的主要内容

本文主要描述了在Internet Explorer 7中,通过默认的“ActiveX Opt-In”特性,减少了开启的ActiveX控件的数量。

本文也描述了一些开发运行在Internet Explorer 中ActiveX控件的最佳实践。这些最佳实践出自安全开发生命周期以及开发和测试用于Internet安全应用的ActiveX控件的开发人员。

ActiveX Opt-In – IE7对ActiveX有什么创新

ActiveX控件对于Internet是非常重要的,因为它允许开发人员通过额外的软件程序来增强Web页面的功能,而不是工作在基本的HTML Web页面下。Web开发人员使用ActiveX控件来添加动画、多媒体和其它特效到他们的Web站点上。

因为ActiveX控件或浏览器的扩展,以及添加Web站点的特效,都会增加安全的风险。Internet Explorer 7 (IE7)将会减少可用于Internet上Web站点的ActiveX控件的数量,并且因此降低了安全的风险。IE7应用重要的控件让用户更加方便地访问常规的站点,用户在应用增强的功能同时,避免通过ActiveX控件面临更多安全风险。

这个IE7的功能称为ActiveX Opt-In。默认情况下,ActiveX Opt-In禁用用户计算机上的控件。当用户遇到禁用控件的Web页面时,将会看到一个显示以下内容的信息栏:“此网站需要安装以下加载项‘XYZ Publisher’中的‘ABC Control’。如果您信任该网站和该加载项并打算安装该加载项,请点击这里”,用户可以从此信息栏选择来开启ActiveX控件,如下图所示:

ActiveX保险:改进和最佳实践



返回页首设计安全的ActiveX控件的原则

因为ActiveX控件可能会向恶意网站暴露内容,因此设计上的安全是十分重要的。任何站点都能够试图使用控件,所有这些需求也需要控件的类标识符(CLSID)。当您在设计控件时,您首先需要考虑用于正当网页的控件,就像用于您自己的站点。为了安全的运行在Internet区域,您必须在保障在Internet上加载任何页面时,您的控件设计都是安全的,特别是访问恶意的页面时。您需要确保恶意Web站点不能够利用您的控件来伤害用户的系统。您在设计时,需要考虑您控件的功能如何被利用以及如何保护用户。

限制您控件的功能

因为ActiveX控件是微软的Win32组件,所以它可以没有任何限制地运行。您应该考虑如何限制您控件的功能,来防止他人利用您的控件进行恶意的破坏。在考虑编写ActiveX控件时,首先您需要考虑的是,您是否确实需要ActiveX控件来完成您所要实现的功能。如果您不需要访问系统资源,您可以利用动态 HTML (DHTML) 来编写控件。

为了保障您控件的安全,接口需要在满足您功能需求的同时尽可能少的暴露给IDispatch (以及网站)。如果您的函数不是必须输入参数,那么可以删除它们。如果您能够根据已知的输入来缩小输入参数的范围,那么一定照此执行。如果您的控件向本地计算机写入数据,或通过任何方式改变系统的状态和行为,那么需要认真考虑您的控件不会被第三方恶意程序所利用。

以下是在您设计控件时需要考虑的一些场景:

返回页首威胁建模

威胁建模是您用来评估、计划以及降低控件可能面临风险的一个过程。为了更全面地保护控件不受到黑客的攻击,您需要了解对您应用程序的威胁。威胁建模由三个高级别步骤组成:了解攻击者的想法、描绘安全系统和确定威胁。

请您注意,本段仅会表述对威胁建模的概述,并不包含更多细节以及如何学习威胁建模。我们强烈建议您学习威胁建模的其它相关资源。本段最后会列出一些推荐的相关资源。

威胁建模过程

威胁建模过程包含以下几个步骤:


返回页首安全的开发实践

一旦您设计好并且完成您控件的威胁建模,接下来开始进行实现。

防止拒绝服务的攻击

确保在得到错误数据或内容时,控件不会死循环或停止响应。攻击者可能会绑定用户的计算机使用您的ActiveX控件。

安全的内存操作

检查全部输入并且防止缓冲区溢出对安全的ActiveX控件是十分重要的。例如,如果控件收到了一个输入的字符串,没有检查它的长度就放入到固定长度的缓冲区中,这就可能为恶意人员提供了溢出缓冲区的字符串,写入其它信息。某些情况下,这些问题能够被利用来执行一些不安全的操作。作为ActiveX控件的开发者,您需要十分小心。不要认为确定的输入一定会遵守确定的需求。总是要检查数据以避免受到攻击。即使输入没有明确的规格,所有的输入也应该有最大的空间,并且控件应该进行安全测试。更多信息请查看Fix Those Buffer Overruns。

限制拖拽功能

对于用户而言,拖拽功能能够带来更好的交互体验,但是,ActiveX控件需要采用一种可靠的方式来开启拖拽功能。如果您的控件作为拖动的对象,则应当在执行不安全操作时提示用户。如果您的控件是一个拖动源,您应该确保设置成为CFSTR_UNTRUSTEDDRAGDROP剪切板格式。这可以确保任何程序读取拖动的数据时,明确它是否被完全信任。您应该注意到,IE中的拖拽能力受到安全设置的限制,因此可能会限制您控件的拖拽能力(URLACTION_SHELL_ENHANCED_DRAGDROP_SECURITY)。

关于剪切板数据的更多信息,请查看Shell Clipboard Formats 。

IE安全设置中关于拖拽的更多信息,请查看URL Action Flags。

脚本安全和初始化安全

IE有很多种不同的机制来侦测控件的初始化和脚本是否安全。IE使用IObjectSafety 接口和组件分类管理器来进行侦测。

首先要注意到,仅仅要对您确实需要操作的初始化或脚本记控件安全。如果您的控件不需要脚本功能,则不要标记。

IObjectSafety 是IE加载完成后,用于查询控件以及侦测控件是否被安全的初始化和安全的脚本化的接口。组件分类管理器是IE注册自身为安全的方式。IE加载控件之前会首先检查两项注册表设置。

IObjectSafety 接口支持两种方式,IObjectSafety::GetInterfaceSafetyOptions和IObjectSafety::SetInterfaceSafetyOptions。GetInterfaceSafetyOptions 方式会返回控件的安全能力,初始化或脚本是否安全。SetInterfaceSafetyOptions 方式从容器、IE到控件的请求,并且指出了控件应配置自身安全的初始化或脚本化。

组件分类管理器是IE使用注册表来侦测控件是否安全初始化和脚本的方式。您应该确定安装您的控件时注册它到组建分类管理器。关于注册表键值的详细信息请查看How to mark MFC ActiveX controls as Safe for Scripting and Initialization。

更多关于通过IObjectSafety和组件分类标记ActiveX控件安全初始化和脚本的信息,请查看Safe Initialization and Scripting for ActiveX Controls。

在本地机器区域中操作的控件

ActiveX控件在本地机器中操作不应该允许任意内容由Internet不经用户交互,就直接写入到指定位置的文件中。此外,控件在本地机器中操作不应允许直接或间接执行任意的代码。

设计您的控件有数据执行保护的功能

数据执行保护(DEP)是执行额外内存检查的一套硬件和软件技术,它能够防止恶意代码运行在系统中。DEP可用于Microsoft Windows 2003 Server SP1,Windows XP Service Pack 2,Windows XP Tablet PC Edition 2005,和Windows Vista上。

DEP通过阻止内存数据中没有标记为EXECUTABLE代码的执行来完成工作,就像堆和栈。强制硬件DEP侦测从这些位置运行的代码,并且在执行发生时进行阻止。强制软件DEP是强制硬件DEP的子集,很多计算机没有支持DEP的处理器,强制软件DEP能够阻止恶意代码在Windows中执行。

有了DEP功能的控件不能执行任何被标记为不可执行页面上的代码。注意,如果您使用ATL,那么ATL 7.1和更早的版本不支持DEP功能,您需要在ATL8.0或之后的版本中进行编译。

IE提供了可以测试您控件DEP功能的设置。在IE中,打开工具-Internet选项 -高级标签,检查“Enable memory protection to help mitigate online attacks”设置。(注意如果您是在Windows Vista中运行,此设置仅能在保护模式关闭时进行修改。一旦此功能被启用,您可以运行在保护模式。)您应当使用IE设置来测试您的控件,并且确保它和DEP兼容。一旦您的代码和DEP兼容,您应当使用/NXCOMPA链接您的代码。

ActiveX保险:改进和最佳实践


如果您的控件通过一个CAB文件或其它可执行文件安装,您必须签名了所有的安装文件(为了能够安装)和包含ActiveX控件的.dll或ocx文件(为了确保您的发布者名称不会显示为“Not verified”)。

在管理加载项对话框名称栏中显示的名称从以下注册表设置中读取:

HKEY_CLASSES_ROOTCLSID{Control CLSID}AppName="contose.exe"(Default)=(REG_SZ)"Control Name"LocalizedStringPolicy=(REG_SZ) Localized Control Name

如果您有其它语言的名称,则设置LocalizedString来指向您控件源文件中包含其它语言名称的源ID。管理加载项首先会检查此值,如果已设定就使用它。如果没有设定,则会显示默认值,通常是英文名。

更多信息请查看以下资源:

?

Signing and Checking Code with Authenticode

?

Introduction to Code Signing

如何判定控件的安全性

控件的安全性是主观上的判断。以下设计好的问题能够帮助您考虑您控件的安全性。您可以使用这些问题作为您大量安全复核的一部分。

?

您能限制域或区域的使用么?查看站点锁定章节可以得到更多信息。

?

您是否在网络上暴露了用户的隐私信息或暴露给了其他用户?

?

您能够在如文件系统、注册表、照相机或其它USB设备上读、写、创建、检查或删除持续的数据么?。

?

这个控件是否使得数据从Internet的一个站点传递到另外一个站点?或者从本地计算机传递到Internet上?

?

这个控件能加载其它代码或脚本么?如果可以,这些代码和脚本来自哪里?

?

这个控件会引起强制性的操作或者在不通知用户的情况下执行程序么?

?

这个控件是否会绕过浏览器、操作系统或其它应用程序中的安全功能?

?

Web页面使用此控件会引起系统的不稳定或停止响应么?

?

这个控件是否会在用户不知情的情况下运行?

?

跨站点脚本攻击是否会利用此控件呢?

?

此控件是否加载自己的数据格式?这种数据类型是否有自身的安全执行?此种数据类型是否允许大量使用?

?

历史、统计或调试信息会一直存在本地计算机么?用户能够清除这些信息么?这些信息是否会被发送到网络中?是否有全球唯一标识符(GUID)用于跟踪用户?

在您设计控件时,还有一些其它通用的问题:

?

从网络得到的字符串是否经过验证、分析或过滤?这些字符串会带来什么?如果它们包含脚本,会发生什么?这些脚本传递到其它组件后会产生什么效果?

?

在哪可能会发生缓冲区溢出?您是否对所有方法、属性和事件进行了完全的缓冲区溢出测试?

?

如何停止外部站点调用控件?

?

如果您没有标记控件为“安全的脚本”或“安全的初始化”,是否要使您的控件失效呢?默认情况下,控件会被标记为不安全脚本或不安全的数据初始化。不要使用它们,除非控件的函数需要它们。

?

控件展现给用户的信息是否是真实的呢?您是否需要对控件进行数字签名呢?

另外,推荐将以下信息编辑成文档。

?

方法

?

属性

?

CLSID

?

事件

?

所有者

?

DLL/OCX名称和版本

安全的测试实践

使用以下四项实践来验证控件是否安全。

基于在威胁建模中已识别的威胁创建测试案例

对于在威胁建模中已识别的每个威胁,您都应当创建测试案例。测试案例应该确定已识别的威胁是否会通过您控件的设计或执行而减轻。设计和开发文档会描述控件如何运行,但只有测试才能够证实控件确实如此运行。

渗透测试

渗透测试是测试人员围绕应用程序的安全特性,在本案例中就是一个控件,所作的安全测试。渗透测试包括拒绝服务、网络压力测试以及用于控件的所有文件格式的模糊测试,但不仅仅只限于这几项。渗透测试应当验证任何外在的访问控制,如ACL,并且也要验证处理不信任数据所有代码的正确性。您也应当测试控件潜在的任何安全风险。例如,如果您对您的控件进行了站点锁定,您应当测试在其它Web站点上进行测试,以确定站点锁定是否被正确执行。

模糊测试

模糊测试应当在任何加载数据的ActiveX控件上执行。模糊测试用于提供在您控件上没有错误输入的结构。这种测试方法需要大量的测试案例,通过大量的数据变化和转换来测试您的控件。通常,使用自动工具来进行模糊测试。模糊测试的目标不是要确保在错误的数据上控件也能正常执行,而是要确保在得到错误的数据时您的控件能够以安全的方式运行。您的控件在得到错误数据时应当不会崩溃或引起缓冲区溢出。

模糊测试应当在您控件的以下区域执行:

?

控件中的任何方法l

?

所有控件使用的参数

?

从远程资源得到的任何数据,例如您得到一个URL,您不仅应当模糊测试URL本身,还需要测试从URL下载的所有文件。

在选择您控件上的模糊数据时需要考虑两种不同的参数。首先您应当考虑是否使用智能还是非智能数据生成。这两种窗体的不同之处很像黑盒和白盒测试的不同。非智能数据生成,就像黑盒测试,生成的输如不考虑数据格式或处理函数。智能数据生成 就像白盒测试,生成的输入是基于正确的数据结构和控件流程的。接下来应当考虑在生成数据时,是否会生成新的数据或改变正确的数据。当进行非智能模糊测试时,生成新的错误数据可能更适合。改变正确的数据更适用于智能模糊测试。对于很多控件,您应当结合使用智能和非智能测试,既生成新的测试数据也改变已有的其它数据。

回归测试

回归测试确保代码的改变不会破坏任何功能。回归测试需要在开发周期的每个主要阶段进行。不仅对于控件的功能,对于控件的安全,回归测试也是十分重要的。

热点排行