标题：在WindowsVista上编写安全的代码
图书信息

作　者：（美）赫沃德（Howard,M.），（美）勒伯雷恩（LeBlane,D.）著
罗爱国译
出 版 社： 电子工业出版社
出版时间： 2008-10-1
页　数：240页
开　本： 16开
ISBN 9787121074196
分类： 图书 >> 计算机/安全>>系统安全
定价：￥35.00元
内 容 简 介

本书内容主要是面向Windows Vista的设计和编码的最佳实践，介绍安全编码的原则，以及在设计和测试软件时应该遵循的原则。全书包括9章，内容包括代码质量、用户账号控制、令牌和完整性级别、网络防护措施、创建安全而且能复原的服务、利用IE的防护措施、加密增强、认证与授权，以及其他的防护措施和安全技术。本书适合Windows下的软件开发人员、设计人员和系统架构师参考，也适合高校计算机相关专业学生阅读。 
序

对于身处高技术产业的每一个人来说，《编写安全的代码（Vista版）》都是值得拥有的。书里表达的观念体现了创造可信赖用户体验里的最新思想。
Microsoft认识到技术将随着摩尔定律应用到社会的各行各业，而更强大、更便宜的计算机将可以迎合所有人的需求。随着宽带网的持续普及，以及新的无线网络技术出现，全世界的计算机设备彼此相连，这给人们访问信息、媒体、和服务带来了空前的便利。不单单是Microsoft有这种远见，它其实也是大部分高科技行业的共识。不论你是否迷信商业或技术，这个远见都给我们描绘了这样一幅图景：我们的行业将怎样高速增长，我们的商业将怎样大获成功，我们将怎样为全世界的人们提供越来越多的便利——每一个人都可以发掘他全部的潜能。这是一幅美妙的前景——我们已经迫不及待了。
为了实现这个前景，需要有一个基本的前提。如果各行各业的人都加入到我们这个美妙的、互连的数字世界，他们将需要一定的信任。他们想知道他们的隐私是否被适当地保护了。他们也想确定他们的关键信息不会被窃取或破坏。他们还想他们的体验更加可靠、简单。这一直都在艰难地发展。
在Microsoft，我们跟踪黑客和与互联网相关的犯罪行动。现在的环境变得很复杂：从为了开玩笑和声望而黑入系统到有组织的犯罪。据不完全统计，全世界与互联网相关的犯罪导致了数十亿美元的损失。这些钱可以用来资助许多工程，这也意味着罪犯在寻找高科技产品里最晦涩的漏洞方面比以往更加执着了。“假设没有人会注意到产品里的漏洞”只是我们一厢情愿的想法。我们生活的时代如果有漏洞出现，就会有人注意并利用它。
当黑客为了获取更高的回报时，他们在共享漏洞信息方面也变得更有组织了。我们现在生活的环境是：罪犯擅长“武装”漏洞信息，使从发现这些漏洞到利用这些漏洞获利之间的时间间隔趋于0。这些罪犯可以算是互联网上有组织犯罪的军火商，他们将这些商品待价而沽。
因为恶意的黑客团伙比以往更有组织性，对于每一个生产高科技产品的人来说，使用严格的技术标准变得越来越重要了，例如《Secure Development Lifecycle》（已有中文版，名为《软件安全开发生命周期》），可以将产品里的漏洞降到最少。因为高科技产品也是人造的，所以并不能保证没有漏洞。然而，如果我们整个产业能联合起来，将可以使我们的防御最大化。
作为一个软件平台，Windows在帮助软件公司交付更安全的软件方面，扮演着特殊的角色。《编写安全的代码（Vista版）》可以帮助那些为Windows编写应用程序的人遵循安全最佳实践，交付从根本上更安全的软件产品。Windows Vista在设计时就考虑到了为软件作者提供相关的特性，从而使他们的软件更安全。这些特性体现了Microsoft对软件应用程序认证、数据保护、防范利用等方面的深刻理解。通过使用Windows Vista提供的安全特性，应用程序在客户眼里将会变得更安全，也更加可信。
实现数字化生活还有很长一段路要走，需要高技术行业协同工作，为人们提供便利和价值。成功的关键因素是创造出人们信任的技术产品。《编写安全的代码（Vista版）》将帮助我们向客户交付从根本上更安全更可信的产品。
Jon DeVaan 
Senior Vice President of Engineering Excellence 
Microsoft Corporation 
February 2007
前  言

