IBM®
跳转到主要内容
    中国 [选择]    使用条款
 
 
Select a scope: Search for:    
    首页    产品    服务与解决方案     支持与下载    个性化服务    
跳转到主要内容

developerWorks 中国  >  Security  >

构建安全软件: 选择技术,第二部分

操作系统和认证技术

developerWorks
文档选项

未显示需要 JavaScript 的文档选项


级别: 初级

John Viega (viega@securesw.com), 技术总监, Software Solutions
Gary McGraw (gem@cigital.com), 副总裁, Reliable Software Technologies

2002 年 2 月 01 日

根据 Building Secure Software: How to Avoid Security Problems the Right Way(Addison-Wesley,2001;授权出版)的作者 Gary McGraw 和 John Viega 所说的,在选择满足需要的安全技术之前,您做一些准备工作。本文及其上一篇文章是以第三章“Selecting technologies”为基础的,这一章研究了设计者和程序员面临的共同选择。 第一部分研究了选择编程语言和分布式对象平台的有效方法。在第二部分中,John 和 Gary 研究了选择操作系统的缺陷以及认证技术的安全性难题,包括基于主机的认证、物理标记和生物认证。

选择操作系统

现代操作系统在逻辑上可以分为系统内核和用户级代码(通常称为“用户空间”)。程序运行在用户空间中,但当需要特殊服务时,偶尔会调用内核。许多关键服务在内核空间中运行。内核通常具有某种类型的安全模式来管理对设备、文件、进程和对象的访问。这一基本机制及其接口会随操作系统的不同而表现出明显的差异。

就一般程序来说,安全性实现的细节并不重要。对于运行在用户空间中的程序,具有公共安全性限制,它们在几乎所有现代操作系统的内核中实现(以一种或另一种方式)。最重要的限制之一是 进程空间保护。在一个好的操作系统中,不允许单个进程直接访问分配给其它进程的任何内存。另外,没有进程可以直接访问当前被操作系统标记为“使用中”的内存。所有进程间通信都是这样由操作系统来回传送的。Windows NT/2000 和所有 Unix 系统提供这类保护。其它 Windows 系统,直到并包括 Windows ME(包括) 提供这种保护。结果在象 PalmOS 或者 Windows 95、98 和 ME 这样的操作系统中,经常可能通过利用单个程序中的错误来更改其它程序中的数据。因为所有程序共享单地址空间,所以这是可能的。从安全性观点看来,这是很糟糕的。

这与大多数人的认识有较大的分歧。例如,如果您在启用因特网的 Palm Pilot 上存储一个共享的秘密,那么 Palm Pilot 上的任何其它应用程序都有权访问该秘密。可以读取或更改它。从本质上说,如果您允许攻击者在这样的机器上以任何方式运行代码,则攻击者完全可以接管该机器。

作为更高级操作系统中的标准用户级保护的一部分,进程至少在没有特殊许可权的情况下不能直接访问连接到计算机上的设备,例如,任何硬盘驱动器、显卡等。而称为设备驱动程序的内核中软件的特殊部分就充当这些设备的封装器。用户级程序必须通过内核来调用这些设备驱动程序以访问硬件。通常,这种调用通过系统调用接口间接完成。例如,在 Unix 中,设备对于应用程序是作为文件系统上的文件出现的;意味着应用程序通过执行文件读写与设备通信。

起初,Windows 95/98/ME 系列操作系统并没有设计成承担现代操作系统提供的保护类型。这一产品系列源于原始的 Windows,而最终源于 DOS 的原始版本!象 DOS 这种古老的操作系统是在安全性还不是一个重要问题的时代设计的,因为当时大部分个人计算机是单用户设备,它们很少连接到任何网络。虽然已经将某些基本安全性功能添加到这一产品系列中,而操作系统设计的某些方面 不可能为不可利用的操作系统构建安全性系统。结果,与其说这些添加的功能部件是安全性机制,不如说它们是可靠性机制。使用 Windows 98 及其同类产品来保护计算机免受网络攻击还是有可能的。但是,一旦攻击者可以在这样的机器上运行代码,就可以立即获取完全控制。

在流行操作系统中,除了在最终用户调用到操作系统的接口上进行安全性检查之外,在内核中通常没有安全性检查。例如,不会做什么事来保护内核的一部分免受来自内核其它部分的攻击;它们都是相互显式可信的。这种信任通常扩展到代码,这些代码实际上不是操作系统一部分,但仍需要在内核中运行。事实上,设备驱动程序就是那样一个示例,它通常由硬件设备制造商提供。有时也使用第三方设备驱动程序。谈一下盲目地扩展信任!

