• Visual Studio 2005 中的新增安全性功能


    Visual Studio 2005 中的新增安全性功能

    发布日期: 11/18/2005 | 更新日期: 11/18/2005

    Brian Johnson
    项目经理
    Microsoft Corporation

    摘要:Visual Studio 2005 使开发人员能够更轻松地编写安全的应用程序。编写安全的非托管代码,或获取 IDE 工具,该工具有助于您创建和部署利用了代码启用安全性的托管应用程序。

    *
    本页内容
    简介 简介
    用于本机代码的安全性增强功能 用于本机代码的安全性增强功能
    用于托管代码的安全性增强功能 用于托管代码的安全性增强功能
    其他安全性增强功能 其他安全性增强功能
    结论 结论

    简介

    开发人员希望创建安全的应用程序,但是大多数开发人员不希望花费过多时间来学习如何保护他们的应用程序。他们更愿意编写解决问题的代码和算法,然后发布产品,而不必担心安全性。但是,目前我们不能将自己置于危险境地而且不顾应用程序。我们需要了解我们所做的决定中存在的安全隐患。牢记这一点,我们就可以使创建和提供应用程序的工具能够更轻松地提供安全的应用程序。在本文中,我将回顾 Visual Studio 2005 的一些有助于创建安全、可靠的应用程序的功能。Visual Studio 2005 中的大多数工具和增强功能几乎不需要额外工作,并能对应用程序的整体安全性产生巨大的影响。

    用于本机代码的安全性增强功能

    Visual C++ 是唯一一个能够使您直接面向处理器(即创建非托管 exe 和 dll 和本机 exe 和 dll)的 Visual Studio 编译器。

    我们将在本节中讨论用于本机代码的安全性增强功能。请注意,除非另有指定,否则本材料适用于 Visual C++。

    本机代码中存在的大部分安全性问题都属于缓冲区溢出这一类。当超出缓冲区大小的数据被推入可在其中执行代码的内存部分时就会发生缓冲区溢出。当狡猾的攻击者准确地计算出他需要溢出多少缓冲区才能将指令放入内存部分(他可以利用这部分内存攻击该程序的执行)时,这种情况就会成为问题。

    记住了缓冲区溢出的简化定义后,我们将介绍 Visual Studio 2005 的四个功能,旨在帮助您找到代码中潜在的弱点,如果有任何疏漏,还能帮助阻止攻击者利用这些弱点。

    代码分析

    代码分析是 Visual Studio 2005 Team Edition for Software Developers 的一项功能。此功能是从一个最初在 Microsoft 内部使用的实用程序(称为 PREfast)派生而来的。它是 Microsoft Device Driver Kit (DDK) 公开附带的。该代码分析功能的工作方式是,分析 C 和 C++ 源代码,逐个查看每个函数中所有可能的执行路径,然后模拟执行以评估问题的每个路径。代码分析不执行代码,并且无法找到所有可能存在的错误,但是它可以找到编译器可能忽略的错误。代码分析找到的问题涉及转换和数据类型、性能、安全性、表达式、循环、内存分配、格式字符串、返回值和异常处理等方面。

    在 Visual Studio 2005 Enterprise Edition 中启用代码分析之后,检测到的错误显示在“错误列表”窗口中。可以使用 /analyze(/分析)选项,或在 Property Pages(属性页)对话框的 Code Analysis Node(代码分析节点)的 General(常规)部分中将 Enable code analysis for C/C++(启用 C/C++ 的代码分析)选项设置为 Yes(/analyze) [是(/分析)] 启用代码分析,如图 1 所示。


    图 1:通过代码分析可用的安全性规则

    应用程序验证器

    应用程序验证器 (AppVerifier) 最初是作为应用程序兼容性工具包的一部分提供的。AppVerifier 是一组运行时分析测试,可以帮助检测程序中的执行错误。应用程序验证器检测到的错误大多数都涉及到应用程序兼容性、稳定性和安全性问题,并可以分为三个不同类别:句柄验证、锁验证和堆验证。可以在 Property Pages(属性页)对话框中的应用程序验证器节点中找到 AppVerifier 的这些设置。

    要启动应用程序验证器,在 Debug(调试)菜单中,单击 Start with Application Verifier(启动应用程序验证器)。在不同验证层找到错误时,应用程序验证器使用停止来提供信息。出现停止时,开发人员可以将应用程序验证器设置为执行特定操作。这些操作包括暂停错误和记录错误。图 2 显示了 Property Pages(属性页)对话框中的应用程序验证器设置。


    图 2:使用应用程序验证器停止选项

    缓冲区安全性检查/GS

    Visual C++ 缓冲区安全性检查编译器选项 (/GS) 旨在帮助防止恶意代码利用应用程序中的缓冲区溢出。代码中的很多漏洞是缓冲区溢出。/GS 选项通过在缓冲区末尾设置一个加密后的值(有时称为“告密者”)来工作。此值是在代码执行期间检查的。如果此值已被更改,则暂停程序执行,并引发安全异常。

    /GS 选项不能防止缓冲区溢出,但是它确实可以通过停止程序执行防止可能对代码进行的攻击。

    安全的 CRT 库

    安全的 CRT 库是标准 C 和 C++ 库的改进。它们旨在通过向已知的易受攻击的函数添加适当的缓冲区检查以提高使用 Visual C++ 编译的应用程序的安全性,并减少易受攻击的运行时函数。

    这些更改影响了所有主要编程库,包括 C 运行时库 (CRT)、标准 C++ 库 (SCL)、Microsoft 基础类 (MFC) 和活动模板库 (ATL)。作为此改进的一部分,已经重建 MFC 和 ATL 以便使用安全的 C 库函数,因此使用 Visual C++ 2005 重新编译 MFC 和 ATL 应用程序将自动提供安全的 C 库的一些优点。

    有关安全的 CRT 库的详细信息,请参阅由 Martyn Lovell(Microsoft Visual C++ 开发组长)编写的 MSDN Magazine 文章 Repel Attacks on Your Code with the Visual Studio 2005 Safe C and C++ Libraries(英文)。

    用于托管代码的安全性增强功能

    托管代码带来一套略有不同的安全性问题,但是由于在公共语言运行时 (CLR) 中处理该内存的方式,传统的缓冲区溢出问题较少。本节中我将回顾一些 Visual Studio 2005 的安全性功能,这些功能对正在编写托管应用程序的开发人员最为重要。

    FxCop

    数年来,开发人员使用独立的 FxCop 工具来检查程序集以便与 .NET Framework 设计指南一致。现在,此工具内置于 Visual Studio 2005 中。

    FxCop 通过解析 MSIL 指令流和分析与用户指定的规则冲突的调用图来执行其分析,这通常依照 .NET Framework 设计指南执行。这些规则包括安全性规则、库设计规则以及全球化规则、互操作性规则、可维护性规则、命名规则、性能规则、可靠性规则、使用规则和其他规则。

    可以通过托管应用程序的 Project Properties(项目属性)页上的 Code Analysis(代码分析)选项卡来访问 Visual Studio 2005 中的 FxCop 功能。图 3 显示了某些可以作为分析的一部分查看的安全性规则。


    图 3:访问 Visual Studio 2005 中的代码分析规则。

    可以通过检查托管项目的 Code Analysis Properties(代码分析属性)页上的 Enable Code Analysis(启动代码分析)框来启用代码分析。执行此操作将在 Visual Studio 2005 Error List(错误列表)窗口中生成其他警告。可以通过选择仅分析您感兴趣的规则集(例如安全性规则和可靠性规则)来减少该列表中的项目数。

    代码启用安全性/最低权限

    .NET Framework 应用程序是在称为代码启用安全性的安全模式下运行的。此模型基于证据,在该模型中根据诸如程序集的位置以及程序集的签名等因素授予安全性权限。这些因素被比作在用户级、计算机级或域级设置的策略。与这些不同因素相关的策略允许应用程序使用授予的非常特殊的权限来运行。此概念称为部分信任。

    部署部分信任应用程序的一个难点是在开发这些应用程序时测试这些应用程序。通常,开发人员具有运行其创建的应用程序的完全权限,但是若要查看该应用程序在 Intranet 或 Internet 上的表现方式,需要将该应用程序移动到那些位置才能测试那些条件下的应用程序。Visual Studio 2005 通过提供一些工具和功能在这方面帮助开发人员,开发人员可以使用这些工具和功能从 IDE 测试并调试他们的应用程序,以确保在部署这些应用程序时,他们能够在策略授予的信任级别下正常操作。

    ClickOnce 部署

    ClickOnce 是内置于 Visual Studio 2005 的技术,它使开发人员能够轻松地为以有限权限的帐户身份运行的用户创建要部署的应用程序。可以在本地、从 Intranet 共享或 Web 页上的 http 链接上运行这些应用程序。从网络位置运行的应用程序在本地缓存和运行,但可以使用仅为该应用程序实际所在位置授予的权限来完成此操作。如果开发人员将新版本的应用程序部署到网络位置,当最终用户启动该应用程序时,首先检查该位置,并且更新该缓存。

    Visual Studio 2005 使开发人员可以从 IDE 内测试这些部分信任应用程序的执行。这能够节省开发人员使用 CAS 创建和部署应用程序的时间和精力。

    在区域中调试

    要利用 ClickOnce,重要的是开发人员能够轻松地使用将授予该应用程序的一组权限测试他们的应用程序。在区域中调试功能允许开发人员指定在设计和调试应用程序时应用程序将需要的信任量,能够在将应用程序以各种信任级别部署到网络位置时对其进行测试。可以通过托管应用程序的 Project Properties(项目属性)页中的 Security(安全性)选项卡来访问此功能。

    要使用此功能,请打开项目的 Security(安全性)选项卡,并且指定这是部分信任应用程序。从中您可以选择要安装应用程序的区域,并且可以指定部署应用程序时,应用程序需要哪些权限。可以在图 4 中看到这些设置。


    图 4:在项目的 Security(安全性)选项卡上指定应用程序的安全性权限。

    调试期间改进的安全异常

    一旦设置区域之后,运行应用程序将生成该区域的安全异常,因为该应用程序正在运行。显示在图 5 中的新安全异常对话框使您能够了解调试应用程序时遇到安全异常的情况下可以参照的方法。


    图 5:Visual Studio 2005 中的安全异常

    Security Exception(安全异常)窗口不仅仅能够提供通知。它还列出了您更改应用程序时可以采用的建议和步骤,使应用程序在部分信任方案下运行。例如,运行图 4 中的程序的区域内不允许有 FileIOPermission。纠正此问题的建议之一是使用该应用程序的隔离存储区。

    区域 IntelliSense(Visual Basic 功能)

    区域 IntelliSense 是针对 Visual Basic 的安全性功能。区域中的安全性将 IntelliSense 提供的选项限制为只有特定区域中允许的那些 API。当前区域中不可用的功能都灰显。这会有助于创建部分信任应用程序的开发人员仅选择已知允许用于某个特殊区域的 API。

    PermCalc

    PermCalc 是 .NET 开发人员使用的独立应用程序,用于分析成功运行托管应用程序所需的权限。现在,已经将此功能添加到 Visual Studio 2005 中,只需要在托管应用程序的 Project Properties(项目属性)窗口的 Security(安全性)选项卡以外的地方单击即可。

    要在 IDE 中使用 PermCalc,请设置应用程序的安装区域,然后单击 Calculate Permissions(计算权限)按钮。如果应用程序要求的权限多于可用于该区域的权限,您将在该页权限表的 Settings(设置)列中看到单词“Include”,如图 6 中所示。将用警告符号标记这些项目,以指明默认情况下所需权限在所选区域中不可用。如果 PermCalc 实用程序确定该应用程序需要完全信任才能正常运行,将显示一个消息框,将这一事实通知给您。


    图 6:计算权限确定应用程序需要哪些权限才能正常运行。

    其他安全性增强功能

    有很多 Visual Studio 2005 安全性增强功能对于本机项目和托管项目都很有用。下面,我们来看一看应用于安全性的使用最低权限的开发和测试。

    作为最低权限的开发和调试

    计算机用户防止恶意软件影响他们系统的一种方式是降低运行它们的权限级别。具有管理员权限的用户所运行的恶意软件能访问计算机的各个部分。从一般的安全性角度而言,避免使用管理员权限运行。

    此外,在运行应用程序时,作为管理员登录的开发人员不能看到以较低权限登录的用户能看到的问题。例如,写入 Program Files 或 System 文件夹的应用程序将为以管理员权限运行的用户无缝地工作。以 User 身份运行的帐户对这些文件夹进行写入访问会受到限制,因此尝试使用该应用程序在这些位置保存数据将失败。

    在 Visual Studio 以前的版本中,很难使用具有较低权限的帐户创建和调试应用程序,因为 Visual Studio 本身在高权限帐户下才能以最佳状态运行。使用 Visual Studio 2005 之后,这种情况发生了改变。Visual Studio 2005 完全在用户帐户下运行,用这种方式开发和调试应用程序与以前的 Administrator 或 Debugger User 帐户一样轻松。

    请记住即使在 Visual Studio 2005 中,您也可能遇到加载项需要使用更高权限帐户才能运行的问题。遇到这种情况后,让加载项供应商知道他们的加载项需要的权限比可能需要的权限更多。在大多数情况下,将存储区或注册表请求重定向到适当的位置能够使该加载项正常运行。

    测试功能

    安全性问题的测试是创建应用程序以在连接环境中使用的非常重要的部分。Visual Studio 2005 Team System 提供了很多有助于生成更安全的应用程序的测试工具。

    单元测试

    单元测试的一个用途是确保方法的返回值为预期值,给定传递到方法的值。处理用户数据时,重要的是要确保该数据是预期数据。包括数据的类型和长度,在处理该数据之前应首先验证这两个因素。可以使用单元测试将随机数据发送给函数,并确保应用程序以正确的方式处理数据以及该应用程序表现正常。

    此外,可以在单元测试中启用代码范围。代码范围有助于确保测试了应用程序中的该代码。这有助于防止丢失很少使用的代码,例如异常处理程序。在应用程序中,不属于常规流程的代码仍然易受攻击。当常规流程中断时,很多攻击者利用专门用于运行的代码。

    Visual Studio 2005 提供了很多允许您创建单元测试的测试工具。在 Visual C++、Visual C# 或 Visual Basic 中,可以从 Add New Test(添加新测试)对话框中手动创建单元测试,如图 7 所示。


    图 7:在 Visual Studio 2005 的 Add New Test(添加新测试)对话框中创建新单元测试

    除了手动创建单元测试以外,还可以使用单元测试向导创建测试。这会有助于您了解这类测试的工作方式,并为您自己的测试提供一个起点。

    压力(加载)测试

    加载测试很重要,因为它有助于调试方案,例如针对 Web 应用程序启动的可能的拒绝服务攻击。Add New Test(添加新测试)对话框中的 Load Test(加载测试)模板调用了新建加载测试向导,如图 8 所示。除了执行您希望应用程序执行的加载测试以外,也可以使用此工具测试异常方案。通过发送针对应用程序的大量请求查看它如何拦截该加载可以实现该目的。通过密切观察应用程序,可以开始识别攻击,如果需要,可以为其中一种类型的攻击计划一个响应。


    图 8:在 Visual Studio 2005 中准备加载测试

    结论

    本文提供了一些安全性功能的简要概述,使 Visual Studio 2005 成为开发人员的重要新工具。无论您是创建小的实用程序还是创建大的关键任务系统,都应最先考虑客户计算机的安全和您所创建的应用程序的安全。使用内置在 Visual Studio 2005 中的新工具,您可以更轻松地创建、测试和部署安全的应用程序。


    Brian Johnson 是 MSDN 的项目经理。他负责 MSDN 中有关 Visual Studio、Visual C++、Security 和 .NET Framework Developer Center 内容。

  • 相关阅读:
    C++中虚函数
    ES6入门四:对象字面量扩展与字符串模板字面量
    ES6入门三:解构
    ES6入门二:默认值与默认值表达式
    ES6入门一:块级作用域(let&const)、spread展开、rest收集
    JavaScript严格模式
    JavaScript中with不推荐使用,为什么总是出现在面试题中?
    ES6入门一:ES6简介及Babel转码器
    HTML5之websocket
    HTML5之fileReader异步读取文件及文件切片读取
  • 原文地址:https://www.cnblogs.com/xiaorui/p/283188.html
Copyright © 2020-2023  润新知