互联网上的计算机每天都可能会受到攻击和伤害。毫无疑问，攻击者正逐渐深入软件堆栈，攻击计算机上安装的软件。不过，这种情形正在慢慢变少，因为随着要求安全的呼声日益高涨，软件厂商在操作系统的防护方面投入了更多的人力物力。在Windows XP发布的2001年到Windows Vista发布的2006年期间，安全技术的发展可谓是日新月异，但反观另一方面，令人厌烦的低级攻击行为也在日益增多。我们经常听到有人抱怨Windows是最容易受到攻击的平台。的确如此，因此，下面的陈述可能会使他们更担心：我们（也就是本书的作者）对媒体上报道的攻击事件并不是特别在意，因为在我们看来攻击永远都会发生。其实，人们应该担心的是其产生的危害，正是因为这个原因，微软人从长计议，竭尽全力想把Windows Vista打造成更安全的产品。
Windows Vista是微软公司发布的有史以来最安全的操作系统。我们向里面添加了很多防御性的设计（defensive engineering），也采用了很多防护措施。但令人遗憾的是，即使我们如此努力，但攻击仍将继续（我们可以尽量把自己的工作做得更好，但没有权利指定别人可以做什么，不可以做什么）。我们不是说Windows Vista没有安全bug，它肯定会有，但我们为它增加了许多防护措施，尽量减小它被成功攻击的可能性，减少漏洞被利用的机会。我们加入这些防护措施的目的是尽量避免危害发生。
针对日益增长的潜在攻击威胁，你打算如何保护你的应用程序？记住，攻击迟早都会发生！仅仅因为应用程序的标题中没有“Microsoft”并不意味着不会被攻击，也并不意味着它永远不会被攻击！使安全成为一个令人着魔的主题的不是这样一些因素，比方说，计算机的性能和可靠性。性能与可靠性指的是人与计算机之间的问题，而安全却是人与人之间的较量。安全问题没有终结，因为这个世界上总有一些怀有恶意的人。
除了整理已有的代码、修正设计问题外，微软还为Windows Vista新增了许多功能，利用这些功能可以使应用程序更安全。不同于我们以前那些以介绍基础知识为主的书，本书主要介绍运行在Windows Vista上的应用程序怎样利用系统提供的防护措施来保护用户。除了基本的防护策略外，本书还介绍了一些新的安全功能，你可以在应用程序中使用它们，以增加程序的防护措施，从而帮助你或你的客户达到商业目标。
Windows Vista的安全之路走了5年，在这5年多的时间里，微软向Windows Vista中增加了许多防护措施和新的安全功能。你可以在应用程序中充分利用它们，从而减少被攻击的机会。你可以选用下面介绍的三种方法：
         减少用户——如果没有人用你的应用程序，你就不值得攻击。
         减少攻击面——组件的入口越少（特别是默认情况下），被攻击的可能性也就越小。
         加固攻击面——使攻击者知难而退。