内核不主张防备它们自身。即,整个操作系统会作为一个整体运行或崩溃。这样,如果在操作系统的任何部分中发现了足够严重的安全性漏洞,可以利用该漏洞的任何人都可以通过软件取得对整个机器的完全控制。构建一个具有防护来自自身攻击能力的内核很困难,并且通常这会对性能产生很大的负面影响。这就是只能偶尔为之的原因。但是,还是存在提供这类保护的操作系统,比较值得注意的操作系统之一是 Trusted Mach,它主要用于研究目的。有一些类似 Unix 的操作系统也有这种保护。对于 Windows 平台当前没有可用的这种实现。





回页首


认证技术

如果我们忽略软件错误,认证问题可能是最普遍类型的安全性问题,这意味着选择一个合理的认证技术很重要。部分原因是,即使一个设计很好的基于密码的系统也通常易于攻破,因为用户几乎总是选择使用容易被破解的密码。但不幸的是,基于密码的认证方法并不是唯一的往往不牢靠的认证类型。有许多不同类型的认证机制,而每一种类型都难以尽善尽美。

基于主机的认证

认证网络连接的一种常用方法是使用参与连接的 IP 地址。例如,这种技术广泛应用于防火墙产品。有时,人们会对一组 DNS 名称而不是 IP 地址进行认证,因而要在认证之前查询 IP 地址。这两种技术都非常容易实现,因为可以容易地获得有关如何完成的信息。类似的认证技术使用远程主机网卡的 MAC 地址,或者与该机器关联的任何类型的唯一标识(例如,如果可用,Pentium III 处理器标识)。还可以在客户机与远程主机第一次连接时在客户机上放置标识,然后在后继连接上发送这些数据。这些标识经常称为“cookie”或“票券”。

基于主机的认证通常是设置防护的快速和直接的方法,但它接近于无效。如果您依赖于 MAC 地址、处理器标识或 cookie,请记住它们本质上是由一个不可信的客户机自我报告的。一个非常老练的攻击者可以下载然后使用一种工具,通过修改经过网络的信息包使客户机报告虚假信息。如果您提供加密,则攻击者通常仍然可以通过修改您的客户机来攻击该技术。这个安全性风险可以通过使用适当的怀疑性设计(一种在很大程度上不需要信任客户机的方法)来管理。

IP 地址和 DNS 地址可能看起来更可靠,在某种程度上确实如此。假设攻击者在来自攻击机器的信息包中伪造了 IP 地址,使信息包似乎来自一个认证过的地址(这称为 IP 欺骗)。在大多数情况下,就其本身而言,这种攻击看上去不够好。这有几个原因:

首先,攻击者需要确保假的信息包确实被路由到目标机器。有工具可以使这一任务自动化。

其次,即使信息包被传递到目标机器,响应也将被路由到伪造的 IP 地址。为使伪造的地址起作用(在最常见的攻击类型中),攻击者机器需要接收那些响应。唯一真正能实现该任务的方法是将攻击者插入到被欺骗的机器和目标之间的路由上的某个地址。通常,实际发生的情况是,攻击者将非法闯入与讨论中的两个机器之一位于相同网段上的一台机器(通常是目标机器的网络)。一旦您位于相同的网段上,几乎总能看见流向目标机器的所有信息包。(主要例外情况发生在交换网段上。)

第三,欺骗攻击难以执行。您不会经常见到孩子都可以执行的脚本。除了供应商 FUD(担心、不确定性和怀疑影响产品销售)外,确实没有那么多攻击工具提供一步到位并且不需动脑的欺骗解决方案。因此,IP 欺骗的任何应用都需要大量技术高深的知识。

因此为什么还要担心 IP 欺骗呢?问题是对于一个老练的攻击者来说,如果他能非法闯入您的局域网,IP 欺骗也并非特别困难。虽然除了那些顶尖高手之外,IP 相关认证确实给攻击者设置了足够的障碍,但它也并非近乎完美。

IP 欺骗可以使 DNS 认证失效。还有其它方法使 DNS 认证失效。其中一种方法是将伪造的响应发送到 DNS 查询。类似地,可以篡改来自合法查询的实际响应。这些类型的攻击需要与 IP 欺骗同等级别的技巧。DNS 系统上的另一类攻击是“高速缓存中毒”攻击,恶意的黑客利用某些 DNS 实现中的漏洞来“劫持”域名。这类攻击可以将有效域名指向攻击者地址。在某些情况下,系统管理员的错误,会偶然执行这一攻击(例如 2000 年 Microsoft 的那个案例)。虽然并非所有 DNS 实现都会受到这类攻击,但现实世界的许多站点都是非常脆弱的。另外,启动这一攻击比启动更复杂的欺骗攻击容易得多。因此,我们建议不将 DNS 名称用于安全性,尤其因为使用 IP 数字是一种可靠得多(虽然不完美)的方法。

物理标记

