级别: 初级 Gary McGrawReliable Software Technologies John ViegaReliable Software Technologies
1999 年 9 月 01 日 欢迎阅读新的“开发人员安全性”专栏!您将在这里发现一些深入详尽的安全性讨论,这些讨论的范围涉及从如何应用常见的安全性技术到您自己编写的更安全的代码。我们的最终目标是无须借助“插入修补”方法就能帮助您消除不安全代码,并在这一过程中有一些乐趣。我们的第一篇专栏文章向您介绍安全思想,并解释我们为什么把精力专门放在开发者所面临的软件安全性问题上。
随着企业一窝蜂似地采用电子商务,安全性不再是一件微不足道的事情了,它已经开始成为一个重要的问题。但是由于大多数计算机用户不太了解安全性,大多数专门讲述计算机安全性方面的书籍仅仅涉及一些基本的技术问题,例如,什么是防火墙,什么时候使用 DES 加密算法或者哪个防病毒产品最好。其余书籍则集中在目前的“热门话题”,诸如 BackOffice 2000 的错误或“美丽莎”病毒。虽然这些主题对于
用户来说非常重要,但是我们的专栏将把精力主要放在
开发人员所面临的安全性问题上。
已经存在很多很好的同安全性相关的新闻和概述的参考资料。我们不会涉及其他每个人都在讨论或已经讨论过不知多少次的主题。相反,我们将精力放在
如何开发安全应用程序上。例如,许多流行的出版文章讨论密码术:它是什么,以及何处、何时及如何使用它。在本专栏中,由于我们将从
开发人员的角度来看待密码术,因此您将学会在何时、为什么以及如何将其整合到您的应用程序中去。
作为开发人员,您可能主要负责保证您所编写的系统的安全性。尤其是在当今世界中,大多数应用程序要么已联网,要么必须同联网的程序共存,您必须密切注意整个开发过程中的安全性。许多开发人员意识到设计时要注意安全性,但是很少人知道如何去做。很难找到关于如何编写安全应用程序方面的好的参考资料。看起来人们是通过交谈来传播技巧的,但是很少开发人员能了解得很全面。和我们谈过话的大多数开发人员承认对安全性知之甚少;几乎所有开发人员都想了解足够的安全知识以便对他们的程序的安全性有信心。
我们的目标是使您,也就是开发人员,掌握能够创建安全系统所需的实际知识。的确,从事有关安全性方面产品(例如防火墙、侵入探测系统以及安全 Web 服务器)的开发人员将会发现本专栏十分有用。但是,不仅仅是这些开发人员,
任何软件的开发人员都将从本文受益。
您不必为编写需要安全的软件而编写安全性软件。当今大多数软件都设计成以某种方式在网络上交互,并且只要一涉及网络,安全性就显得尤为突出。
我们也打算通过本专栏帮助开发人员成为业余安全性分析人员。可能不使人吃惊的是,开发人员创建安全代码时需要了解的许多事情最后证明也同安全性分析人员相关。安全性
总是没有说的那么容易。当您创建安全性至关重要的系统时,一双额外的眼睛经常会有所帮助,尤其是当这双眼睛对实际安全性风险非常警惕时更是如此。
各种特性
安全性是一个可被添加到现有系统的功能部件吗?它是一种无论代码所处什么环境都保持一致的软件静态特性吗?这些问题的答案是非常明确的:
不是。
和许多用收缩性薄膜包装用户商品的供应商所认为的相反,不能在完成系统之后把有效的安全性象拧螺丝一样拧到系统中去。安全性是软件系统在系统范围存在的特性。因此,从设计软件的最开始就应该考虑到安全性。
安全性就象保险、可依赖性、可靠性或任何其它的软件
特性。就如同使用一个不可靠系统再添加一个“可靠性”模块然后希望获得无错的软件是不可能的一样,把安全性象另外一个功能部件一样添加到应用程序也是不可能的。
安全性是在特定环境下完整系统的行为特性。实际上,安全性是如此依赖环境,以致于完全有可能一个在专用网络上的实现是完全安全的系统,放在因特网上,却以一个极易危及安全的灾难而告终。(无疑,您肯定看到过这一现象的发生。)
“插入修补”方法不是一个好方法
许多众所周知的软件供应商好象不理解安全性不是一种可添加的功能部件。他们继续以惊人的速度设计并生产产品(这大多是由因特网时间现象导致的),而很少注意安全性。他们只有在其产品遭到某人公开地(并且经常是突如其来地)损害时才开始担心安全性。然后,他们匆忙赶制出一个补丁程序,而不是意识到从一开始就考虑安全性是更好的办法。
这种方法在电子商务应用程序中行不通。问题包括:
- 开发人员只能够修补他们知道的问题。攻击者可能会找到他们决不会向开发人员报告的问题。
- 由于系统管理员通常工作过度,并且他们不想更改“有效”的系统,因此他们一般不会应用补丁程序。有时管理员甚至没有意识到应该将某一重要的补丁程序应用到系统上。
- 供应商们通常是迫于市场压力才赶制出补丁程序,因此经常会在补丁程序中引入新的问题。
- 补丁程序仅仅只是修补某一问题的症状,它们不能解决根本的原因。
我们的目标是帮助您避免遇到试图修补一个遭到攻击者猛烈攻击的问题的绝望局面。从简单的经济性考虑,在发布软件系统之前找到并除去错误的成本比发布后再试图修复系统的成本要低得多也有效得多。通过设计安全系统、仔细实现该系统、然后在发布之前全面测试该系统,您可以消除这些问题,并开发出一个不依赖补丁程序的真正安全的系统。
所有安全性问题的根源
简单地说,软件是所有常见计算机安全性问题的根源。如果您的软件运行不正常,您可能面临可靠性问题、可用性问题、保险问题以及安全性问题。使安全性问题变得复杂的原因可能是某个坏家伙总在试图
使您的软件运行不正常。
“骇客(Cracker)”或攻击安全性漏洞的坏家伙并不制造漏洞;他们只是攻击漏洞,并且经常以脚本的形式广泛地分发他们的攻击代码。(顺便提一下,骇客和黑客之间的差异在于骇客进行破坏,而黑客则编写优秀的代码。参阅本文后面的
“黑客和骇客的分形世界”。)
抛开骇客和黑客不谈,安全性漏洞和脆弱性是拙劣的软件设计和实现的结果。为了避免编写这种拙劣的软件,请阅读本专栏,以得到有关常见错误的信息和可以帮助您编写更安全代码的好主意。
未来专栏的内容
我们将会涉及四大方面:
- 安全性保证
- 编写安全代码
- 安全性测试技术
- 应用常见安全性技术
安全性保证
在下一篇专栏文章中,我们将介绍风险分析方法学,它比“插入修补”方法有效得多。在未来的专栏里,我们将论述以下这些主题:如何进行风险分析,安全性测试的重要性以及它和传统功能测试之间的差异,以及如何象坏家伙一样思考。
编写安全代码
大多数安全性错误都是由少数几个根本原因引起的。在未来的专栏里,我们将就主要的根本原因(诸如缓冲区溢出问题和争用情况)向您提出警告以便您可以避免这些陷阱。我们也将讨论比较少见的攻击(诸如中间人攻击(man-in-the-middle)),以便您可以通过防护性编程来加以避免。
我们还将涉及重要的编程语言问题,它们能够对代码安全性造成影响,这些问题包括类型系统为什么会起作用,Java 为什么比 C 好,以及什么是基于语言的封装。我们也将讨论分布式系统以及它们对安全性的影响,包括 CORBA、COM 和 EJB 安全性问题。
安全性测试技术
安全性测试是一个好主意 ― 尤其是因为坏家伙往往这么做 ― 但是很少有好的免费或商业工具可用。我们将帮助您充分利用可以获得的工具,我们还将向您演示如何不用工具来应用测试技术。一项技术是
静态分析,它不实际运行代码而只是通过查看代码以找出潜在的脆弱性。另一项技术是
动态分析,它通过实际运行代码来测试代码。这两项测试技术在开发人员工具箱里都有其位置。我们将帮助您确定在什么时候使用哪种技术。
应用常见的安全性技术
许多系统架构设计师的一个常见的误解是,使系统安全的方法归根结底是防火墙和密码术。在未来的专栏里,我们将解释为什么安全性不是密码术,为什么密码术没有说的那么容易以及为什么使用防火墙和代理服务器只是徒劳。
移动代码导致大量安全性问题。我们将解释为什么移动代码安全性十分重要以及未来的系统中会有些什么。我们还将解释沙箱(常见的代码封装方法)的工作原理以及它为什么没有说的那么容易。我们将涉及代码签名,代码签名最近发展得非常快,尤其是在 Java 2 世界里。
最后,我们将解释如何在您自己的应用程序中建立防盗自动警报,以及侵入探测的现代方法可能对您有何帮助。
黑客和骇客的分形世界
我们承认:我们是黑客。但是请不要准备使用手铐;我们不闯入别人的机器,阅读他人的电子邮件以及擦除硬盘。事实上,我们(至少当提到计算机时)严格遵守法律。
“黑客”这个词起先有正面的含义。它起源于二十世纪六十年代后期 MIT 的计算机科学文化,在那里它用做一个荣誉的标志,用于指那些十分擅长通过巧妙的编程来解决棘手的问题的人。对于 UNIX 开发社区中的大多数人来说,这个词指优秀的热衷于编程的人。黑客经常喜欢研究摆弄一些东西,并喜欢研究出它们的工作原理。
然而,软件工程师们却对这一称谓持一些略微否定的看法。他们将黑客看作电视上的 McGyver 在编程世界的对等物 ― 一个只要给一团钓鱼线、一纸板火柴和两块口香糖就能够解决困难的编程问题的人。软件工程师的想法并不是说黑客不怀好意;而是说黑客编写的是勉强可接受的只对特定问题有效的解决方案。软件工程师认为编码之前应该对软件设计进行仔细的思考。他们认为黑客是那些急于求成而不采用合理的工程原则的开发人员。
普通人(包括新闻界)往往会有最反面的观念;黑客是不怀好意地试图攻击软件的人。根据这个定义,一个闯入您机器的人是黑客。不用说,许多黑客怨恨这一定义。难道仅仅因为如果修锁匠想闯入我们房间就能够闯入他就成为夜贼了吗?当然不是。但是,我们承认有些黑客是不怀好意的,他们闯入别人的机器并擦除别人的磁盘驱动器。幸运的是,这些人只代表认为自己是黑客的专家程序员中的极少数。
在八十年代中期,不喜欢这个词的反面意义的黑客创造了“骇客”这个词。骇客是为了险恶目的而攻击软件的人。遗憾的是,这个词在黑客圈以外并不流行。新闻界不使用它,并且它也并没有阻止最近一部关于不怀好意的编程者的影片以“黑客”(而不是“骇客”)命名。
那么,谁是骇客呢?我们曾暗示过有些骇客可以说是黑客。实际上,攻击软件保护机制以便可以轻易地分发盗版副本的骇客也可以称为黑客。除去这种保护机制需要相当的技巧。然而,大多数骇客不是黑客 ― 他们仅仅只是试图闯入别人的机器的孩子。
有些对安全性感兴趣的黑客可能会获取一个软件并纯粹出于好奇的目的而试图攻击它。如果他们确实攻击了它,那么他们不会做任何怀有恶意的事;相反他们会通知软件的作者,以便这一问题能够得到修复。如果他们不以合理的方式通知作者,那么就确实可以称他们为骇客。幸运的是,大多数发现严重安全性缺陷的人并不利用他们的发现来干坏事。
现在,您可能想知道骇客们都有哪些技能。攻击软件难道不需要重要的技能吗?实际上,发现一个新的弱点确实需要技巧,但仅仅攻击某一已知弱点则不需要技巧。通常,骇客的编程能力仅限于下载、构建和运行别人编写的程序。(黑客们经常称这种骇客为“脚本初级用户”。)骇客们访问黑客站点,下载能够用于闯入别人机器的程序并运行该程序。这(除了需要敲击几次回车键外)不需要太多技巧。根据我们的经验,这些人一般是正在处于反叛期的十几岁男孩。尽管这些人的技能相对要差一些,但他们仍然很危险。
您可能还想知道是谁编写了脚本初级用户用于攻击软件的程序。是黑客么?如果是的话,难道不该称这些黑客为骇客么?是的,黑客往往编写了大多数这种程序。这些黑客中的有些人甚至怀有邪恶的目的,变成了骇客。然而,许多这类程序是由坚信“完全公开”这一原则的黑客公开的。这一原则的基本思想是:如果公开了软件的所有安全性弱点,将会鼓励所有人编写更安全的软件。
在完全公开狂热者的眼里,看到别人的安全性问题的开发人员能够在他们自己的代码中潜在地避免这种问题。只简单地试图解释安全性问题的要点对于帮助开发人员常常是不够的。如果没有关于攻击者可能做的事情的工作示例,开发人员将不能全面理解问题。这是完全公开的一个好理由。完全公开也允许被告知的管理员在软件供应商开始发布补丁程序之前解决软件中的问题。
当然,也有很多反对完全公开的观点。例如,拿 Java 攻击 applet 来说,我们没发布一个攻击 applet 就成功地让供应商对问题做出了反应(并迅速修复了它们)。尽管如此,没有恶意的人们确实定期发布可工作的攻击代码,即使知道他们的代码可能被滥用。这些人通常相信,完全公开所带来的好处超过其带来的风险。这就是为什么我们不自动将这些人称为骇客的原因。
参考资料
作者简介  | |  |
Gary McGraw是 Reliable Software Technologies 负责企业技术的副总裁,该公司位于美国弗吉尼亚州杜勒斯(Dulles)。他从事咨询服务和研究工作,帮助决定技术研究和开发方向。McGraw 在 Reliable Software Technologies 从一个研究科学家做起,从事软件工程和计算机安全性方面的研究。他拥有印第安那大学认知科学和计算机科学双博士学位,弗吉尼亚大学的哲学学士学位。他为技术刊物撰写了 40 余篇经同行审查的文章,担任过主要的电子贸易供应商(包括 Visa 和 Federal Reserve)的顾问职务,并在空军研究实验室、DARPA、国家科学基金会以及 NIST 的高级技术项目赞助下担任其首席调研员。
McGraw 是移动代码安全性方面著名的权威人士,并且与普林斯顿的教授 Ed Felten 合作撰写了“Java Security: Hostile Applets, Holes, & Antidotes”(Wiley, 1996)以及“Securing Java: Getting down to business with mobile code”(Wiley, 1999)。McGraw 和 RST 创始人之一、首席科学家 Dr. Jeffrey Voas 一起编写了“Software Fault Injection: Inoculating Programs Against Errors”(Wiley, 1998)。McGraw 定期为一些受欢迎的商业出版物撰稿,而且其文章经常在全国出版的文章中所引用。
|
 | |  |
John Viega是一名高级副研究员,Software Security Group 的共同创始人,并担任 Reliable Software Technologies 的高级顾问。他是 DARPA 赞助的开发标准编程语言安全性扩展的首席调研员。John 已撰写了 30 余篇涉及软件安全性和测试领域的技术性文章。他负责在主要网络和电子商业产品中查找一些众所周知的安全性弱点,包括最近在 Netscape 安全性中的缺陷。他还是开放源码软件社区的重要成员,编写过 Mailman、GNU Mailing List Manager 以及最近发布的 ITS4(一种在 C 和 C++ 代码中查找安全性弱点的工具)。Viega 拥有弗吉尼亚大学计算机科学硕士学位。
|
对本文的评价
|