我们不建议大家使用第一个方法，但如果你不重视安全，而且固执己见，基本上可以肯定会出现这种情形。我们希望后两个方法对你有所帮助，使你能利用操作系统提供的防护措施和功能保护用户，这也正是本书的目标——阐述如何在程序中使用Windows Vista提供的这些功能。
目标读者
这本书的目标读者主要是那些为Windows Vista编写软件的开发者。当然，这本书还包括一些软件设计上的内容，因此，软件设计师和系统架构师也会从中获益。不过要注意的是，书中包含了大量的代码。
我们将假设读者已经掌握Windows认证与授权等方面的基础知识。虽然书中提供了一些背景信息，但我们仍将假设你知道怎样在Windows里保护对象。如果你不知道，建议你先找一些像“Windows Internals Fourth Edition”（Mark Russinovich，David Solomon，Microsoft Press 2005）之类的书来读。
本书与“Writing Secure Code”（《编写安全的代码》）一书的关系
“Writing Secure Code”（微软出版社）第一版和第二版的内容主要是介绍关键的安全编码的原则，除此之外，书中还简单介绍了在设计和测试软件时应该遵循的原则。而本书的主要内容是介绍怎么利用Windows Vista内部的防护措施和功能，编写出安全的代码。如果你已经有了“编写安全的代码”一书，本书也不会显得多余，因为本书的内容主要是面向Windows Vista的设计和编码的最佳实践，而“编写安全的代码”的内容是宽泛的、基础性的。因此，这本书不是“编写安全的代码”的超集，而是它的有益补充。
如何阅读本书

这本书很薄，如果你打算或正在Windows Vista下编写软件，那么，这本书就是为你准备的——因为你可以从中了解到微软在Windows Vista里新增或改进的防护措施和技术。
本书每一章的内容都相对独立，除了前三章——所有在Windows Vista下编写软件的开发者都应该阅读，其他章节可以有选择地阅读。
第1章，“代码质量”描述了我们为剔除潜在的安全bug，在Windows Vista的代码层所做的改进。软件行业可以从微软为Windows Vista增加安全性所采取的措施中学到很多东西。
第2章“用户账号控制、令牌和完整性级别”和第3章“缓冲区溢出防护”是一定要读的，因为这两章介绍的技术影响着Windows Vista里所有其他的功能。
现在是网络时代，即使不是所有的开发者，至少大部分的开发者将会编写基于网络的应用程序，因此，应该熟读第4章“网络防护措施”，并学以致用。
编写服务程序的开发者应该仔细阅读第5章“创建安全而且能复原的服务”，因为我们提供的指导可以使得服务在面对攻击时更有弹性，并使创建以尽可能低的特权运行的服务变得更容易。
如果你为IE编写代码，比如说BHO（browser helper objects）、工具条或ActiveX控件，那么你应该阅读第6章“利用IE的防护措施”。Windows Vista的IE 7在架构上做了很多改进，并新增了许多防护措施，这些将影响代码的运行方式。
如果你的软件中使用了加密函数，那么你应该阅读第7章“加密方面的增强”，因为第7章除了介绍名为Cryptography API：Next Generation（CNG）的新加密结构体系外，还增加了更新的算法及证书的撤销与检验等内容。
开发企业级软件的程序员将从第8章“认证与授权”中找到需要的内容，本章简单地介绍了Windows Vista里的认证及ACL等概念。
最后一章“其他的防护措施和安全技术”介绍的是一些Windows Vista中新加的，但又不适合放在其他章节中的防护措施。你应该花一些时间阅读本章，从而确定在你的软件中是否采用这些功能和防护措施。
如何使用书中的代码
本书中的代码大部分是用C/C++写的，只有很少一部分是用C#写的，使用的开发环境是Microsoft Visual Studio 2005 Team Suite Service Pack 1和Windows Software Development Kit（SDK）。对C/C++开发来说，首先要安装Visual Studio，接着安装Windows SDK。除此之外，还要向Visual Studio中添加相关的Windows SDK头文件和库文件，从而使Visual Studio首先从更新后的目录读取。你可以按下面的步骤操作：
打开Visual Studio；
选择工具|选项；
找到并展开项目和解决方案；
选择VC++目录；
单击新行图标；
增加Windows SDK include files所在的目录路径。
重复上面的步骤添加可执行文件和库文件。下图显示的对话框可以说明正在讨论的问题。当然，你也可以在安装SDK时接受更新环境变量的选项——记得要重启开发环境。
最后，在你的应用程序中，你应当在包含其他头文件之前增加下面这一行，插入在stdafx.h文件的第一行比较合适。
#define _WIN32_WINNT 0x0600
如果你的代码中没有这一语句，而又引用了Windows Vista中新增的函数、定义、常量或结构时，可能无法通过编译。
重要  注意，书中所有的C/C++例子代码在合适的地方都用了SAL（在第1章里介绍），用warning level 4（/W4）编译时不会出现警告，也没有PREfast警告（/analyze），当然，我们用于演示不安全的编程实践的例子除外。
对于C#开发来说，只要程序是在安装了Windows Vista计算机上运行，就不需要更改开发环境的任何设置。
本书配套的网站上有什么？
本书讨论的所有的代码例子都可以从配套的Web页面上下载，地址是：
http://www.microsoft.com/mspress/companion/0978735623934
请你务必先读一下readme文件，该文件中对所有的例子代码做了介绍。
系统需求
任何能运行Windows Vista的机器都能运行本书里的例子代码（可以在配套的Web网站上下载），运行Windows Vista的最低需求是：
        800 MHz处理器
        512 MB内存
        支持DirectX 9的显卡
        20 GB硬盘，15 GB可用的硬盘空间
