安全编程 开发安全的程序 正确的理念是成功的一半(1)
- UID
- 1066743
|
安全编程 开发安全的程序 正确的理念是成功的一半(1)
欢迎来到不太友善的世界案例 #1味道闻起来很糟糕。两个多月以来,数十万加仑的污水流到了澳大利亚的公园、河流以及一家旅馆的地面上,而无人知晓其原因。水生动植物不断地死亡,而且有一条小河中的水已经变黑了。2000 年 4 月 23 日,当警方逮捕了一名男子时才解开了这个谜团,这名男子一直在使用计算机和无线电设备对管理污水和饮用水的机器进行完全控制。他的动机是什么呢?对其审讯的口供表明他正试图获得一份获利丰厚的咨询合同以解决他所造成的问题。事实原本还要糟糕得多。
案例 #2有一个小偷(只知道他叫“Maxus”)从在线音乐公司 CD Universe 偷了 35 万个信用卡号,然后勒索 10 万美元赎金。当 CD Universe 拒绝支付赎金时,Maxus 就公开张贴了这些信用卡号 - 这损害了 CD Universe 的顾客并使这些顾客有合理的理由转而光顾其它商店。
案例 #3CIA 最近了解到奥萨马·本·拉登的基地恐怖分子组织对网络恐怖活动有着“非常浓厚的兴趣”,这是人们先前所不相信的。链接到基地组织的计算机都可以获得各种计算机“破解”工具,旨在引起灾难性的破坏。
它们正在攻击您的程序 - 您准备好了吗?计算机攻击已成为一个非常严重的问题。1997 年,CERT/CC 报告发生了 2134 起计算机安全性事件,并报告了 311 个截然不同的安全性漏洞;到 2002 年,所报告的计算机安全性事件已上升至 82094 起,而安全性漏洞则上升到 4129 个。计算机安全性协会(Computer Security Institute,CSI)和旧金山联邦调查局(Federal Bureau of Investigation,FBI)计算机入侵小组于 2003 年调查了 503 家大型公司和政府机构,发现其中有 92% 的被调查者都报告受到过攻击。这些被调查者中,有 78% 确认他们的因特网连接经常受到攻击,并有 36% 确认他们的内部系统经常受到攻击。有 75% 的被调查者承认他们受到了经济损失,尽管只有 47% 的被调查者可以确定他们损失的具体数目;但这些可以确定具体数目的组织的损失超过了 2 亿美元。
攻击持续升温的原因有许多。计算机在不断地联网,这使攻击者能比较容易地攻击世界范围内任何联网的计算机,而不会有什么风险。计算机已经非常普及;它们现在控制着比较多的具有价值的东西(这使它们值得进行攻击)。过去,顾客十分愿意购买不安全的软件,所以根本没人愿意出钱开发安全的软件。
电子世界现在是一个危险程度更加高的地方。今天,我们要求几乎所有的应用程序都是安全的应用程序。例如,实际上我们要求每个 Web 应用程序都是安全的应用程序,因为不可信的用户可能向它们发送数据。甚至那些显示或编辑本地文件的应用程序(如字处理器)都必须受到保护,因为有时用户将显示或编辑以电子邮件方式发送给他们的数据。
如果您在开发软件,那么您就是身处战场,需要知道如何保护您自己。遗憾的是,大多数软件开发人员从未知晓如何编写安全的应用程序。
本专栏将帮助您了解如何编写安全的应用程序。学校里很少会教这类信息,其它地方也不太会讲授这一主题。如果您学习了本专栏,那么您将能够保护您的程序,避免当前所用的最常见的攻击。尽管我们主要讨论 Linux 操作系统(也称为 GNU/Linux),但是几乎所有的内容都适用于任何类 UNIX 系统,而且其中的许多内容也适用于其它操作系统(象 Microsoft Windows)。
对于这第一篇文章,我将先介绍一些基础知识:安全性术语、改变您的理念、自由/开放源码软件(Free-Libre/open source software,FLOSS)的影响以及确定安全性需求。
术语:这些词表示什么意思?每一领域都有其自己的术语,而计算机安全性领域中的术语则有些杂乱无章,其中充斥着首字母缩写词和易混淆的词。以下几个定义应该有所帮助:
- 攻击者(attacker)(也称为 非法闯入者)是这样的人:他试图使程序或计算机做某些事情,而这些事情是明确禁止做的,如为了获得或更改私有数据而闯入不属于他们的计算机。
- 黑客(hacker)是计算机专家或计算机狂热者。并非所有攻击者都是黑客 - 有些攻击者根本不了解计算机。同样,并非所有黑客都是攻击者 - 许多黑客编写保护您的程序!媒体公司只关注那些攻击计算机系统的黑客,而往往忽视那些计算机的保卫者,所以有些人就使用术语“黑客”表示只进行攻击的黑客。但是,如果您认为所有的黑客都是攻击者,那么您在理解许多安全性文章时会碰到很多麻烦,所以我将使用这里指出的定义。
- 缺陷(flaw)是程序中的错误,或是程序的安装方法中的错误。并不是所有的缺陷都与安全性有关。
- 安全性漏洞(vulnerability)就是一个缺陷,它使程序有可能无法满足其安全性需求。
- 漏洞利用(exloit)是一个揭示或利用安全性漏洞的程序。
改变您的理念在学习如何编写安全的软件时遇到的最大挑战是改变您对软件开发的观点。以下几点应该会有所帮助:
- 偏执狂是一种优点。在自己进行调查研究之前不要相信任何事情。不要想当然地以为您的输入遵守您所依赖的规则;去检验它。不要忽略来自库的错误报告;通常,在遇到意想不到的错误时,您需要终止正在进行的处理。不要以为您的程序没有错误;限制您的程序能够完成的事情,这样错误成为安全性缺陷的可能性就会比较少。
- 一般的测试通常无法发现安全性缺陷。大多数测试方法都假定用户设法使用程序来帮助他们完成一些工作。因此,测试假定用户将以某种“随机”或“有用”的方式工作,检查程序在“一般”情况下或者在某些最大值下如何工作。与此相反,安全性缺陷通常只出现在使用极其古怪的值的情况时,传统的测试完全不会检查这样的值。有些开发人员会编写非常糟糕的代码,然后希望通过测试它来进行纠正。这种方法根本不会产生安全的代码,因为您无法创建足够多的测试来涵盖攻击者能做到的所有稀奇古怪的事情。
- 小玩意(象防火墙)和技术(象加密)是不够的。
- 从过去的失败确定和了解漏洞。事实证明几乎所有软件的安全性漏洞都是由相对较小的一组常见错误引起的。如果您了解了那些是什么错误 - 以及如何避免这样的错误 - 您的软件就会安全得多。事实上,本专栏将集中讨论如何避免以前出现的常见错误,这样您就不会犯同样的错误。
|
|
|
|
|
|