认证的一种常用技术是使用物理标记,例如钥匙、信用卡或智能卡。如果没有物理标记,勿庸质疑,就不可能进行认证。这类认证被广泛采用,但存在许多相关问题。

在计算机系统环境中,物理标记的一个问题是必须为系统的每个客户机提供某类输入设备。如果您有一个应用程序要求网络上的任何人都可以使用他(或她)自己的计算机来使用您的系统,这一需求就有问题了。大多数人没有智能卡读卡机。(即使大部分美国运通蓝卡的所有者也弄不清如何安装这些免费发送的读卡机。)以信用卡为例,让用户输入卡号名义上可以解决该问题。但是,这种解决方案的问题是它无法真正保证输入卡号的人就是信用卡的持有人。在现实世界中通过电话使用信用卡的风险同样适用于网络上依赖信用卡号进行认证的系统。

物理标记的另一个问题是它们可能丢失或被盗。在任何一种情况下,对于有效用户,这都会造成极大的不便。另外,许多物理标记易于复制。信用卡和密钥是容易被克隆的很好的例子。克隆磁条卡所需的设备很便宜并且容易得到。硬件篡改证明是可能的,并且可能有效防止复制(虽然它不是没有错误),但其缺点还是实际应用太昂贵。

有时,攻击者不必盗取物理标记来复制它。一名老练的锁匠只要看一眼原物就可以复制出许多类型的钥匙。造锁是另一种选择。当您将信用卡给饭店里的服务员或者音像商店的店员时,信用卡信息会被写下来。

即使您很注意您的卡,并且只在 ATM 上使用它,也存在被攻击的可能性。某些好笑却真实的案例是攻击者在公共场所安装了假的 ATM 机。ATM 被设计成一旦人们插入他们的卡,机器就坏了的假象。但是,机器实际上完成了其邪恶勾当,窃取了复制所插入的信用卡所需的所有相关信息。其它攻击者向有效的 ATM 添加硬件,实施相同的攻击并取得了成功。

生物认证

生物认证评测一个人的身体或行为特征,并且使用这些特征作为认证的标准。在现实世界系统中使用的生物认证有许多不同的类型。可以测量的身体特征包括指纹、眼睛的特征和面部特征。

行为生物认证示例包括签名和声纹(voice print)。在现实世界中,我们通过视觉验证签名,即使如此,老练的攻击者还是可以伪造一个签名,大多数人都无法将它与原始签名区别开来。如果生理系统能以某种数字格式捕获签名的整个动作(笔速、压力等),则将更难伪造真实签名;高质量的伪造通常要花相当多时间。

生物认证是一种方便的技术,因为人们不会象忘记密码或象丢失物理标记那样真正忘记他们的认证信息。绝大多数人的眼睛都不可能被取走并存放在别处。您总是携带着必要的信息。但是,生物认证还是存在许多问题。

与使用物理标记的认证很相似,生物认证也存在限制,您需要访问物理输入设备以便能够进行认证。因此,对于许多类型的应用程序,它是不适合的。

生物认证供应商经常忽略的另一个问题是输入机制的安全性。如果攻击者可以篡改认证硬件,则可能将伪造的数字数据直接发射到设备中。当为系统的正当用户而生成的数据在导线中传输时,可以通过观测来获取这类信息。如果有可能篡改认证设备,则获取这样的数据并不会很困难。一旦危及到您生理模式的安全,则不可能创造一个新的。您只能有一双眼睛!由真人警卫作为重要生理输入设备的安全性的补充,通常是个好主意,这会大大降低物理篡改的风险。

行为生理可能变化无常。最好的示例是使用声纹来认证。如果某人生病了,会怎么样呢?如果系统不足以处理这种情况,则因人们感冒而鼻塞时,就可能被错误地拒绝认证。但是,如果系统能接受一个听起来象“病人”一样类似的声音,则会给那些适当模仿系统有效用户的声音的攻击者钻空子。

另一个问题是生理标识通常是唯一的,但并不保密。如果系统认证仅基于指纹,则攻击者可以在仔细搜集了系统已认证用户的指纹后适当地构造一只假手。这种攻击只需要跟某人进入酒吧然后获取他们的啤酒杯就行了。另外,请注意这种系统怂恿人们盗取您身体的一部分,这可从来不是一件好事。为帮助防止这类攻击,更好的生理系统将考虑“生命状态”度量(如体温和血流)以尝试确保指纹来自实际上触摸该设备的活人。

但是,如果认证设备的物理安全性有问题,那么当某人指纹的数字表示被盗,会怎样呢?是的,我们可以使指纹无效。但是,用户只有 10 个手指。攻击者盗取了所有 10 个指纹时会怎样呢?在密码系统中,如果您的密码被泄露,那么可以更改它。但您不可能轻易地更改您的指纹。