为了获得更好的Windows Vista体验（包括Windows Aero的视觉效果），你的计算机至少需要满足以下需求：
        1GHz处理器
        1 GB内存
        支持DirecteX 9的显卡，支持Windows Vista Display Driver Model（WDDM）的显示器，128 MB显存（如果GPU使用共享内存，则不需要独立显存），Pixel Shader 2.0，每像素32位。
        40GB硬盘，15 GB可用的硬盘空间
        内/外置DVD-ROM
        声卡
        可以访问互联网
目  录

第1章  代码质量        1
1.1  Windows Vista质量阀        3
1.2  用SAL注解所有的C/C++字符串缓冲区        4
1.2.1  SAL示例        5
1.2.2  如何在已有的代码里使用SAL        9
1.3  从代码库中剔除被取缔的API        10
1.4  从代码库中剔除被取缔的加密算法        11
1.5  通过静态分析发现并修复bug        12
1.5.1  与/analyze相关的警告        12
1.5.2  Application Verifier警告        13
1.5.3  FxCop警告        14
1.6  用/GS选项编译UnmanagedC/C++程序，并用/SafeSEH，/DynamicBase和/NXCompat选项进行连接        14
1.7  行动起来        14
1.8  参考资料        15
第2章  用户账号控制、令牌及完整性级别        16
2.1  深入UAC        18
2.1.1  从初级用户令牌开始        18
2.1.2  提升为管理员        23
2.1.3  一个小小的变种：“具有认可模式的管理员”        23
2.1.4  最新的Windows Vista令牌格式        25
2.1.5  确定一个进程是否被提升        25
2.1.6  怎样要求一个应用程序以管理员身份运行        27
2.1.7  使应用程序提示凭证（密码）或同意        31
2.1.8  用COM Elevation Moniker启动COM组件        32
2.1.9  启动提升的可控代码应用程序        34
2.2  用户接口需要考虑的事项        34
2.3  虚拟化        35
2.3.1  怎样在你的应用程序中禁用虚拟化        39
2.4  完整性级别        40
2.4.1  完整性设置的规则        51
2.4.2  NW、NR和NX Masks        51
2.4.3  使用完整性级别的防护模型        52
2.5  Windows Vista里调试应用程序的兼容性问题        53
2.5.1  File Warnings        54
2.5.2  Registry Warnings        54
2.5.3  INI Warnings        54
2.5.4  Token Warnings        54
2.5.5  Privilege Warnings        54
2.5.6  Name Space Warnings        54
2.5.7  Other Objects Warnings        55
2.5.8  Process Warnings        55
2.6  代码签名的重要性        55
2.7  Windows Vista里的新特权        56
2.8  行动起来        57
2.9  参考资料        57
第3章  缓冲区溢出防护        60
3.1  ASLR        62
3.1.1  ASLR的限制        65
3.1.2  性能和兼容性        65
3.2  栈随机化        66
3.2.1  性能和兼容性        67
3.3  堆防护措施        67
3.4  NX        73
3.4.1  性能和兼容性问题        76
3.5  /GS        79
3.6  SafeSEH        83
3.7  小结        89
3.8  行动起来        90
3.9  参考资料        90
第4章  网络防护措施        91
4.1  IPv6概述        93
4.1.1  Teredo        95
4.2  网络列表管理器        98
4.3  Windows Vista RSS平台        99
4.4  Winsock安全套接字扩展        101
4.5  更安全的Windows防火墙        103
4.5.1  全局防火墙设置        103
4.5.2  创建规则        106
4.5.3  与规则组共事        113
4.6  行动起来        115
4.7  参考资料        115
第5章  创建安全又能复原的服务        117
5.1  服务概述        118
5.2  服务账号        119
5.3  减少特权        123
5.4  控制网络访问        130
5.5  与桌面进行通信        133
5.5.1  Simple Message Boxes        135
5.5.2  共享内存        135
5.5.3  命名管道        136
5.5.4  套接字        141
5.5.5  RPC/COM        142
5.6  实践出真知        142
5.7  行动起来        143
5.8  参考资料        144
第6章  IE7的防护措施        145
6.1  普及的防护措施        147
6.1.1  ActiveX opt-in        147
6.1.2  保护模式        148
6.1.3  数据执行保护        152
6.2  cURL和IUri接口        155
6.3  锁住你的ActiveX控件        158
6.4  你应当知道的关于IE7的其他事情        158
6.4.1  禁止访问剪贴板        158
6.4.2  脚本URL        158
6.4.3  Good-bye PCT and SSL2 (and Good Riddance), Hello AES!        159
6.4.4  Window Origin        159
6.5  行动起来        159
6.6  参考资料        160
第7章  加密方面的增强        162
7.1  内核模式和用户模式支持        163
7.2  敏捷加密        164
7.2.1  CNG中的敏捷加密        165
7.3  CNG中的新算法        167
7.4  使用CNG        168
7.4.1  加密数据        169
7.4.2  Hashing数据        169
7.4.3  MACing数据        170
7.4.4  生成随机数        170
7.5  CNG和FIPS        171
7.6  改良的审计        172
7.7  CNG缺少的东西        173
7.8  SSL/TLS改进        173
7.8.1  SSL/TLS撤销检查和OCSP        175
7.9  Windows Vista里的根证书        177
7.10  Windows Vista拒绝的加密功能        178
7.11  行动起来        179
7.12  参考资料        179
第8章  认证与授权        181
8.1  WindowsCardSpace及Information Cards        181
8.1.1  Information Cards数据流        182
8.1.2  WindowsCardSpace和网络钩鱼        183
8.1.3  CardSpace和网络钓鱼示例        185
8.1.4  看Information Cards的实际使用效果        187
8.1.5  Information Cards包含什么内容        187
8.1.6  通过编程的方式访问Information Cards        188
8.1.7  CardSpace小结        190
8.2  图像识别和授权改变        191
8.3  Owner SID改变        191
8.4  行动起来        193
8.5  参考资料        193
第9章  其他的防护措施和安全技术        195
9.1  在应用程序中增加父母监控        196
9.1.1  代码        197
9.1.2  时间限制        198
9.1.3  The 450 Error        199
9.1.4  检测是否启用了“Block file downloads”        199
9.1.5  为你的应用程序或URL关闭过滤        199
9.1.6  记录事件        200
9.2  Windows Defender APIs        201
9.2.1  签名你的代码        202
9.2.2  请求加入Windows Defender “Known or Not Yet Classified” 列表        203
9.3  新的Credential User Interface API        203
9.4  使用Security Event Log        206
9.5  指针编码        207
9.6  内核模式调试相关        211
9.7  通过编程访问TPM        211
9.7.1  对TPM的低级访问        214
9.8  Windows SideBar和Gadget方面的安全性考虑        219
9.9  参考资料        220