另一个要考虑的问题是许多人相信搜集生理信息是侵犯隐私权。DNA 可能是人类的最终认证机制(至少没有两个人的完全相同),但是 DNA 编码了足够的信息,保险公司可以根据这些信息以某种疾病为理由而拒绝向您发放保险,而您并未患这种病,只是因为您的基因显示您易患该疾病。

密码认证

密码认证使用数学和数字秘密来认证用户。这种类型的认证可以视为对物理标记的数字模拟。虽然对输入设备的物理访问已不再是问题,而应用时还会发生同类问题。最重要的是,密码认证信息可能被盗。遗憾的是,盗取数字数据常常很容易。

深度防御和认证

我们相信用于认证用户的唯一可行的策略是以深度原则应用防御,混合多种认证技术。就 ATM 的提款过程而言,信用卡公司通过混合物理标记和基于密码的方案来很好地完成任务。仅依赖物理标记会使坏孩子很容易地拿光其父母保险箱中的钱。同样,只依靠简单的四位数字 PIN 号码,而不依靠物理标记是绝对可怕的。攻击者可以随意尝试侵入您的帐户,并且能很快得手,特别是在有帮助的情况下(只有 10,000 种可能的 PIN …… 并不是太大的一个数)。但是,将这两种技术结合时就提供了一个非常难以跨越的安全性门槛。攻击者需要盗取您的信用卡并且尝试 5,000 个 PIN 号码。希望受害者能在攻击者得手之前报告信用卡丢失。

深度防御也可以用于解决保护密码认证信息(通常称为密钥)以防止别人入侵您的机器的问题。可以通过将一个密码(希望不太弱)用作加密密钥来对密钥加密。每次要使用密码认证时,必须给出一个密码以解码密钥。用这种方法,即使某人偷了密钥,他们仍然需要密码。

在服务器环境(主机到主机认证而不是用户到主机认证)中使用加密密钥时,这种解决方案仍然存在问题。这是因为服务器需要能够以自动方式使用密钥,而不需要用户介入。一种选择是不对密钥加密。如果加密了密钥,您可以在磁盘的某处保存密码,然后在需要的时候读取它。但是,如果这样做,您只是将问题移到了磁盘的另一部分。第三种选择将需要在程序启动时进行一次手工介入,然后仅在内存中保存解密的密钥,而不是在磁盘上(理论上,如果密钥只存在于内存中,攻击者想要偷取它通常难得多)。这种解决方案意味着服务器不能在无人照管的情况下重新引导。旁边需要一个人来为需要加密密钥的任何软件提供密码。





回页首


结束语

在这些文章中,我们强调了比较和对比技术的重要性并提出了最符合系统安全性要求的技术。我们通过直接讨论围绕常用技术决定的某些风险、缺陷和设计技术来做到这一点。很好地使用这些材料的秘诀是在选择对于安全性关键的技术时保持对安全性的认知。在世界上最脆弱的平台上使用最好的加密也不会给您带来多少安全性。我们已经讨论了许多技术人员和安全性从业人员必定会采用的最常用选择,以及它们如何影响安全性。



参考资料

其它安全性参考资料:



作者简介

John Viega 是 Secure Software Solutions 的技术总监。他是 Building Secure Software(Addison-Wesley,2001)和 Network Security and Cryptography with OpenSSL(O'Reilly,2002)的合著者。John 已经撰写了 50 多篇出版物,主要关于软件安全性领域。他还因为安全性工具以及编写 Mailman(GNU 邮递列表管理器)而闻名。可以通过 viega@securesw.com与他联系。


Gary McGraw 博士是 Cigital的技术总监。McGraw 博士是软件安全性领域著名的权威人士,并且合著了四本流行的书籍,他与普林斯顿大学的 Ed Felten 教授合著了: Java Security: Hostile Applets, Holes, & Antidotes(Wiley,1996)和 Securing Java: Getting Down to Business with Mobile Code(Wiley,1999);与 Cigital 的合伙创始人和首席科学家 Jeffrey Voas 博士合著了 Software Fault Injection: Inoculating Programs Against Errors(Wiley,1998);与 John Viega 合著了 Building Secure Software(Addison-Wesley,2001)。McGraw 博士定期为流行贸易刊物供稿,并经常在全国性的新闻文章中被援引。可以通过 gem@cigital.com 与他联系。




对本文的评价

太差! (1)
需提高 (2)
一般;尚可 (3)
好文章 (4)
真棒!(5)

建议?







回页首


IBM 公司保留在 developerWorks 网站上发表的内容的著作权。未经IBM公司或原始作者的书面明确许可,请勿转载。如果您希望转载,请通过 提交转载请求表单 联系我们的编辑团队。
    关于 IBM 隐私条约 联系 IBM 使用条款