第二部分 实践第六章 Unix的安全
现在,我们已经考察了各种独立的安全机制。在真正的实现中,它们是互相依赖的。例如,访问控制和授权必须协同工作,缺了任何一方,另一方都不能有效地工作。所以,我们现在转入对操作系统提供的安全机制的考察。Unix是我们的第一个例子,它让我们有机会在一个相当具体的层次上考察安全机制。
目标:
理解一个典型的操作系统提供的安全特性;
介绍Unix安全基础;
明白一般的安全原则在一个实际系统中是如何实现的;
懂得在持续变化的环境中进行安全管理的任务。
概述操作系统通过组合诸如识别、验证、访问控制和审计等模块实现统一的安全控制。一旦我们决定提供灵活且特性多样的安全策略,安全机制就会越来越复杂。在那些环境下,对内核来说,可信计算基础础 (TCB)会显得太大。现在我们在层次模型(图6.1)中,来考察操作系统这个层次所提供的安全控制。
当评价一个操作系统的安全时,下列问题可以指导分析过程:
实现了哪些安全特征?
这些安全特征是怎么管理的?
这些安全特征的有效性如何保证?

在大部分操作系统中,有一种一般模式指导安全控制的组织。用户(访问主体)的信息存储在用户帐号中。任何授予用户的权限(特权,privilege)都可以存储在这个帐号中。识别(身份识别,identification)和验证(身份验证,authentication)检查(鉴定)用户的身份,使系统把用户的权限和用户所启动的进程联系起来。资源(对象(客体,object))的许可由系统管理员或者资源的属主设置。在决定是否允许或拒绝访问请求时,操作系统可以参考用户标识(身份,identity)、用户权限和对象的许可(权限,permission)情况。
安全机制不仅负责防止非授权的行为,还负责检测这些行为。我们必须面对攻击者可能会绕过保护机制这样的事实。必须采取措施记录用户的行为以便考察安全漏洞(破坏,breaches)或者追踪可能的攻击。所以,操作系统必须保存并保护好安全相关事件的审计日志(审计索引(踪迹,trail))。
最后,如果运用不得法,再好的操作系统的安全特性也是没有价值的。一个系统必须开始于一个安全的状态,所以,操作系统的安装和配置是很重要的问题。不当的缺省配置可能成为主要的安全弱点。操作系统是非常复杂且不断演变的软件系统。所以,总是有可能在新的发行版本中检测到或者引入新的漏洞。警觉的系统管理员必须时常查阅CERT(Computer Emergency Response Teams,计算机紧急事件响应小组),获得安全忠告,以便和现时的安全发展同步。
我们已经勾画出一个构建系统安全的框架:
登录和用户帐户访问控制审计配置和管理本章考察Unix系统的安全特性。由于历史原因,Unix显得不够可靠和安全(参见[102]),不过它确实提供了一套安全措施,如果使用得当,还是相当有效的。Unix的版本很多,这些版本之间在技术和安全控制的执行上存在差别。不过,现在正在尝试对Unix安全进行标准化。POSIX 1003系列的标准定义了Unix系统的通用接口,其中的POSIX 1003.6 就是涉及安全机制的。本章并不是对Unix安全的完整的介绍,也不是指导如何建立安全的Unix系统。我们的介绍限于对Unix安全基础的考察,同时突出可以阐明一般原则的安全特性。我们选择的角度较为接近人机标尺上的机器端(图6.2)。
特殊的 普通的
复合的 简单的
集中于用户 集中于数据
 
用户端 机器端
图6.2 人机标尺上的Unix安全
Unix安全体系结构大多数安全操作系统的安全体系结构解释了如何实施安全措施和安全相关数据的保存,而Unix却有一个版本分分合合的历史。公正地反映了客观情况的是,安全特性并不作为一个原始设计目标,而是在有需求的时候才被加入系统。随着Unix的发展,新的安全控制被加入,现存的控制机制得到加强。设计者在决定如何实现新的特性时,考虑得最多的还是尽量避免触动Unix现有的结构。
登录和用户帐号
Unix通过用户名识别用户,通过口令进行验证。许多Unix系统中的口令限制在八个字符内。口令由crypt(3)算法加密,以全零数据块作为初始值,口令作为密钥,用稍做修改的DES算法重复计算25次,得到的密文存放在/etc/passwd文件中。文件中的条目格式如下:
user name,encrypted password,user ID,group ID,ID string,home directory,login shell
字段ID string是用户的全名。user ID和group ID 会在稍后介绍。最后两个字段指明了用户的主目录和成功登录后可用的shell(命令行解释器)。系统的行为在/etc/profile里指明。关于用户特定配置的进一步说明在用户主目录的.profile文件中定义。用户最后一次登录记录放在/usr/adm/lastlog中,可以通过finger命令显示。用cat /etc/passwd或者less / etc/passwd显示口令文件时会有如下输出:
dieter:RT.QsZEEsxT92:10026:Dieter Gollman:/home/staff/dieter:/usr/local/bin/bash
口令字段为空表示用户不需要在登录时提供口令。口令字段以一个星号开头,表示用户无法登录,因为对明文口令单向加密不可能出现这样的值,这是禁止一个用户帐号的常用方法。
用户可以通过passwd(1)改变口令。这要求你首先提供旧口令,这是为了防止有人在你暂时离开机器的时候(这可是个不好的习惯)改变你的口令。因为输入口令时字符不回显,所以你必须两次输入新口令来保证你想输入的和你实际输入的保持一致。口令改变后,你可以重新登录或者用su(1)(set user)命令确认变更。
有些面向安全的Unix版本提供进一步的措施来保证口令安全。口令可能被“盐化”(be salted)并保存在一个影子口令文件中,比如/.secure/etc/passwd。避免使用脆弱口令是选择口令时的好习惯,也可以设置口令的无效日期以及控制旧口令的重用。以超级用户Root身份登录可被限制在/etc/ttys中指定的终端上进行。第三方Unix安全产品提供类似的安全服务。
6.3.1 用户和超级用户
Unix用一个用户名代表用户,用户名最多有8个字符,内部表示为一个16位的数字,即用户ID(UID)。UID和用户名通过/etc/passwd映射。Unix不区分拥有相同UID的用户。一些UID有特殊的意义,如图6.3所示。
-2
nobody
0
root
1
daemon
2
uucp
3
bin
4
games
9
audit
图6.3 特殊的用户ID
每个Unix系统中都有一个特权用户,这个超级用户的UID为0,用户名通常为root。这个根帐号被操作系统用来执行基本的任务,比如登录、记录审计信息或者访问I/O设备等。几乎所有的安全检查都对超级用户关闭,在执行某些系统管理任务时根帐号也是必要的。系统管理员不应该把根帐号当成他的个人帐号。需要使用超级用户时可以通过不指定用户名的/etc/su命令变普通帐号为根帐号。
超级用户几乎可以做任何事情。例如超级用户可以变为任何别的用户,可以改变系统时钟,可以绕过施加于他的某些限制。例如,以只读模式挂上的文件系统本来是不能写的,超级用户却可以通过先卸下该文件系统再以可写模式重新挂上它来绕过写的限制。不过超级用户不能解开口令,因为crypt是单向函数。
超级用户如此强大,因此它也成为Unix的一个主要弱点。处于超级用户状态的攻击者实际上接管了整个系统,必须采取每一个可能的防范措施来控制普通用户获得超级用户状态。文件/etc/passwd和/etc/group必须有写保护。有编辑/etc/passwd文件能力的攻击者通过把UID变为0就可以成为超级用户。使用/bin/su将普通用户改变为超级用户则避免了让操作系统调用其他什么人的目录中的su。把所有su的调用试图连同调用者都记载在审计日志中。分散系统管理者的工作职责,例如让uucp或者daemon处理网络事务。特殊帐号中的一个出现问题不会造成全盘的损害。
6.3.2 属组用户隶属于一个或多个组。以组的方式来组织用户提供了访问控制决策的方便的基础。例如,把可以访问e-mail的所有用户放进mail组,把可以进行所有操作的用户放进operator组。每个用户都属于一个基本组(primary group)。primary组的标识符ID(GID)存储在/etc/passwd中。文件/etc/group包括了属组的列表。其中的表项格式如下:
group name,group password,GID,list of users
例如,表项
infosecwww,*,209,chez,af
告诉我们infosecwww组没有口令,GID为209,并且有两个成员chez 和 af。图6.4列出了有特殊意义的组ID。
在System V Unix上,一个用户在一个时刻只能属于一个组。可以用newgrp命令修改当前属组。用户可自由改到他已为成员的组。否则,当用户试图改到一个他不是成员的属组时,newgrp会要求用户提供一个口令,如果组口令正确,用户就会被收纳成为此组的暂时成员。在Berkley Unix中,用户可以同时属于多个组,所以newgrp命令是不必要的。
0
system/wheel
1
daemon
2
uucp
3
men
4
bin
7
terminal
图6.4 有特殊意义的组ID
6.3.3 设置UID和GID
让我们回到我们最感兴趣的一个话题:调用控制。在执行某些系统调用时Unix要求超级用户特权,但又不能给普通用户以超级用户状态。所以必须找到满足这两个要求的方法。Unix采用的方法是提供设置用户标识符SUID和设置组标识符SGID程序。这样的程序以属主或者属组的有效UID和有效GID运行,拥有暂时的或者受限的访问权限,这些访问权限通常情况下是不赋予普通用户的。经常有这样的情况,如果root是SUID程序的属主,这时运行这个程序的用户就会获得执行中的超级用户状态。重要的SUID程序有:
/bin/passwd 改变口令
/bin/login 登录程序
/bin/at 提交批处理作业
/bin/su 改变UID程序在这里我们照例要提出警告,既然用户拥有了运行时的SUID程序属主的特权,我们只应该让这个程序做其属主打算做的事情。这一点对于属主是root的SUID程序尤其重要。一个可以改变SUID程序执行行为的攻击者,比如可以中断程序执行的攻击者,不仅可以在攻击时获得超级用户权限,还可以改变系统使其在别的情况下同样具有这样的权限。这方面的危险发生在有用户交互的SUID程序中。一个特别的漏洞是”shell escapes”,它使用户能以超级用户权限运行shell命令。除非实在必要,程序不应该被设置SUID。系统管理员应该注意监视SUID程序的完整性。参考文献55给出了两个SUID程序被用作成功攻击的研究实例。
6.4 访问控制访问控制是基于用户属性和资源(亦即文件、I/O设备、内存等)属性之上的。标准的Unix系统以属主(owner)、属组(group)、其他人(world)三个粒度进行控制。超级用户不受这种访问控制的限制。Unix以统一的方式处理所有的资源,它并不区分文件和设备。
6.4.1 Unix文件结构
Unix以树型结构组织文件系统,这个系统包括文件和目录。目录里的每个文件条目是一个指针,指向一个叫做i-结点(inode)的数据结构。图6.5给出了i-结点中与访问控制有关的字段。每个目录有一个指向自身的文件“.”,还有一个指向它的父目录的文件“..”。每个文件有一个属主,通常这个属主是建立文件的用户。每个文件都属于某个组。新建文件有可能属于它的建立者的属组,也有可能属于它的目录的属组,取决于不同的Unix版本。
在讨论i-结点中的字段之前,我们先用ls –l来考察一个目录,结果如下:
-rw-r--r-- 1 dieter staff 1617 Oct 28 11:01 adcryp.tex
drwx------ 2 dieter staff 512 Oct 25 17:44 ads/
分析一下得到的信息:
第一个字符给出了文件的类型。“-”表示是一个常规文件,“d”表示是一个目录,“b”代表一个块设备文件,而“c”代表一个字符设备文件;
接下来的九个字符给出了文件的许可位,下面还要讨论;
后面的数字字段是链接计数器,它给出了链接到这个文件上的链接(指针)数目;
接下来的两个字段是文件属主和属组的名字;
然后是文件的字节大小;
接下来的时间和日期是mtime,即最后修改的时间。ls –lu显示atime,即最后访问的时间,ls –lc显示itime,即最后对i-结点进行修改的时间;
最后一个字段是文件的名字。ads后面的”/”表示是一个目录。
mode
文件类型和访问权限
uid
文件属主
gid
文件属组
atime
文件的最后访问时间
mtime
文件的最后修改时间
itime
i-结点的最后修改时间
block count
文件大小
物理位置
图6.5 i-结点中的精选字段文件访问许可位分为三组,分别定义了属主、属组和其他人的读、写和执行的权限。“-”表示权限没有被授予。所以 rw-r--r--表示属主有读写权,属组和其他人有读权。rwx------表示属主有读写和执行的权力,属组和其他人没有任何权利。
用ls –l 显示一个SUID程序的时候,属主的执行位用s,而不是用x表示:
-rws--x--3 root bin 16384 Nov 16 1996 passwd*
用ls –l 显示一个SGID程序的时候,属组的执行位用s,而不是用x表示:
许可位以下面的次序检验:
如果你的uid指出你是文件的属主,那么属主许可位决定了你可否访问;
如果你的uid表明你不是文件的属主,但是你的gid指出你的属组拥有这个文件,那么属组许可位决定了你可否访问;
如果你既不是文件的属主,也不是拥有文件的属组的成员,那么其他人许可位决定了你可否访问。
所以,设置许可位让文件的属主比其他用户拥有更少的权力是可能的。也许这样不太合乎常理,但是却是相当有价值的想法。不管是哪一种访问控制机制,你必须精确地知道不同的访问标准的校验次序。
6.4.2 改变许可文件的许可位可以用chmod命令修改,这个修改的执行者只能是文件的属主或者超级用户。这个命令有如下的格式:
chmod [-fR] absolute file 指定所有许可位的值
chmod [-fR] [who] +permission file 添加许可
chmod [-fR] [who] - permission file 删除许可
chmod [-fR] [who] = permission file 重置许可
在绝对模式中,文件许可由一个八进制数直接指定。这些数字的意义如图6.6所示。例如,许可rw-r--r--用chmod 644设置。对所有人授予所有权力用chmod 777 设置。
4000
授予用户ID执行权(见下文)
2000
授予组ID执行权(见下文)
1000
设置粘住位(见下文)
0400
属主有读权
0200
属主有写权
0100
属主有执行权
0040
属组有读权
0020
属组有写权
0010
属组有执行权
0004
其他人有读权
0002
其他人有写权
0001
其他人有执行权
图6.6 访问许可的八进制表示
在符号模式下,当前文件许可位被修改。参数who可以用以下值带入:
u 改变属主许可
g 改变属组许可
o 改变其他人许可
a 改变所有人许可
permission参数可以用以下值带入:
r 读许可
w 写许可
x 文件的执行许可,目录的搜索许可
X 只有在file是一个目录或者至少一个执行位设置的情况下的执行许可
s SUID或者SGID许可
t 保存正文段许可(设置粘住位)
-f 选项抑止错误消息,-R选项在目前目录的所有的子目录中递归地施加这个命令。一个程序的SUID许可可以这样设置:
chmod 4555 file 设置标志(suidSet suid flag)
chmod u+s file 设置suid标志
chmod 555 file 清除suid标志
chmod u-s file 清除suid标志
GUID许可不使用u,它使用g选项。
chown命令改变文件的属主,chgrp改变文件的属组。chown是不受欢迎的SUID程序的潜在来源。一个用户可以建立一个SUID程序,然后把它的属主变为root。为了避免这样的攻击,有些版本的Unix只允许超级用户运行chown。别的版本允许用户使用chown于他们自己的文件上,不过这时就关闭了SUID和SGID位。类似的考虑适用于chgrp。
6.4.3 缺省许可位
Unix工具(实用程序,utilities),比如编辑器或者编译器,在新建文件的时候,通常使用666作为缺省许可位,而在新建程序的时候,通常使用777作为缺省许可位。这些许可位可以用umask调整。umask是一个三个数字的八进制数,它指定了应该被保留(抑制,be withheld)的权限。所以,umask 777拒绝所有访问,umask 000就不作任何限制。敏感的缺省设置有:
022 属主的所有许可,属组和其他人的读和执行许可
037 属主的所有许可,属组的读许可,其他人没有许可
077 属主的所有许可,属组和其他人没有许可实际的缺省许可位用umask屏蔽Unix工具的缺省许可位而来。缺省的许可位和umask的位的取反值的逻辑与被计算。比如,缺省的许可位666和umask 077
0666
AND NOT (0077)
0600
这样,文件属主有读写权而其他权力被拒绝。umask可以被下面的命令改变;
umask [-S] [mask]
这里,-S显示是符号模式。如果没有模式给出,就显示当前umask。
/etc/profile里的umask定义了一个系统范围的缺省设置。这些缺省设置可以被用户重载,具体方式是设置用户的主目录里的umask,根据Unix的具体安装,可以在/etc/profile,profile,login或者.cshrc里。和VMS一样,不可能为目录定义单独的缺省许可位,也不可能让它们从目录里继承许可。
用cp新建文件时,文件的许可位从umask而来。用mv通过重命名的方式新建文件时,已有的许可位被沿用。
6.4.4 目录的许可每一个用户都有一个主目录。可以用mkdir建立子目录。在一个目录里存放文件和目录,用户必须拥有正确的文件许可位。
读许可允许查找哪些文件在目录中,比如用ls或者别的类似的命令;
写许可允许从目录中添加或者删除文件;
执行许可在使目录为当前目录以打开文件的过程中是必要的。你可以打开你知道的在某个目录中存在的文件但是你不能用ls查看目录内容。
所以,为了访问你自己的文件,你需要在目录中有执行许可。为了防止别的用户读你的文件,你既可以设置相应文件的访问许可位,也可以阻止对目录的访问。为了删除文件,你需要对目录的写和执行许可。并不需要有关文件的任何许可,它甚至可能属于别的用户。这个特性要提醒系统管理员:
如果你试图安装一个永久的文件到某一个用户的目录里,那么麻烦就真的来了。
从早期Unix而来的一个遗留物是粘住位。它使一个程序的代码段在初次使用后还留在虚存中。这样系统就避免了把经常访问的程序的代码在内存和外部页面间倒来倒去。你可以指定这个许可位,不过在0SF/1中,它并无效果。用ls –l 查看一个带有粘住位的文件时,t出现在x本来应该出现的地方。如果一个目录被设置了粘住位,那么它的删除就是受限的。一个设置了粘住位的目录中的文件只有在用户拥有目录的写许可并且用户是文件和目录的属主(或者用户是超级用户)的情况下才能被删除。
6.5 一般安全原则的实例
在这部分,我们以Unix为实例,来看看一些我们的一般安全原则是怎么实现的。
6.5.1 受控调用一个会被多用户访问的敏感资源,比如一个口令或者配置文件,可以用组合了属主、许可位和SUID程序的受控调用方案(scheme)加以保护:
建立一个拥有资源和全部需要访问此资源的程序的新的UID;
只给这个资源属主许可;
把需要访问资源的程序设为SUID程序。
小心保护过分。如果你拒绝了用户对他们需要以之完成工作的文件的直接访问,你必须以SUID程序的形式提供间接访问。有问题的SUID程序可能比精心设置的许可位给予用户更多的权力。在资源和SUID程序的属主是像root一样的特权用户时尤其是这样。
在这个例子里,我们还有一个在安全系统设计里经常出现的实例。一个抽象属性在系统里用数据结构描述,这个数据结构又被另一个安全机制以不同的目的重用。UID被用来代表系统中真实的用户。现在,UID被用来进行一种新的访问控制,这里它并不代表任何真实用户。6.6.1节会阐述因这样的设计而带来的问题。
6.5.2 删除文件这里有两个内容:逻辑的和物理的内存结构。特别的,如果我们从文件系统删除了一个文件会怎么样?这个文件还会以某种形式存在吗?
Unix有两种拷贝文件的方法。cp创建了一个一模一样但是独立的副本。除了cp,还有一些命令(link,ln),它们只是创建了一个有指针指向原来文件的文件名,同时增加了原来文件的链接数。新旧文件共享文件内容。如果原来的文件用rm或者rmdir删除了,那么它就从它的父目录中消失了,但是它的内容和它的拷贝依然存在。这样,用户可能认为他们已经删除了文件,但是实际上它仍然在另外的目录中存在,而且用户仍然拥有它。如果你想彻底删除一个文件,超级用户必须运行ncheck列出文件的所有链接并且删除这些链接。如果一个文件在被别的进程打开后由属主删除,这个文件在进程关闭它之前都还一直存在。
一旦一个文件被删除,分配给它的内存空间就被释放了。不过,直到这些内存被实际地再使用,它们仍然保留着文件的内容。为了避免这样的内存残余,在删除文件前你应该用全0或者别的合适于存储媒介的模式抹去它的内容。
6.5.3 设备的保护下一个话题仍然和逻辑的和物理的内存结构的区别有关。Unix把设备像文件一样对待。这样,对内存或者对打印机的访问都可以像访问文件一样设置许可位。设备文件用mknod命令建立,它只能由root执行。通常可以在/dev里发现的一个关于设备信息的小例子如下:
/dev/console 控制台终端
/dev/mem 主存的映像设备(物理存储器的映像)
/dev/kmem 内核存储的映像设备(虚拟存储器的映像)
/dev/tty 终端如果攻击者能够访问存放文件和目录的内存设备,那么他们就能绕过设置在其上的安全控制。如果内存设备对其他人(world)的读写许可位被打开,攻击者就能浏览内存或者修改数据,而不受存储在此内存中的文件上设定的许可条件约束。因此几乎所有的设备都应该禁止其他人的读写。
类似ps的命令显示内存的使用情况,因此需要对内存设备的访问设置许可。把ps定义为SUID将允许root的程序获得必要的许可,不过,对ps的损害会让攻击者得到root权限(特权,privilege)。更好的解决办法是让ps成为SGID程序,让mem组拥有内存设备。
tty终端设备是另外一个有趣的例子。用户登录的时候,一个终端文件就被分配给这个用户,用户就成了本次会话中这个文件的属主。(终端文件闲置的时候,它的属主是root)。让这个文件对别人可读写是很方便的,因为这样一来,用户就可以接收来自其他用户的消息。不过,这样也带来了漏洞。别人现在可以监视进出这个终端的流量,这里面可能包含用户的口令。他们可以向这个用户终端传送命令,比如,重新设定一个功能键,再让不知情的用户执行这些命令。在一些系统中,智能终端会自动执行某些命令,这就给攻击者用别的用户的权限提交命令提供了机会。
6.5.4 挂接文件系统当你拥有不同的安全区域并且要从别的区域往你的系统里引进对象的时候,你必须重新定义这些对象的访问控制属性。
Unix文件系统把存在于不同物理设备上的文件系统链接在同一个根(用”/”表示)下面。这是用mount命令实现的。在网络环境中,远程文件系统可以从别的网络结点中挂接。同样,允许用户通过他们自己的软盘驱动器挂接文件系统。
如果你是安全专家的话,警钟就要开始长鸣了。挂接上的文件系统可能包括各种不受欢迎的文件,比如,隐藏在攻击者目录中的指向root的SUID程序。一旦文件系统被挂接,攻击者就可以通过运行此类程序获得超级用户状态。允许直接访问内存的设备文件也很危险,在这里许可已被设置从而使攻击者可以访问这些文件。所以,命令
mount [-r] [-o options] device directory
里的-r标志就表示只读挂接。options里包括:
nosuid 在挂接的文件系统中关闭SUID和SGID位
noexec 挂接的文件系统中的二进制文件不能被执行
nodev 在挂接的文件系统中不能访问块或者字符特殊设备当然,不同版本的Unix实现了mount的不同的选项。
6.5.5 改变文件系统的根可以通过把对象放进一个未授权用户不能访问的地方来实现访问控制。在Unix中,改变根(root)命令chroot限制了未授权用户可访问的文件系统。这个命令只能被root执行。
chroot directory command
执行时,根目录从”/”变成了”directory”。只有新根目录下的文件是可访问的。如果你采用这种方案,你必须确定用户程序可以找到所有它们所需的系统文件。这些文件的预期所在为像/bin,/dev,/etc,/tmp或者/usr这样的目录。必须在新的根目录下建立有着相同名字的新目录,然后拷贝或者链接到原来目录里的文件。
6.5.6 搜索路径我们最后要讨论的是从“错误”位置启动的程序。Unix用户通过shell(一个命令行解释器)和操作系统交互。为了方便的缘故,用户在运行一个程序时,可以只敲入它的名字而不说明它在文件系统里的全路径。命令行解释器shell会依照在用户主目录的.profile文件中赋值的PATH环境变量指定的搜索路径查找程序。(用ls –a来查看你的主目录里的所有文件,用more,profile来看这个文件)。当找到一个包含所给名字的程序的目录时,搜索结束,并且执行那个程序。一个典型的搜索路径就像这样:
PATH=.:$HOME/bin:/usr/ucb:/usr/bin:/usr/local:/usr/new:/usr/hosts 注:冒号:
在这里例子里,搜索路径里的目录用“:”分隔。第一个条目“.”是当前目录。于是就有可能以这样的方式插入特洛伊木马:给木马取一个和现有程序一样的名字,把它放在一个比存放原始程序的目录更早搜索到的目录中。
为了防止这样的攻击,就要用全路径名来启动程序,比如,用/bin/su而不是su。当然,确定当前目录不在root的搜索路径上。另一个具有相同问题的表现就是伴侣病毒(见8.8.5节)
6.6 审计日志和入侵检测一旦安装好可运行的系统,它的安全机制就应该阻止非法的用户操作。但是,保护机制可能是不够的或者是有缺陷的。在像Unix这么复杂的系统中,可能会为了保持系统运行而强制采用不合需要的安全设置。所以,采用进一步的安全机制,在安全漏洞(违反,violation)或者其他可疑事件发生时或者发生后进行检测,是有利的。这样的机制可以分类如下:
审计:在一个审计日志里记录安全相关事件以便事后分析;
入侵检测:在可疑事件发生时进行检测,然后通知系统管理员,比如,通过e-mail或者往控制台上发消息;
自动报复(入侵反应):采取适当措施,立即对安全警报进行反应。比如,可疑用户可能被从系统中自动驱逐。不过,因为误报的存在,自动报复是否是个好主意一直是个问题。在安全敏感的系统中,入侵检测是明智的。不过它处于一个紧急时刻,这时用户必须采取可能被入侵检测系统采用的措施。
把审计日志保存在一个安全的地方非常重要。能改变审计日志的攻击者可以轻松地隐藏他们的痕迹(这已经发生了)。下面以安全程度的递增列出了保护审计日志的事项:
在审计日志上设置逻辑保护,只有特权用户有写权。
把审计日志发送到别的机器上,在这台机器上被审计机器上的root并无超级用户权力。这个方法提供了双重保护。首先,现在对合法超级用户的行为有了更好的控制;第二,获得被审计机器上root的攻击者必须攻破另一台机器以隐藏他们的踪迹。
把审计日志发送到一台审计专用机器上,这台机器上诸如编译器、编辑器以及某些网络工具之类的多余工具已经被删除了。现在,对攻击者来说,攻破审计机器变得更加困难了。
把审计日志发送到一台安全打印机上,物理安全措施必须保护审计日志的完整性。
就管理来说,我们必须确定什么样的安全相关事件是应当记录的以及在什么时间记录。当然,在不同的被记录事件数目和对审计日志的扫描能力之间有一个折中(折衷选择,trade off)。设定为安全相关的事件越多,审计日志就越繁杂,从而就越难以发现入侵企图;另一方面,如果记录的事件太少,当发现入侵的时候,确定攻击的实施过程就有可能变得困难。而且,审计用户行为的社会认同也是有限的,它甚至可能是国家隐私法或者劳动法的组成部分。
一些安全相关事件自动记录在Unix日志文件里,比如,
/usr/adm/lastlog 记录用户的最后登录;这个信息可以用finger命令查看;
/var/adm/utm p 记录由who命令使用的记帐信息;
/var/adm/wtmp 记录用户每一次的登录和注销;可以用last命令查看这个信息。为了防止此文件占用所有内存,可以定期删减;
/var/adm/acct 记录所有执行过的命令;这个信息可以用lastcomm命令查看。
这些文件准确的名字和位置在你的Unix系统中可能会有不同。,用accton命令打开的记帐功能,也可以用来进行审计。可供观察Unix系统状况的更多命令包括find,grep,ps,users。
从技术角度看,我们必须确定审计日志溢出时的策略:
让审计日志覆盖自己,比如,从头开始;
把审计日志写入原来并没有分配给它的空间;
系统停下来,等待管理员进一步的举措。
审计日志非常冗长,因此,人工扫描这样的日志可能会遗漏重要的事件。所以,建议使用专家系统检查审计日志,寻找已知的违背安全的迹象,或者用人工智能技术识别可疑行为。入侵检测系统也使用类似的方法。
6.6.1 登录用户标识UID
在刚才提到的日志文件里对安全相关事件进行检查,大多数事件和用户有关,所以,日志条目应该包括引起事件的进程的用户标识苻UID(标识符,identifier)。那么,如果是SUID程序引起的事件,如何审计呢?这样的程序以它的属主的UID,而不是运行程序的用户的UID运行。所以,当你使用当前登录进程的UID时,日志条目并没有给出你实际需要的信息。
为了增加准确性,Unix的一些安全版本维护有关初始登录用户的信息。比如,SCO Unix使用登录UID(LUID)。(在HP-UX中,有实际UID的概念)LUID在登录时确立,子进程从它的父进程继承LUID。
用户标识(身份,identity)是一个安全属性,使用它有两个目的,访问控制和记帐(责任,accountability)。并不是总有可能同时为了两个目的使用这个属性。只要UID对应于真实的用户,基于许可的访问控制和审计就相互依存。一旦你创建了特殊的用户标识,利用SUID或者SGID程序保护对资源的访问,你就同时拥有了一个在审计方面作用有限的属性。
6.7 包裹层(包装壳,wrapper)
目前我们提到的访问控制和审计机制并不复杂。它们和操作系统安全的传统一致,集中在对资源访问的控制上。还有可能通过巧妙的使用基本的访问控制机制实现中间层的控制。除此之外,我们还可以修改Unix本身来实现这个目标。这里的难点是找到一个Unix的组件,我们通过改变它来添加有用的安全控制,同时,操作系统的其余部分并不受影响。考虑到Unix系统的复杂性,这个任务并不轻松。
传输控制协议(TCP)包裹层非常精彩地说明了这样的设计方法。Unix的网络服务,比如telnet和ftp,是以下面的原则构建的。守护程序inetd监听外来的网络连接请求。当连接建立后,inetd启动相应的服务程序,然后再转去监听新的连接请求。这个守护程序被叫做超级服务器,因为它为许多服务程序工作。守护程序inetd有一个配置文件将服务(端口号)映射到程序上。这个配置文件条目的格式如下:
sevice type protocol watiflag userid executable command-line
比如,telnet的条目是:
telnet stream tcp nowait root /usr/bin/in.telnetd in.telnet
当inetd接到一个服务请求,它查看配置文件,然后启动一个新进程以运行由executable指定的可执行文件。这个新进程的名字也被改为在命令行字段中给出的名字。
一般情况下,可执行文件的名字和命令行字段中给出的名字是相同的。这个冗余引来了一个有益的小花招。把inetd指向一个包裹程序,而不是原来的executable可执行文件。使用进程的名字来记住原来的可执行文件,在包裹程序执行完安全控制后,原来的可执行文件将被执行。在我们的例子里,配置文件中telnet的条目可被替换为:
telnet stream tcp nowait root /usr/bin/tcpd in.telnet
执行的程序现在成了/usr/bin/tcpd,这就是包裹程序。运行包裹程序的进程仍然叫做in.telnet。在包裹程序里,你可以进行所有你想做的访问控制或者审计控制。在原来的应用中,包裹层被用来进行IP地址过滤(参看13章)。因为包裹层知道它所在的目录,即/usr/bin,以及它自己的名字,即in.telnet,于是它可以调用原始的服务程序,即/usr/bin.in.telnet。在用户看来没有任何差别,他们接受的服务和以前一样。
在计算机科学里增加间接层是一个强大的武器。在安全上,它可以用来攻击或者保护系统。通过在守护程序inetd和服务程序之间插入TCP包裹层,你可以在不改变守护程序和服务程序源码的情况下增加安全控制。
这个例子的好处是它的通用性。同样的机制可以被用来保护一整套Unix网络服务。
TCP包裹层结合了一个基本的设计原则(受控调用)和一个精彩的技巧,使在不改变调用这些服务程序的情况下增加安全控制成为可能。在你更新已有的系统以加入安全特性的时候,这是非常理想的情况。
6.8 安装和配置操作系统的生命周期中的一个关键点是安装。操作系统有许多安全特性(feature)和影响安全的特性,其中有一些没有被详尽地记载。缺省配置可能有利于顺利地安装和操作,但同时它给予维护工程师和系统管理员太多的特权。像限制每一个别的用户一样限制系统管理员,并分清系统管理员和安全管理员的角色是合适的。复杂的和并未完整披露的特征可能会让系统的安装非常困难,所以,制定安全策略是很急迫的。Unix本身并未给系统管理员的工作带来便利。
系统管理员必须熟知所有安全相关的文件和安装以后如何对危险的缺省配置作修改。 P100
系统安装后,安全相关的参数用标准的Unix编辑命令定义。对资源访问的许可设置在更接近于操作系统的层次而非应用。比如,通过编辑类似/etc/passwd的文件创建用户。用以下的命令保护passwd程序:
chmod 4750 /bin/passwd chgrp staff /bin/passwd
当审计系统时,要使用Unix搜索命令。比如用下面的指令扫描没有口令的帐号:
awk –F,‘length($2)<1 {print $1}’ </etc/passwd
搜索SUID和SGID的命令:
find / -type f\(-perm 2000 –o –perm 4000\) –exec ls –ld {}\;
可以通过简单的自主访问控制支持访问控制策略。结构化保护可以基于组成员关系和使用无登录的帐号而实现。
有许多附加的Unix安全产品来管理安全特性和检查当前安全状态。两个流行的检查工具是COPS[54](还有[50])和SATAN。它们搜索已知的安全漏洞,比如弱口令、文件和目录的不安全许可设置,或者有毛病的配置文件。系统管理员可以使用这些工具来检测他们管理的系统中的漏洞。不过,这种做法不太普遍,因为它们可以被攻击者用来实现几乎一样的目的。
进一步的阅读这一章对Unix安全进行了概览。如果你想要进行更深的了解,关于这方面有很多书籍,比如[36,50,55,162]。SRI的Unix安全技术报告在:
http://www.sri.ucl.ac.be/SRI/documents/unix-secure
如果你需要有关特定Unix版本的信息,请垂询制造商提供的文档和系统提供的在线文档。本章给出的大部分例子已经在一个DEC-Unix机器上进行了测试,在不同的Unix版本上,也许需要修改。Linux是一个免费的Unix。Linux上安全信息的一个来源是:
http://bach.cis.temple.edu/linux/linux-security/
不同安全层次(多级安全,multi-level security)的Unix系统在[132]中进行了讨论。计算机紧急事件响应小组CERT定期发布安全产品的报告。一般信息请浏览他们的主页:
http://info.cert.org/
对于CERT的用户/订阅者也可以从他们的FTP服务器上下载报告:
ftp://info.cert.org/pub/cert_advisories/
Wietse Venema的主页:
ftp://ftp.win.tue.nl/pub/security/index.html
上有和Unix安全相关的工具和论文。SRI的入侵检测专家系统的研究在[92,72]中记载。商业Unix审计产品的主页是:
http://www.axent.com
http://www.ov.com
对一些入侵检测系统的最新的分析在:
http://www.secnet.com/nav2.html
练习题练习6.1查看安全相关命令的在线文档,找到在/etc/passwd中你自己的条目,并查看你的文件和目录的许可权设置。
练习6.2在你的根目录下创建一个子目录,放入一个带有短消息的welcome.txt文件。将这个子目录的许可属性设置成属主可执行,然后:
用cd命令使该子目录成为当前目录列此子目录的文件清单显示文件welcome.txt的内容在子目录中创建welcome.txt的一个拷贝再分别对此子目录设置读许可和写许可,重复上述练习。
练习6.3你怎样保护一个终端设备(tty)不被其他用户访问?
练习6.4你能够在3.6.3节的VSTa能力框架下,通过UID、GID和许可权,来捕获Unix的访问控制吗?
练习6.5你应该怎样设置备份过程来减少安全漏洞?
练习6.6应用Unix安全机制实现中国墙模型和Clark-Wilson模型。
练习6.7哪条Unix命令可以列出你的目录下所有其他人可以写的文件?
练习6.8你认为Unix系统安全的强处和弱点是什么?就此写一个1000字左右的短报告。
第7章 Windows NT 安全
Unix安全一章可以用作一个实例来学习操作系统提供的基本安全机制,但几乎没有触及到用这些基本机制实现整体安全问题。解决这个问题需要附加的用作控制的中间层次。其他的实用重点领域是安全的特性的管理和对系统管理者的安全控制。本章将通过讨论Windows NT的安全,在这些方面作介绍。
目标考虑操作系统怎样支持安全策略的实现。
考察计算机网络特殊的安全问题。
提出一些主要的与系统管理有关的安全问题。
介绍Windows NT 安全的基本概念。
7.1 导言
Windows NT 是微软公司开发的一个适应多种处理器体系结构的轻型(可移植的,portable)操作系统。它向后兼容,可以运行MS/DOS、OS/2及Windows应用程序。Windows NT具有适应POSIX的网络功能,其3.51版本标准配置通过了C2类的安全认证。Windows NT对管理安全的支持超出了为管理它的安全特征而提供的图形接口。
如同前一章,在这里我们也不准备给出Windows NT安全的完整概念,其弱点的详细评估,或者指导怎样最好地利用其安全特性。在本章后面的参考资料中提供了可以找到这些信息的连接地址。我们的主要目标是突出那些在分析实际设置计算机基本安全时还没有被解决的问题。与Unix安全相比,我们选择的说明Windows NT安全的内容更多地偏重在人机标尺的用户这一端(图7.1)。
特殊的 普通的
复合的 简单的
集中于用户 集中于数据
 
用户端 机器端
图7.1:人机之间的Windows NT安全特性的位置
7.1.1 安全体系
我们首先从概览Windows NT采用的基本保护机制开始。
和Unix一样,在用户模式(保护环3)和核心模式(保护环0)之间有明显的区别。操作系统核心服务程序,包含Windows NT执行体,都运行在核心模式。用户程序通过应用程序接口(API)调用操作系统服务。程序上下文转(切)换和从环3 到环0的数据传送(转换,transition)由本地过程调用LPC程序(设施/功能程序,facility)来完成。
锁操作是操作系统的基本要素。如果一个用户在某一对象上设置了排他性的锁,则其他用户都不能对该对象访问。
数据以专有格式存储。以这种格式处理数据的实用程序即作为控制的中间层。然而,不修改操作系统就可以绕过这些控制,因此“含混的安全”警告就要发出了。
Windows NT是一种面向对象的设计。相对于Unix系统把一切都认为是“资源”的统一的自主访问控制机制,Windows NT的自主访问控制则因对象类型不同而不同。
下面是操作系统中安全子系统的一些构件。
安全引用监控器(SRM):管理访问控制,SRM是一个可执行的(执行体,execution)组件,运行于核心模式。
本地安全权威(LSA):一个用户模式构件,在用户登录时检查用户帐户和产生系统访问令牌(SAT),LSA还负责审计功能。
安全帐户管理器(SAM):一个用户模式构件,维护LSA使用的用户帐户数据库,为LSA提供用户认证。
登录进程:运行于用户模式,当一个用户登录时认证用户的进程。
7.2 注册表注册是指为Windows NT 配置数据的中心数据库。注册中的表项被称为关键字keys(不要与密钥混淆)。注册是层次化的数据库,在最高一层,注册被分解成四部分,叫做蜂箱(蜂巢状物,hive)。蜂箱包含多个关键字(目录),这些关键字又包含子关键字(子目录)或是数值(数据项)。在四个蜂箱的顶层关键字通常被称为根关键字。每一个蜂箱都有一个日志文件用来记录那些对蜂箱或其子关键字的改动,以备审查。这里,系统蜂箱是例外,它把日志表项写入system.alt文件中。
在注册中,系统被修改以适应用户的要求,设置默认的安全策略。因此,保证注册数据的完整性是必须的。例如,一个注册数据的关键字可以指向操作系统自动寻找的确定可执行文件地址,在Windows NT中这被称为path(路径)。如果这些关键字的许可集是脆弱的,例如,允许任何用户写操作,那么攻击者可以通过修改路径写入恶意的软件。因此通常面临的两难选择是保护高层和方便用户不能同时实现。
注册数据是以私人所有的格式存储的,可以修改注册数据的系统工具是注册表编辑器(Registry Editor)。但是,用户可以创建自己的工具来绕过注册表编辑器,直接获得注册信息(7.3.3节)。对于系统管理者来说,从机器中删除注册表编辑器使之不被随便使用,是防护的第一步。一些和安全相关的关键字不能通过注册表编辑器更改,但是可以通过特殊的工具更改,例如:系统策略编辑器(System Policy Editor)。
7.2.1 注册文件许可访问控制表可以设置成蜂箱和关键字。访问许可被定义为内置的组,像系统管理员、系统、用户、创建者/物主(Creator/Owner)和所有使用者(7.5.3节)。可能的访问许可是:
只读:用户只能读取数据而不能做任何改变。
完全控制:用户可以编辑、创建、删除和取走有所有权的数据。
特殊访问:依照专门的列表,用户可被赋予不同的权利。
一个典型特殊访问许可可能包含以下内容:
询问值(query,一种数据库(询问子)系统询问,查询;询问程序):读取关键字的值设置值:设置一个关键字的值创建子关键字:用一个已有的关键字创建一个新的子关键字列举关键字:用一个关键字确定所有的子关键字(标识(identify识别,鉴别,标识)在一个键内的所有子键)
通报(notify):接收关键字产生的审查通报(notification,通知书(通告,布告))。
创建连接:创建一个指向关键字的符号连接删除:删除一个关键字写DAC:修改关键字的访问控制表写Owner:获得物主属性(ownership,所有权(主权))
读取控制:从关键字中读取安全信息下面的例子,是根关键字的默认许可:
HKEY_LOCAL_MACHINE:包含本地计算机、硬件和操作系统的信息。
管理员:完全控制。
系统:完全控制。
所有人:读取。
HKEY_CLASSES_ROOT:包含文件关联(association),OLE(object linking and embedding)和DDE(dynamic data exchange)类定义。
管理员:完全控制。
系统:完全控制。
所有人:读取。
HKEY_CURRENT_USER:包含当前登录的用户大概(开工文件,profile)信息管理员:完全控制。
系统:完全控制。
所有人:完全控制。
HKEY_USERS:包含系统中所有用户的大概信息管理员:完全控制。
系统:完全控制。
用户(User):读取。
HKEY_LOCAL_MACHINE 的安全相关子关键字有:
HKEY_LOCAL_MACHINE\SAM,用户和组帐户的数据库
HKEY_LOCAL_MACHINE\Secure,由安全子系统使用的本地安全策略信息
HKEY_LOCAL_MACHINE\Software\Microsoft\RPC 远程过程调用
HKEY_LOCAL_MACHINE\ Software\Microsoft\Windows NT \CurrentVersion
通过修改这些关键字,一个攻击者可以修改操作系统的性质,这些关键字的一个明智的许可设置如下:
管理员:完全控制。
系统:完全控制。
创建者/属主:完全控制。
用户(User):特定访问特殊访问可以是询问值、可列举子关键字、通报和只读控制。
如果一个关键字不存在,将会发生什么?为了分析这个问题,首先考虑这个关键字使哪些用户和组可以远程访问注册信息。
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurePipeServers\Winreg
如果这个关键字存在,那么就将考虑,当一个用户要求向注册表远程访问时,要强制限制远程的注册表编辑。如果这个关键字不存在,将要执行的远程访问没有专门的核对,对注册表的远程访问将和本地访问一样。
7.3 身份识别和认证
Windows NT使用用户名和口令完成身份的确认。这种机制的应用(implementation,工具;执行,实现;设备)是向服务器和工作站网络方向调整(is geared towards)。Windows NT 5.0使用Kerberos进行身份认证。
7.3.1 Windows NT 口令方案口令是以加密的方式存储的,共有两个加密的口令,一个是给微软的局域网(LAN)管理员,另一个是给Windows NT。为了防止用户采用脆弱的口令,一个被动态连接库(DLL)过滤的口令才能被存储(a password filtering dynamically linked library can be installed),下面的关键字(key,键码)已经被加到注册表中:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\
LSA\NotificationPackage\Passfilt.dll
由微软提供的口令过滤器要求口令至少有六个字符。口令必须至少包含下面四种数据类型中的三种:大写字母(upper case letter)、小写字母(lower case letter)、阿拉伯数字和非字母数字字符(non-alphanumeric character)。口令不能包含用户名部分。
加密的口令被存储在使用者的帐户中(7.4.3节),该帐户保存在SAM数据库中。SAM数据库是注册表的一部分,它是一个不能被标准文字编辑器阅读的二进制文件。操作系统使用SAM API作一个系统调用来解密一个加密了的口令。操作系统只运行在特权状态时允许使用这些系统调用。SAM数据库默认任何人都是可以读的,但是,因为这个数据库经常被系统使用,所以这个数据库是被加了锁的。然而,在目录\system32\repair中也有一个备份,这个备份是当系统安装时或者当没有A:驱动器作为输出而发出一个rdisk命令时建立的。
这些敏感数据的备份拷贝作为原始数据本身,需要同样的保护措施。
局域网LAN管理员口令
LAN管理员口令是加密的,并且可以从存储在SAM数据库中的密文中恢复。口令最长为14个字符,加密算法允许128位字符;但是口令菜单的输入部分只使用14个字符,如果口令长度不足14位,就以0补足。口令首先被转换成大写字符,并把14个字符分为两个7字符的块。这两个块被扩展成8字节带奇偶校验的DES加密算法的密钥,加密是混和了魔术的秘钥(Magic key) 0xAA,0xD3,0xB4,0x35,0xB5,0x14,0x4,0xEE完成的,事实上这个魔术的秘钥没有什么魔力。两个加密结果连接起来,组成加了密的LAN管理员口令。
Windows NT口令
Windows NT口令是使用单向函数(one-way function)经哈希算法形成的,口令不能从存储在SAM数据库中的哈希值恢复。为了计算哈希值,用户口令首先被转换成统一的字符编码标准Unicode(支持65536字符的16位字符集)字符,并使用MD4算法(见12.2.1节)得到一个16字节的哈希值。
7.3.2 登录登录是使用安全警示序列键(secure attention(注意) sequence ) CRTL+ALT+DEL 来唤醒(激活)Windows NT操作系统登录界面(screen,屏幕)。安全警示序列键在开始一个会话时使用,甚至当登录界面存在时也要使用。安全警示序列键产生对低层的Windows NT函数调用,这些函数不能被应用程序复制(duplicate,复制,转录,重复,重叠)。因此,一个从MS/DOS启动盘运行DOS的程序不能模拟Windows 登录界面,不能挂接欺骗攻击[63]。
Windows NT 提供了一个合法通报选项作为警告消息(Windows NT offers the option of displaying a legal notice(注意(注意事项,布告)) as a warning message,),用户在登录之前会获得这个警告信息,用户被提示使用用户名和口令,用户名和口令被登录进程收集并传送给本地安全管理中心LSA(local security authority),LSA调用认证组件(package,程序[软件]包,组装程序;【网】数据包),把用户名和口令与存储在帐户数据库中的值比较,如果相匹配,SAM返回用户的安全标识符(SID)和安全标识符所属的组。认证组件创建一个登录会话,并将这个会话和所有的SID传回LSA。
LSA现在产生一个系统访问令牌(SAT),包含用户的SID和用户权限,SAT被登录进程附加给Win32子系统产生的进程,产生这个进程的目的是控制访问。
如果在本地用户帐户数据库上认证失败,这个请求被向前传送到网络上另一个认证组件,如果所有的尝试都失败了,用户将收到一个错误的消息。相反,如果第一个认证组件不在本地机器上,而是在服务器上,那么将会使用在客户机上缓存的数据库作第二次尝试。
最后,还应该注意交互登录和网络登录之间的差别,交互登录刚刚描述过了,网络登录是用户通过网络认证协议登录。不同的访问控制条件的应用取决于用户如何登录。
7.3.3 绕过SAM API 
SAM数据库是以二进制属性(专有的二进制格式)编码的,SAM API是访问SAM的唯一数据接口。然而,现在有许多可用程序能把SAM文件转化成可读的格式,PWDump 就是这样的软件。该软件目前已发展到支持单一登录环境,在这里,Windows NT口令可以和UNIX系统共享。PWDump返回:
User Name:User ID,Lan Manger Password,NT Password:User Name,
Home Directory
PWDump的典型输出是:
phac105:1001:BB70C98EB15675ED78A48107248AD508:
13FD03080874168F86E5A4EF866E44C5:
Mark Curphey:\\fred\profiles\phac105\personal:
现在,黑客可以试图诱骗系统管理员去运行如PWDump的程序。WWW和Email软件如ActiveX或MIME,具有可以通过Internet传送并在用户工作站上运行程序对特点。通过把具有可执行内容的PWDump包装进Web包中,并诱惑系统管理员浏览这样的主页,黑客可以获得可读的NT加密的口令。(这里,声称口令现在是可见的则是一种令人误解的夸大之词。)
7.4 访问控制-特征要保护计算机系统中的敏感信息,你的第一道防线是控制对系统自身的访问。你的第二道防线是在系统中对那些有进入系统的许可权的内部知情人的访问控制(police,管辖;管制,控制;监视,整顿)。我们用这样的顺序探讨Windows NT的访问控制,在讲述中还会参考计算机网络知识。
7.4.1 域(domains)
要能进入一个计算机系统,必须拥有这个系统的一个用户帐户和口令(见7.4.3节)。如果你是计算机网络用户,当需要访问其他计算机上的资源和服务时,你不想一次又一次地登录;如果你是管理计算机网络的管理员,你也不想为每一台计算机单独地配置安全设置。Windows NT使用域来实现单一登录和协助安全管理。
域是共享公共用户帐户数据库和安全策略的计算机的集合。因此,用户不必在每个计算机上设立帐户,但是需要有一个域的帐户。域的用户帐户数据库的主拷贝保存在一个叫PDC(主域控制器)的服务器上,用户帐户数据库的拷贝保存在BDC(备份域控制器)上,用户可以在PDC或者BDC上得到确认,对帐户数据库的更改总是在PDC的一个拷贝上进行,独立于管理员使用的计算机。在BDC上的备份拷贝是由PDC主拷贝完成更新的。如果没有PDC,那么就不可能更新帐户数据库。你必须等待直到PDC重新可以使用或者将一个BDC变成为一个新的PDC。
工作站可以同时维护本地自己的帐户数据库,同时也是域的成员。用户既可以是本地用户,从本地数据库取得许可的数据;也可以是域用户,从域数据库中取得许可的数据,一个既有本地帐户又是域帐户的用户,有两个不同的安全标识(见7.4.4节)。同样的,资源也可作为本地的和全局的进行管理。典型的例子像安装在一台工作站的打印机资源,将按本地方式进行管理。
7.4.2 登录缓存-一个潜在的攻击点当一个工作站用户向一个域登录,而这个域的控制器不可用时,登录将会失败。因此,一个工作站可以设置一个成功登录的缓存,当工作站不能向域控制器登录时,可以考虑向这个登录缓存申请。对于一个被域控制器SAM拒绝的用户来说,这是一个可以采用的便利方法,由于丧失了网络连接能力,工作站用户被迫使用登录缓存获得确认,从而仍然获得系统访问权限。
你可以把这个问题看作是TOCTTOU(time of check to time of use)的一个特别的情形。当用户登录并在整个会话过程中都是合法的,相应的访问许可和用户权限就建立了。因此,改变访问许可和用户权限不会立刻生效。
7.4.3 用户帐户
SAM中的用户帐户数据库保存了用户的安全相关信息。用户帐户可以使用域用户管理器(user manager for domains)软件工具修改,其中,在用户帐户中定义了以下数据域。
用户名:登录用的唯一用户名。
全名(full name):用户自己的帐户名。
口令:最长14个字符,按照上面描述的方法加密存储。你可以强迫用户下次登录时改变口令,拒绝用户改变口令,设置口令的有效期。
登录时间和工作站:你可以指定用户什么时候、从哪台计算机登录。可以设置当远程用户使用完规定时间后强迫断开网络连接或者允许用户继续一个存在的会话,在后一种情况中,只有新登录才被拒绝。
用户配置文件(profile)路径和登录脚本名:用户配置文件定义了用户桌面环境,即程序组、网络连接、屏幕色彩等等,登录脚本是当用户登录时,自动运行的批处理文件或可执行文件。
用户根目录Home:可以指定Home目录是在本地计算机上或者是在网络服务器上。
帐户类型:一个帐户可以是全局的或者是本地的,我们将在7.4.1节解释两者的区别。
失效期:默认情况下,帐户没有失效期。
7.4.4 安全标识符每一个用户、组和计算机帐户都有唯一的安全标识数(SID),SID用来标识自主的访问控制。SID是在创建帐户时同时构建的,并且在帐户生存期间是固定的。SID的构建是采用伪随机数(如时钟)作为输入的;因此,你不能指望在删除了一个帐户后,使用和以前相同的参数重新创建一个帐户,能产生相同的SID。因此,新帐户不会保留原帐户的访问许可。
创建一个域的同时会构建唯一的SID。当一个工作站或者服务器加入这个域时,其SID会包含域的SID(计算机会使用其SID检查是否属于相同的域)。由于SID不能改变,因此,在域之间移动域控制器不是简单的管理过程,计算机不得不完全重新安装,在逻辑上成为一个“新”的计算机接受一个新的SID,成为新域的一个控制器。同样,通过拷贝另一台计算机的根目录和配置文件到一个新安装的计算机,会产生具有相同SID的两台计算机,干扰Windows NT安全模型。
7.4.5 Windows NT对象的访问
Windows NT是依照面向对象模式设计的,过程、用户帐户、资源、文件、目录等等,都是一种目标类型,对对象的自主访问控制是基于这种对象的类型的。例如,文件的访问控制不同于打印队列的访问控制。对对象的访问通过赋予主体的许可来控制的。每一个对象有一个安全描述子,如下:
对象属主的安全标识只在POSIX子系统使用的组安全标识访问控制表ACL
系统访问控制表,控制产生的审计消息
ACL包含访问控制和审计许可,一个主体或组的访问控制表表项可能是:
拒绝访问允许访问系统审计
在ACL中总是先列出拒绝访问表项,每一个允许访问表项是访问许可的列表。访问许可是对象的特殊类型。在下一节将给出的NTFS文件系统的访问许可是这种访问许可集合的例子。
此外,还存在一些标准访问掩码,适用于所有的对象类型。典型的例子是关于对象安全属性管理的许可,如下:
Write_DAC,改变任意的 ACL(拒绝访问和允许访问接口)
Read_Control,授权或拒绝对安全描述子的读取
Delete,授权、拒绝或删除对对象的访问许可当一个主体要求访问一个对象时,安全基准监视器(安全引用监控器,security reference monitor)取得用户的安全访问令牌(SAT)和对象的ACL,来决定这个访问要求是否应该被允许。用主体的许可构造一个期望访问掩码,如果不存在ACL,就不执行任何检查且访问就被赋予。如果存在ACL,对于每一个ACE,主体的SID(在SAT中)与ACE中的SID进行比较。有以下三种可能的情况:
1,ACE并不包含一个匹配的SID,这个ACE将会跳过。
2,ACE包含一个匹配的SID,指定为“拒绝访问”,因为拒绝访问列在先,那么它们将在主体的任何“允许访问”之前处理。如果期望访问掩码包含Read_Control或Write_DAC请求,并且如果这个主体是对象的属主,则访问被授权,否则访问被拒绝,并且不再进行任何进一步的检查。
3,ACE包含一个匹配的SID,指定为“允许访问”,如果这个ACE的访问掩码,加上前面所有已经检查过的、匹配的ACE中的访问掩码,都包含期望访问掩码的所有许可,则访问被授权并且不再进行进一步检查。否则,搜索继续。
如果搜索到达ACL尾部而没有访问授权,访问被拒绝。因此如果存在一个空的ACL,访问则总被拒绝,如果不存在ACL则访问总被允许。
通常,操作系统在不同的地方存储访问访问控制信息。重要的是知道检查依什么顺序执行。有时候,只有第一个匹配访问控制入口被考虑。其他时候,后面更多的特定入口能变更前一个入口。最后,你应该知道操作系统如果发现一个没有入口匹配的访问要求时如何反应。
7.4.6 NTFS文件系统
NTFS(新技术文件系统)的特定访问许可严格限制对驱动器、目录和文件的访问。访问许可由其他用户和组的文件属主定义。基本允许是:
● 读read(R)
● 写write(W)
● 执行execute(X)
● 删除delete(D)
● 改变访问许可change access permissions(P)
● 取属主特性take ownership(O)
以下访问许可适用于文件:
● 不许访问NoAccess:阻止某一用户可能具有的任何访问和变更任何其他访问。例如:通过组内的成员资格。
● 读Read(RX):仅仅读和执行访问
● 变更Change(RWXD):读、写、执行和删除访问
● 完全控制Full Control(all):允许读、写、执行和删除文件,且允许改变访问许可和取得属主资格
● 特殊访问Special Access:读、写、执行、删除、改变访问控制,可以指定取得属主资格等的任意组合。
一个用户的访问许可是从用户许可集合中导出的,以及从用户所属的组的许可集合中导出的。除非一个不许访问用户许可变更了相关的组许可,否则,一个用户可以拥有比直接指定给用户的许可更多的许可。
理想情况,一个组织的安全策略把用户按相同的需求分成可控制数目的组。实际情况总是有例外。因此,定义例外的机制,如果应用得当,通过取消或附加许可是一种有用的工具。
当创建一个新文件时,并且NTFS许可应用于父目录,文件从父目录继承访问许可。否则,对于每一个新创建的文件给予“everyone”“Full Control"的许可。目录许可是:
● NoAccess:防止对目录的任何访问,并可通过组内成员资格,变更用户拥有的任何其他的许可。
● List(RX):用户可以列出目录和子目录中的文件。
● Read(RX):用户可以列表或打开目录和子目录中的文件,移动文件到子目录,执行应用程序文件。
● Add(WX):用户可以增加文件到目录中,但是不能浏览目录的内容。
● Add and Read(RWX):用户可以观看和打开文件,执行应用文件,增加文件和子目录。
● Change(RWXD):用户可以读、写、执行和删除文件,增加文件和目录。
● Full Control(all):遍历目录的完全控制(访问,access),包括不管他们的访问控制表就可以删除文件和清空子目录的许可。
● Special Directory Acess:目录许可的任意组合。
● Special File Access:允许创建任意文件访问许可的组合。
当一个文件在目录间移动时,它保持它的NTFS许可。如果一个文件被复制,它接受目的目录的许可。用户如果具有删除目录的许可,它可以删除目录下的任何文件,而不需要具有文件自身的删除许可。
读、写、执行、删除、改变访问许可和取得属主权限(take ownership,取得所有权)的事件可以被审计。管理员能够决定对哪一个事件进行监视。
7.4.7 共享当网络协议与操作系统是分开的实体时,共享是时间的剩余。共享控制网络用户(不要和交互用户混淆)怎样获得对文件和目录的访问。用户可以通过设置口令,获得网络访问授权,对一个共享文件进行只读的或完全的访问。这种机制具有所有基于口令控制的缺点。
● 必须记得为不同共享的不同口令。
● 共享口令应该被所有授权访问的用户所共享。
此外,共享并不真正支持访问请求的审计。控制网络用户不仅可以通过共享,也可以通过对用户正在访问的系统的NTFS许可设置来实现。
7.5 访问控制-管理我们已经列出了Windows NT的基本访问控制机制,现在转向安全管理问题。内置帐户、强制性配置文件、域和信任关系是使安全管理变得比较容易的手段。
7.5.1 本地组和全局组组是用户帐户的集合。组成员继承用户权限和赋予组的许可。组可以看作是控制的中间层,一个对象的访问许可是赋给一个组的(permissions for an object are given to(癖好的;喜爱的;习惯的) a group)。用户通过成为组成员来获得对对象的访问许可。赋给一个组的许可可以有选择地从组的单个成员上撤销。如果一个用户不应该访问某个特定文件,管理员可以对这个用户在这个文件上设置NoAccess许可。
在一个域内,可以为整个域定义全局组,或者为单个工作站定义本地组。
● 全局组Global groups,为整个域所定义;只包括用户帐户,但不包括其他组帐户。
● 本地组Local groups,为单个工作站所定义;包括用户帐户和全局组。
全局组和本地组为在用户和对象之间设置两个控制层提供手段(见图7.2)。全局组包括那些应当具有相同权限的用户。特定机器上的对象许可赋给了本地资源组(resource groups),资源组包含对资源有访问权限的全局组,而不是单个的用户帐户。
可以用两种方法解除这种组结构,就像前面看到的那样,可以通过设置NoAccess取消组成员的访问许可,可以通过把用户帐户放入相关的本地组来给予其附加的许可。
7.5.2 用户权限用户权限并不控制对单个的文件访问。然而,用户权限说明一个用户可以在系统上做什么。(在其他一些系统中,与此相似的概念常常称为特权privileges)。典型的用户权限必须与系统管理操作相联系,例如审计、备份或关闭系统。用本地方式或网络方式使用一台计算机都通过用户权限来控制。此外,存在使用户绕过访问控制的用户权限,获得对象的属主权利的权限可以作为这种权限的一个例子。
当随后执行一般的访问控制时,被拒绝访问一个目录的用户不能获得对该目录中文件的访问,即使该文件上的访问控制表设置成允许被访问也不行。然而,对那些具有绕过遍历检查权限的用户,目录路径的访问控制表并不进行检查。缺省的情形是每一个用户都具有这种权限,建议从绕过遍历检查权限中移去用户和组,从而形成一种清楚的访问控制策略。
7.5.3内置组内置帐户和组具有预设的用户权限和许可。有一些全局的内置组,例如域管理员、域用户和域客人(Domain Guest)。然而大多数内置组都是本地组,例如管理员、备份操作员、用户或客人。在实现安全策略和定义具有不同许可权模式的组时,只有有很强的理由才建议系统管理员坚持内置组。
Alice
Elephant Lion Adelie Humboldt
Bear Bob Magellan
全局组
No access 本地组
RWXD RW X RWX RW No access
图7.2 Windows NT的全局组和本地组
不要期望一个并非安全专家的用户能够从安全特性选项中做出受过训练的选择。在这种情况下,建议应用预定义的安全特性设置来满足典型要求。
Windows NT中的系统管理可以由赋予了内置本地组管理员身份的用户来执行。这个内置的管理员帐户在NT安装时创建,自动成为本地管理员组的成员,并且不能删除或禁用。
不像UNIX,NT管理员并不会自动拥有能访问所有文件的超级用户特权。可以在文件上进行设置以使管理员不能自动具有访问的权限。通常的系统管理活动应该从分配到内置本地组的帐户来实现,例如服务器操作员(Server Operators),备份操作员(Backup Operators),帐户操作员(Account Operators)和打印操作员(Print Operators)。这些组的权限是受限的,以与他们的工作相匹配。工作站上的超级用户可以管理本地资源,如本地打印机或本地帐户。即使在很精细的管理权限粒度时,管理员帐户仍处在能够发现强加访问限制的位置上。即使具有很少权限的内置本地组,例如备份都具有绕过访问控制的机会,当备份(恢复)取代现存文件的保护时。
如果一个用户作为系统管理员工作时,把这个用户的帐户放在域管理内置的全局组,并把这个全局组置入本地管理员组内。更好的做法是直接把这个用户帐户放入本地管理员组。为安全起见,作为系统管理员的用户应该给予第二个可以直接放入本地用户组的帐户。然而,作为这种便利的开销是,当在两个帐户之间切换时,必须进行注销并重新登录新用户。
访客帐户(Guests)不需要口令,用来使用户访问那些不需要授权的资源。然而,可以像其他用户一样给予这个帐户一些许可。Window NT安装时,访客帐户是禁用的。
存在更多的内置组,可以用来有效地定义许可权。
● Everyone:包含所有的本地和远程用户,包括访客帐户;这个组可以用来给所有用户授予或拒绝许可。
● Interactive:包含本地登录的所有用户。
● Network:包含所有通过网络登录的用户。
● System:操作系统
● Creator Owner:文件或资源的创建者或属主。
7.5.4 Windows NT 中的信任关系中间控制层可以促进有效的安全管理。一个组织越大,就有越多的中间层次可取,并且你将到达一个全局组、本地组和内置帐户对构建安全管理都不再够用的地步。因此你可以使用域作为控制的下一联接,并在域之间建立信任关系。
在一个单向信任关系中,我们有可信任域(trusted domain)和信任域(trusting domain)。可信任域中的用户在信任域中是有效的。双向信任关系是通过建立两个单向信任关系而建立的。信任关系不可以传递,如果A域信任B域且B域信任C域,并不隐含着A域信任C域。从技术上来说,信任关系按下面方式建立:
● 可信任域的管理员建立一个中间域信任帐户,指定信任域名字和选择该域的口令。
● 然后把这个口令交给信任域的管理员。
● 信任域的本地安全授权(LSA)创建一个可信任域对象,包含名字和可信任域的SID,以及一个含有从可信任域管理员处收到的口令的安全对象。
● 信任域的LSA然后尝试使用中间域信任帐户去登录可信任域。当然这个尝试肯定失败,因为中间域信任帐户不能用来登录,但是会得到一个出错信息,从而证实该帐户的存在。LSA现在继续往下执行并取回将来处理从可信任域来的访问请求时可能用到的可信任域的域控制器信息。
● 在可信任域和信任域之间共享的口令由信任域的PDC管理和常规地更新。口令用来保护在用户认证时的通信。
如何使用信任关系呢?例如,在你的机构中,你可能把所有的用户帐户放在一个帐户域中。由不同部门拥有的资源都被放入资源域。然后你把帐户域作为可信任域,把资源域作为信任域来构建一个单向的信任关系。
在图7.3的例子中,给用户Alf对资源彩色打印机以控制的访问,按以下步骤进行。把Alf放入帐户域EMPLOYEES的全局组Researchers中,在资源域PRINTERS中定义一个本地组Colour Printer。把EMPLOYEES作为可信任域,把PRINTER作为信任域,来建立一种信任关系。把可信任域的全局组EMPLOYEES\Researchers加入到信任域的本地组Colour Printer中。当用户Alf要求访问时,信任域的LSA将检索用户的权限和从可信任域的域控制器来的许可。
帐户域
EMPLOYEES
用户帐号Alf (可信任的)
,..
全局组
可信任关系
本地组
资源域
PRINTERS
,.,(信任的)
图7.3 域间的可信任关系在一个机构中的集中式用户帐户和系统管理可以通过创建一个主域(master domain)来实现,该主域包括用户帐户数据库和管理员组。这个主域被所有的其他域信任,这样在主域上有帐户的用户就可以访问所有其它域。主域的管理员组被放入本地域上的各自组内。
要得到对域的访问,你或者需要该域上的一个帐户,或需要被它所信任的域上的帐户。存在一个例外,要访问其他域的一个工作站,可以在那个工作站上创建一个同名同口令的本地帐户作为你的常规域帐户。尽管具有相同的名字,这两个是不同的帐户。但是由于你有一个匹配的帐户,所以工作站会接纳你。如果你的两个帐户使用不同的口令,本地帐户就会提示你需要口令。
7.5.5 强制配置文件用户配置文件定义了用户的桌面环境,特别是定义了用户可以调用的程序。用户不能改变强制配置文件。强制配置文件是一种安全机制,因为它们可以限制提供给用户桌面环境的实用软件,即程序管理器。管理员可以在定义用户桌面环境有效特性的用户配置文件中设置限制。
可以对EditLevel、NoClose、NoFileMenu、NoRun、NoSave Settings、Restrictions和ShowCommonGroups指定限制。例如EditLevel,限制用户如何修改他们的程序管理器。EditLevel可以取下列值:
0:允许所有的修改。这是默认配置。
1:防止用户创建、删除或重命名组。
2:包含EditLevel=1的限制,防止用户删除或创建程序项目。
3:包含EditLevel=2的限制,防止用户改变程序项目的命令行。
4:包含EditLevel=3的限制,防止用户改变任何程序项目信息。
7.6审计
Windows NT保持一个审计日志。审计日志的入口由安全引用监控器产生。记录在审计跟踪中的安全相关事件包括有效和无效的登录尝试、特权使用和像创建、删除或打开一个资源(文件)的事件。可以在用户管理器的策略菜单和文件管理器的安全菜单中选择需要记录的事件。只有管理员可以运行这些工具和管理审计。审计日志用事件察看器Event Viewer来扫描。
审计日志的最大容量可以在事件察看器中设置。当日志到达最大容量时,Windows NT给你三种选择。
● 按需覆盖事件Overwrite events as needed:审计日志中最古老的条目将被覆盖。
● 覆盖过期事件Overwrite events older than [ ]days:早于指定日期的记录将被覆盖。
● 不覆盖事件Do not overwrite events:必须手动清除老记录,才能记录新事件。
对于最后两个选项,系统管理员可以设置系统在日志满时自动关机。注册表中的CrashOnAuditFail项设置成如下所示:
HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Lsa
Name:CrashOnAuditFail
Type:REG_DWORD
Value:1
这个有点破裂性的设置对于满足橙皮书C2的要求是必需的。
7.7动态连接库DLLs的安全考虑动态连接库(Dynamically Linked Libraries,DLLs)是链接执行程序的软件模块。DLL代码则以它的宿主程序(host program)的权限运行。特洛伊木马的代码可以通过错误地引导程序到特洛伊木马DLL或者修改原始的DLL自身来实现插入。
7.7.1 DLL欺骗对于定位一个DLL,链接算法基本上有三种选择,它可以搜索:
● 程序目录,存放有主程序的运行文件。
● 系统目录。
● 工作目录,即调用主程序的进程的当前目录。
前两个位置事先就知道了,所以可以采取适当的保护来防止对DLL的访问。问题发生在最后的情况,如果链接算法搜索工作目录,攻击者可以在受害人的工作目录中放一个与原来DLL同名的特洛伊木马DLL。你不得不对Windows NT作一些详细考虑来防止此类攻击。
7.7.2 通知包通知包是一种机制,它使在与Windows NT同时运行的其他操作系统和网络操作系统环境下的单一登录更容易。为了允许口令共享,称作通知包的DLL必须能够解密口令和明文口令进行操作。使用中的DLL是被锁定的且不能被操作。不在使用中的DLL以及在一个任何人都有修改许可的目录中的DDL,可被特洛伊木马DLL代码代替以捕捉明文口令。
进一步的阅读大多数专用于特定操作系统的安全手册没有超出安全系统的表面。它们集中于提供的特性和它们的管理。它们告诉用户怎样管理安全特性而不是告诉他们如何去管理他们的系统安全。
在[149]中给出了对Windows NT安全的开始于相当初级层次的介绍,其中也包括许多练习题,[63,139]适用于那些对操作系统已经很熟悉的读者。微软的知识基地和微软网页:
http://www.microsoft.com/security
提供了安全特性、安全警告和操作系统补丁的信息。一份NSA赞助的关于Windows NT安全的评估,具有脆弱性分析和相应的对抗措施的指导信息。它可以从下面地址得到:
http://www.TrustedSyetems.com
其他有用的关于Windows NT安全的来源有:
http://www.ntshop.net
http://www.ntresearch.com/links.htm
在Windows NT之外,[163]提供了一份在经济研究机构流行的安全操作系统的好综述,关于RACF的信息,IBM的资源访问控制工具可以在下面找到:
http://www.s390.ibm.com/racf
AS/400(应用系统400)是IBM用于中型计算机的操作系统。它是一个流行于商业部门的面向对象操作系统,且被认为是相当安全的。AS/400安全在[122]叙述。这本书是以上综述的一个特别的例外,因为它深入挖掘了那些让攻击者可以突破安全控制的技术细节。
练习题:
练习7.1 可以通过对注册表编辑器设置访问许可或者通过定义对注册键的访问许可来对访问注册表加以控制,比较这两种保护措施。
练习7.2 可以为Windows NT设置一个BIOS口令,但是这个口令只能手工输入,这对你的口令选择要求有什么影响?
练习7.3 Windows NT域包含工作站和域控制器。域的所有机器是否应该具有相同的管理员口令?
练习7.4 比较UNIX口令和Windows NT LAN管理员口令用分组加密器加密的方式,加过密的LAN管理员的口令可以解密,UNIX口令不行。为什么看起来相似的算法有如此不同的特性?
练习7.5 在UNIX、RACF和Windows NT中,访问权限被赋予用户和组。为了使安全管理更方便,用户放入组中。当用户具有比他所在的组更少的权限时,这三种系统如何决定访问请求?已经赋予组的访问权限如何从单个的用户上撤销?
练习7.6 为了运行一个可执行文件,你需要什么许可?如何禁止用户进行自我复制?允许用户运行自己的复制的安全风险是什么?
练习7.7 信任可以传递吗?比较UNIX下.rhosts和Windows NT下域的信任关系。
练习7.8 在Windows NT 4.0中,域可以支持大约10000个用户帐户。如果系统具有更多的用户,应该设置哪些域和信任关系?如何保留主域模型规则?
练习7.9 什么是可管理性和使用匹配帐户使用户能够访问远程工作站的安全实现?
练习7.10研究有效地防止DLL欺骗的防御机制。
练习7.11 在许多方面,Windows NT比UNIX提供更多安全特性。事实上,一些批评意见声称用户可能被太多的特性淹没然后什么都不使用。在安全特性增长上的期望应到什么程度?如果安全特性太少或者太多,你将面对什么问题?
第八章 问题是怎样产生的
当事情出错或者看上去已经出错的时候,计算机安全就变得头等重要了。当你追溯安全失败起因的根源时,你几乎会不可避免的发现,你已经遭到计算机安全的三个祸因之一的打击:
变化(change)
自满(complacency)
方便(convenience)
本章旨在作为一种警告,帮助你避免重复通常的错误。计算机病毒(computer viruses)的部分包含了计算机不安全的方面。这些方面在计算机安全的公众理解中扮演显著的角色。
目标:
讲述导致许多安全失败的基本起因;
理解人们常常会重复过去的错误;
当设计安全系统的时候对采用防范措施有更好的理解;
提供计算机病毒和反病毒软件的介绍。
简介我们从计算机安全就是加强访问控制策略的前提开始。该陈述有两个方面:
1.我们必须制订一个反映了应用的保护需求的访问控制策略;
2.计算机系统必须加强在面对活跃的试图旁路(bypass)或者使控制无效尝试时的策略。
实现一个复杂的系统是一项极具挑战性的任务,并且正如大家所料,长期以来在操作系统中就存在安全漏洞。然而,让人惊讶的是这些漏洞大都起因于相当简单的编程错误和许多利用著名安全弱点(或者设计特点)进行的自动而有效的攻击,而不需要精巧和高深的技术知识。采用从别人那里得来的工具探究弱点所在的攻击者被认为是“跟随者”(anklebiters),他们令人烦扰但是对于警觉的安全管理员来说很少构成威胁。安全问题的主要来源分为以下几类:
环境的变化;
边界和语法的检查;
方便但是危险的设计特点;
脱离受控调用;
在较低层的旁路(bypass);
协议执行时的缺陷。
我们会概括出一些例子来说明这些观点。例子来源于公共信息。一些操作系统相对于其他操作系统来说会被着重陈述,但是并不能因此用来看作它们相对安全性的标志。
8.2 环境的变化变化是安全的最大敌人。你可能有一个提供很适当的安全的系统,当你改变其中的一部分时,你可能注意到这种改变的安全意义,但是还是出错了。更糟的是,你可能感觉这变化和安全无关,仅仅是引起了有点令人不快的意外。有很多关于奇数和偶数版本操作系统各自的安全故事,这些故事观测到了在包含新特色的操作系统(Operating System)版本和为这些新特色中的问题打过补丁的操作系统版本之间经常的相互变化。接下来的两个历史事件证明了变化的影响。
疯狂的黑客我们的第一个故事开始于1987,结束于1991年,那年,上诉法院根据1971年的犯罪损害法案(Regina v,Whteley)维持对一个计算机黑客的一审有罪判决。受到影响的操作系统是ICL的 VME/B。这是一系列的事件。
VME/B用文件描述符(file descriptor)的形式存储文件信息。所有文件描述符被用户:STD拥有。当文件描述符按照不同的安全级别分类的时候产生了问题。 因为此原因,:STD没有对保密的文件描述符进行访问的权限。结果是,这些描述符在正常的备份之后不能被重新恢复。解决方法很明显,创建一个新用户:STD/CLASS,此用户拥有保密的文件描述符。此程序(这种设施,This facility)被包括在一个系统的例行更新中。
用户:STD/CALSS除了拥有文件描述符外没有其他的目的。因此,任何人以:STD /CLASS登录是不希望的也是不必要的。VME/B的设计者为:STD/CLASS定义口令为回车(RETURN)键,这样,用:STD/CLASS登录就成为不可能的事情。没有人能够登录,因为回车会总是被解释为口令的定界符而不是口令的一部分。用户配置文件中口令的设置是通过插入16进制码来进行的。不幸的是,错误的域被改变了,于是产生了一个不可识别安全级别的用户,而不是不可能登录的用户。不可识别安全级别被解释为不受任何限制,于是,设计者得到了和他们的设计目标相反的结果。
此时还剩一道防线。用户:STD/CLASS仅仅能够从主控制台登录。然而,一旦主控制台关闭,打开了连接的下一台设备会被作为主控制台。
这些缺陷被一个管理着VME/B系统的黑客利用了。他有充足的机会对系统进行详细研究和实验。在夜间,当计算机中心无人的时候,他通过拨号入侵了很多大学的计算机,篡改、删除系统和用户的文件,并留下疯狂的黑客(Mad Hacker)的信息。他被成功地追踪到并被送上法庭,然后被审判有罪。
CTSS
我们的下个故事会追溯到更早的时代。这个故事说的是发生在CTSS上的一个安全缺陷,CTSS是早期的分时操作系统之一。这是本故事的开头[34]:
一个用户曾经发现口令文件是用‘message of the day’给出的。
发生了什么呢? 在CTSS中,每个用户都有自己的个人目录(home directory,主目录)。当一个用户调用编辑器的时候,在目录中就会创建一个临时文件。这个临时文件有个固定的名字-SCRATCH,这个名字和当前用户编辑的文件名是没有关系的。当一个用户一次仅能运行一个应用程序的时候,这个设计是合理的。没有人会在别人的用户目录中工作。因此,不需要向编辑器提供更多的临时文件。到目前为止,一切都很顺利。此外,系统被当作拥有自己目录的用户。在某一阶段,几个用户同时以系统管理员身份工作。看起来,同一时间允许多个系统管理员工作(访问系统目录)是很方便的。因此,系统实现了这个特点。现在,
1.一个系统管理员开始编辑今日消息(message of the day),SCARCH:=MESS.
2.第二个系统管理员开始编辑口令文件,SCARCH:=PWD.
3.第一个管理员保存编辑的文件,我们得到MESS:=SCRATCH=PWD.
(图8.1阐明了事件发生的序列)
译者注:今日消息(message of the day)是Unix系统在用户成功登录后给出的有关消息,如某些通知、事件、管理信息等。
欢迎
Scratch文件
口令
1,编辑信息
欢迎
Scratch文件
口令
2,编辑口令
欢迎
Scratch文件
口令
3,保存信息图8.1 在CTSS系统中共享临时文件
8.3边界和语法检查一个经常性的安全问题来源是:不检查参数长度或语法的命令。通过输入缓冲区溢出,一个有详细系统知识的攻击者能够改写保存安全相关数据的存储单元。
8.3.1 Finger漏洞
Unix中的finger 命令的安全声誉很差。在这里我们关心的不是此命令可以访问攻击者感兴趣的信息的能力,而是关注1988年因特网蠕虫(Internet Worm)利用的其中一个漏洞,此蠕虫入侵了运行在Unix 4BSD上的VAX系统。
这个fingerd守护进程是一个后台程序,用于响应远程finger请求。此进程利用gets库例程将输入放入一个缓冲区,而不检查输入数据的长度。缓冲区溢出会改写别的内存单元。如果你知道操作系统是如何分配内存的,你就可以控制被溢出影响的内存单元。在一个特定的攻击中,一个特别的536位的消息引起缓冲区溢出并且改写了系统堆栈,改变了主例程的栈帧。对此细节有兴趣的读者可以参考[146],那里给出了写堆栈的指令:
pushl $68732f ’/sh\0’
pushl $6e69622f ’/bin’
movl sp,r10
pushl $0
pushl $0
pushl r10
pushl $3
movl sp,ap
chmk $3b
栈被设置以便能返回主例程。命令
execve(“/bin/sh”,0,0)
会被执行。通过TCP打开一个远程shell的连接。如果库例程gets检查输入串的长度,就能阻止缓冲区溢出。顺便说一下,gets不是唯一的存在这个问题的Unix例程。
8.3.2 VMS 登录
DEC公司(Digital Equipment Corporation原美国数字设备公司-译者注)的VMS操作系统的一个版本在登录过程中有一个漏洞。当被要求提交用户名的时候,用户可以指名(indicate,指示,指出,表明)他们想访问的机器,键入
username/DEVICE = <machine>
参数machine的长度没有被检测。如果设备名太长,由登录引发的进程的特权码(掩模;掩码;屏蔽,mask)会被设备名改写,这样就给予了用户设置自己特权级别的能力。我们再一次有了一个有缺陷的软件工程的例子。这一次,采用适当的范围检查可以关闭安全漏洞。
rlogin漏洞
Unix命令login的格式是:
login[[-p][-h<host>][[-f]<user>]
选项 –f,强制”登录,用户不需要键入口令。rlogin命令允许用户登录远程的机器。此命令的格式如下
rlogin [-l<user>]<machine>
rlogin守护进程取出命令中的第一个参数并且将登录请求送往第二个参数说明的机器。一些版本的Linux和AIX不检查名字域的语法。以下请求:
rlogin –l –froot machine
会导致
login -froot machine
也就是说,对于指定机器进行特权用户root的强制登录。rlogin守护进程进行适当的语法检查可以防止这样的攻击。
8.3.4 一个java漏洞当一个java applet 请求运行一个类时,java系统通过将类名中的点替换为反斜线符号,从而将类名转换为一个文件名。例如,类 here.it.is对应文件here\it\is。Java系统会首先在本地磁盘上搜索此文件。如果搜索失败,java会尝试从提供此applet的Web服务器上取得。本地安装的支持浏览器的类被看作是可信任代码。Java不应该将这样一个类和从网络中取得的类混淆起来。
攻击可以按下述方式进行。第一,攻击者应该将恶意代码放入受害者的本地硬盘。可以实现这种行为的方法不止一种,一种显然的方法就是将恶意代码作为Web 文档下载,被浏览器存储在最近访问的Web页面的缓冲区中。(为了稍后能够取得恶意代码,攻击者应该知道这个缓冲区是如何组织的。)
第二步,必须愚弄用户把恶意的代码当作可信任的类来执行。光写一个要求受害者的浏览器运行类 here.it.is 的applet还不能完成这种诱骗。Java会在当前目录中寻找文件here\it\is,此时它还不会被当作可信任的代码。攻击者必须创建一个可以转换成始于根目录的目录路径的文件的类名,例如:\here\it\is。Java注意到这种危险,因此不允许类名以点号开头。可以转换成\here\it\is的.here.it.is类名被认为是非法的类名。不幸的是,规则不捕捉反斜线符号开头的文件名,因此类\here.it.is被作为可信代码而执行。
这个问题存在于较早期的java版本中并且被很容易地修正了。以文件分隔符开头的所有类名都被禁止了。更多关于java和这个漏洞的信息见[95].
8.4 方便的特性是漏洞还是特性? 这可能是在计算机安全方面最常问到的问题之一。与以前(遗产(传统),legacy)系统的向后兼容性、易安装性、易使用性等,都是在你的系统中添加特性的很好理由,这样你不会想从安全的角度看待你的系统。只要你理解这些特性,并且知道当不需要这些特性时如何关闭它们,就不存在什么问题。不幸的是,情况并不总是这样,攻击者通过这些特性而不是安全漏洞使系统门户大开。
当Unix的sendmail程序成为互联网蠕虫[146]攻击目标之一的时候,该程序就极好地说明了这个问题。系统管理员设置mail系统的时候,他必须确定消息抵达指定的目的地。因而,如果在一个网络节点上的邮件设置能被远程地检查和修改,不需要系统管理员登录这个节点,那么就会很方便。此sendmail程序通过设置一个debug 选项满足了这种需要。当这个选项在目的地被打开,邮件消息中的用户名可以被一组命令替换,这样sendmail就会在目的系统上执行这组命令。显然,攻击者就有了机会。
控制调用从第5章介绍控制调用以来,我们已经强调了这样的程序中的一个错误能严重破坏安全。我们现在给出更多证据来证明我们的断言。
8.5.1 VMS用户认证功能
DEC公司的VAX/VMS操作系统将用户的访问控制信息存储在一个认证文件中。调用UAF程序可以改变文件内容。VMS系统的一个版本有以下漏洞:UAF程序必须检查是否用户有权执行UAF。
Caller:Request Set Authorization File (parameters)
System,Open Authorization File;
Read Caller’s Authorization;
If authorized then return (true)
Else return (false)
攻击者忽略返回代码并且修改尚未被系统关闭的认证文件。这个问题是一个发生在非常敏感位置的编程错误。
8.5.2 一个登录的潜在问题显示登录窗口的Unix程序具有根权限。当一个用户登录时,登录程序通过把当前的根目录切换到用户的根目录为用户设置环境。它读用户的.cshrc 和.login文件并执行包含在其中的命令。如果此时登录程序仍然是根权限,那么用户可以把.cshrc 和.login文件当作特洛伊木马,在其中插入以根权限执行的命令。因此,在执行任何能被用户定义的命令之前,登录进程的UID要设置为用户的UID。这一点非常重要!
8.6 旁路逻辑访问控制验证用户和进程对逻辑系统对象的访问。如果一个攻击者在逻辑访问控制“下面”插入代码,他就能绕开控制;或者攻击者直接访问内存,逻辑访问控制也就不起作用了。
8.6.1 AS/400 机器接口模板
AS/400(400应用系统) 是IBM的一种中型计算机操作系统。它流行于金融部门,并被认为是较为安全的面向对象的操作系统。AS/400的安全级别可以通过QSECURITY系统值来确定。QSECURITY的值有10,20,30,40,50。
系统安全等级10:不安全;是AS/400出厂时的默认值。
系统安全等级20:口令保护但无对象安全性;只要用户成功登录,就无更多控制。
系统安全等级30:口令保护且有对象安全性;类似自主访问控制策略保护对对象的访问。
系统安全等级40:在机器接口模板的使用上加了控制器(见下文)。
系统安全等级50:支持(但不保证)C2级安全要求。
关于AS/400的技术讨论和详细信息以及对管理操作系统安全性的综合观点参考[122]。
作为机器接口模板被写入AS/400的机器语言程序不受操作系统安全控制器的控制。机器接口模板原先被富有经验的AS/400程序员用来提高软件的性能。但是,这种技术还可以用来修改(OVERWRITE) 对象以改变安全设置。
IBM首先尝试通过删除提供给机器接口的指令和使用探测机器接口模板内此种指令的句法检验器来禁止这种修改。这种语法检验器要参考一张合法命令表。一旦软件编写者发现语法检验是怎样执行的,它们就用包含所有原始命令的表取代IBM命令表。作为保护操作系统完整性的下一步骤,AS/400把用户状态与系统状态分离并且将用户域与系统域分离。存在于用户域的系统状态程序允许用户访问被保护的软件,比如一个数据库管理系统。当处于安全等级40时,这些加入的保护机制将被激活。然而,安全等级30仍然是允许软件运行的标准配置。
8.6.2 at漏洞
Unix命令at<time> -f<file>允许用户推迟执行指令。它把被要求的文件放入假脱机目录/usr/spool/atjobs下,以便在指定时间再执行。当把程序放入假脱机目录时,at程序不检查文件对用户是否可读。但是,假脱机目录中的文件可以被执行at的用户读出。这样,攻击者可通过输入
at<time> -f/etc/shadow
来获得对影子口令文件shadow的访问,并且在作业执行之前将它从假脱机目录中删除,使可疑登录信息无法生成。这个攻击可以通过设置/usr/spool/atjobs不可读来防止。
8.6.3 Sidewinder
SidewinderTM是构建在Unix系统上的防火墙。Sidewinder已经被放到互联网上进行测试并挑战了黑客们突破防火墙进入系统的企图。这个测试的描述和关于Sidewinder的更多内容已在CIPHER[153]中公布。
在Unix系统中,超级用户享有几乎无所不能的特权。如果黑客可以获得超级用户权限,所有的防御设施都已被破坏。为了限制安全被突破的影响,Sidewinder将系统对象和用户进程放入不同的域中。域之间的分割是通过类型强制执行实现的。每一个域只能访问有限的文件类型和操作系统调用。因为每个域都有自己的管理员,所以没有超级用户。通过两种不同的操作系统的内核(kernel),攻击者修改防火墙系统的机会被进一步限制。当Sidewinder在它的Unix的操作内核中运行时,类型强制执行就激活了。当Sidewinder与管理内核一起被引导时,网络连接被禁止。
只看到这样一种严重的黑客攻击企图,黑客通过欺骗配置不当的邮件传输程序创建一个SUID超级用户二进制位来获取超级用户权限。尽管作为超级用户运行,系统还是探测到黑客的进一步行动并最终终止会话。黑客通过第一次的漏洞返回,然后使用mknod命令建立一个指向现存磁盘设备的新设备。作为新设备的所有者,黑客拥有设备读出和写入的权限并且可以读写设备上的任意文件而不管Unix或类型强制策略。
攻击不会进一步进行,下一阶段需要工具从原始存储内容重建逻辑文件结构。攻击者必须知道改变哪些文件会损害类型强制策略。这种攻击可以通过从黑客可达的范围内删除mknod,比如将mknod系统调用放入非许可的目录中来预防。
8.6.4 攻击智能卡(smart card)
智能卡是带有嵌入式集成电路芯片(IC)的塑料卡。智能卡在移动用户实现传送数据的事务处理时功用很大,很有吸引力。典型例子为:
从自动柜员机中提取现金;
用户需要支付话费的移动通信系统;
乘客需要支付旅费的公共交通工具。
在以上三个范例中,用户身份认证是基本的。智能卡可以存储敏感数据和执行加密算法,因此非常有用,不仅因为卡的持有者对卡拥有物理的控制。
不难想象,黑客也可以拥有对智能卡的物理接触。任何对智能卡有物理接触的人都可以不通过逻辑输入输出渠道观测并操纵它[3]。所以智能卡的安全分析必须考虑黑客如何:
能观测并操纵对集成电路的电力供应;
能操纵时钟信号;
能观测计算次数;
能观测并操纵信号及集成电路的物理结构。
黑客可以通过监视电源消耗或计算次数来猜测智能卡上的密钥。这样的攻击轻而易举并且是可行的,就像众所周知的对RSA 智能卡处理器的计时攻击一样,例子可见[47]。作为一种防御,要使用一种编程风格,保证密钥相关性(key dependencies)不在加密算法的执行中反映出来。
意外的或蓄意的电源或集成电路时钟的变化会引起卡上的处理器进入程序员无法预料的状态。黑客就可能指望感兴趣的数据(比如密钥)会因错误而输出。这再一次地是一个很容易实现的攻击。显而易见的防御手段是对电源供应和时钟的过滤器,让两种信号在可接受的范围内变化。集成电路可以通过自动复位或简单地设置标志通知使用智能卡的应用程序,来对这种变化作出反应。集成电路制造商必须声明这些要点以确保他们装置的可靠性。
因上述类型的操作或由其他因素比如辐射而导致的瞬时故障,会使加密函数返回一个错误的值。最近关于差分故障分析(differential fault analysis)的研究论文表明:对于相同的输入,从正确的和错误的执行结果中计算密钥是可能的。这再一次地是一种容易的攻击,可以通过在计算结果出来前对集成电路中进行额外检测使它变得困难。从更昂贵的角度来说,可以使用激光操作集成电路,也可用电子显微镜来观测运算和存储数值,或重新设计一种运用于集成电路上的秘密算法。认为那些攻击是可以被完全制止的想法是错误的,但是设计和制作过程的特殊性使这种攻击变得太昂贵,因而很难具有商业可行性。
8.7 有缺陷的协议的执行安全协议的抽象描述中充满了无关痛痒的诸如“任选一个随机数”这样的句子。这其中的复杂性只有当你坐下来写一篇协议实现文章时才显现出来。有时,设计者在知道安全缺陷时会挑容易的选择。有时,他们则没有立即发现问题。
8.7.1 TCP认证我们的第一个例子是在TCP开放序列中使用的三次握手协议。在我们的安全分析中,我们假定消息总能传递到预期接收者那儿而且在传输中不会被泄露。黑客唯一能采取的行动就是将假的发送人地址包含在自己的消息中。客户端A要与服务器B进行一次会话,A发出以下消息:
A→B:SYN,ISSa,
这个数据包由SYN(同步序列号,Synchronize sequence number)位来设置并包含一个32bit的初始序列号ISSa。B用下列消息回复
B→A:ISSb,ACK(ISSa).
发出自己的初始序列号ISSb,并且对A的序列号表示确认。ISSa的实际数值必须在这个消息中出现。客户A发出
A→B:ACK(ISSb)
来结束此次同步信息交换。
只要初始序列号适度随机,协议就是安全的。因此,RFC793要求32位的计算器在大约每隔4微秒最低位加1。但是,Berkeley-derived内核使其每秒增长128,而每一新的连接则增长64。对付黑客它没有多少随机性。
这种由执行决策而产生的攻击可能性,Robert Morris已在1985年[105]阐述过,其后Steve Bellovin进行了归纳[14]。攻击者C首先打开一个真正与其目标B的连接,并接收到序列编号ISSb。攻击者然后假扮A,在发送者区域发出带有A的地址的数据包,
C(A) →B:SYN,ISSc.。
B以
B→A:SYN,ISSb’,ACK(ISSc)
回复给合法的A。C看不见此消息但是猜出ISSb’的值并发出
C(A) →B:ACK(ISSb’).。
如果像通常那样,猜测是正确的,B就认为它已经和A连接上了,而实际上是C发的数据包。C不知道这次会话的输出,但是它以A的权限在服务器B上执行命令。
B是怎样验证客户端A的用户身份和权限的呢?如果用户必须以口令登录,攻击者就不能攻击。但是,如果服务器把一部机器当作可信主机并不对其进一步的消息进行检查,攻击就可以成功。在Unix中,可信主机是在文件.rhosts里列出的。例如像rsh那样使用以地址为依据的确认方式的协议,假定从可信主机来的用户就已经被确认过了。攻击者可以通过使用可信主机的IP地址运行这样的协议。
最后一个难题是客户A。如果A收到B的消息,它会认识到B确认收到A从未发出的东西并回复以RST数据包来中断连接。为了不让A干涉攻击,C可以等到A下机或使用一个TCP SYN泛洪攻击,让同步请求塞满A的缓冲区从而使A忽略从B来的信息。
对付这种攻击,你可以利用防火墙将所有的用本地的发送人地址发送的TCP数据包阻止在外。如果你的所有可信主机都在本地网络上,这种方法有效。如果可信主机也在外部,防火墙必须阻止所有使用TCP和基于地址认证的协议。完全消除基于地址的认证将更有效。因为攻击的危害相当大。密码认证更妥善(preferable,优越的(更可取的,较好的))。
8.7.2 Java的DNS漏洞
Java的安全策略限制applets程序的活动范围。一个applet程序只能到达它所运行机器上的限定区域,而且在其他能到达的机器上的范围也是有限的。第二个限制则包含在以下规则中[95]。
一个applet程序不能打开网络连接,除非重返它所来的服务器。
Java如何检测两个网络服务器是否相同呢?它用域名系统(DNS)把网络名称转化为IP地址。一个网络名允许对应于一个以上的IP地址。现在,当一个applet程序打开了连接,Java系统则会:
将网络服务器名转换为一张IP地址列表;
将applet程序想连接的机器名转换为一张IP地址列表;
如这两张列表有一个共同的表项则允许连接。
这种策略有一个问题。每一个Internet网域的所有者负责将其域中的网络名转化为IP地址,无法阻止恶意的所有者将其他域中的IP地址放入到转换序列里。Attacker.org域的恶意的所有者,即攻击者,现在能以他人名义实施攻击。
在我们给出的示范这样一种攻击的例子中,目标IP地址是88.8.8.8,attacher.org域的Web服务器的IP地址为13.13.13.3。攻击者创建一个网页,含有恶意applet,要求连回攻击者所在域中名为call.attacker.org的DNS。然后攻击者等待以下结果(图8.2)。
不知情的第三方查看攻击者的网页并从网络服务器(IP地址13.13.13.3)上下载恶意applet程序。
当该applet请求和call.attacker.org连接时,攻击者的DNS服务器被要求转换DNS名call.attacker.org。
攻击者返回序列(88.8.8.8,13.13.13.3),也就是受害者的IP地址和攻击者的网络服务器的IP地址。
因为applet程序所来的网络服务器的IP地址在序列中,Java允许applet程序打开同序列中的第一个IP地址的连接,也就是同受害者的IP地址88.8.8.8的连接。
在受害者机器上的applet程序的任何恶意行为都将被归罪为不知情的第三方。这个问题已经通过改变检查例行程序而稳定(fix,纠错,修改)。现在浏览器存储网络Web服务器的IP地址并仅允许同这个地址的连接。
4,连接
目标
1,下载
2,call.attacker.org?
3,88.8.8.8
13.13.13.13
不知情的第三方 attacker.org
图8.2 Java DNS 故障
8.8 病毒攻击计算机病毒已经吸引了大众的想象力,不仅仅因为它是计算机安全中不多的能产生直接和可视效果的领域之一,在报纸的恐怖故事、电影(如独立日)和电视节目中病毒也被广泛描绘。对于一个外行人来说,计算机病毒可能是计算机安全的最大威胁。其他专家会认为尽管计算机病毒是一个实在的危害,但只是众多问题的一个方面而已,它们的危害被夸大了。
我们首先对“个人计算机和安全”这个主题作一个总览,以此作为我们调查的开始。当个人计算机第一次进入市场的时候,PC的操作系统如MS-DOS是面向单用户的,也就是说单个用户控制整个机器。
没有用于分离用户的安全机制;
没有用于从系统中分离用户的安全机制;
没有用于阻止对系统或用户文件有目的地修改的安全机制。
考虑到个人计算机的用途,这些机制倒并不需要,所以你不必抱怨设计者忽略了不需要的特性。然而,个人计算机的广泛使用激起了一个围绕个人计算机的新产业。如下所示:
商业软件产品,如电子表格软件和字处理软件;
计算机游戏;
个人计算机的分享使用,几个雇员使用同一台机器,或者组织团体把他们的个人计算机到连接局域网上。
目前,软件用软盘交换,工作用的和私人用的软件运行在同一台PC上,公司的资源(信息)转移进PC,PC不再被一个中央的IT部门控制,而是被个人控制。威胁情形因此改变了,缺乏安全机制和安全知识成为很致命的事情。
8.8.1 病毒分类病毒研究者付出相当大的努力来开发描述、命名和分类计算机病毒的机制,并且定义出区别计算机病毒和别的恶意软件的不同特点。CARO协定被广泛使用于命名和描述计算机病毒。在这里我们会尽量做到简洁,避免被某些更细致复杂的分类所困扰。
特洛伊木马:是一个含有隐匿副作用的程序,其副作用在程序说明文档中没有说明,也不是执行该程序的用户所期待的。
计算机病毒:以净荷(payload)形式附在别的代码上的一段具有自我复制功能的代码。有些是无害的,可以看作不存在,譬如只是显示一则消息或者播放一个曲调。有些则是有害的,譬如删除和修改文件。
计算机病毒:通过将自身的代码插入到别的程序代码中,以此传染别的程序短暂病毒:仅当被它传染的程序运行的时候才活动的病毒驻留病毒:当被它传染的程序运行的时候,将自身安置在内存中。一个驻留病毒(TSR,Terminate-Stay-Resident)在被其附着的程序关闭之后,仍然可以将自身转附于其他正在执行的程序上,保持活性。
逻辑炸弹:当特殊的激发条件满足时才会执行的程序。
蠕虫:具有自我复制功能,但不具有传染功能的程序在下面的病毒分类中,我们会着重于被利用的安全弱点的总体特性。你会注意到成功的攻击常常结合了几种方法。
8.8.2 PC 启动过程
计算机病毒利用操作系统中对非授权修改没有保护之处作为明显的攻击点。为了理解脆弱性的范围,我们有必要简短回顾IBM PC的启动(又称引导)过程。我们的兴趣着重于此过程的总的结构,不看重太具体的技术细节,如扇区的大小和只读存储器(ROM)或软盘中的存储地址等等。
启动一台PC(一台普通计算机),我们指的是打开一台机器(也就是说,让机器成为正常的工作状态)必须执行的步骤。开始的时候,除了只读存储器,别的存储器在电源关闭后会丢失所有内容。当一台PC被重启的时候,记住,由于物理效应,存储内容不会立即丢失。因此,你必须在关闭电源后等30秒然后再开始引导[49]。
因此只能在只读存储器和辅助的非易失存储设备(软盘或者硬盘)上存储操作系统。由于只读存储器容量很小不能存放整个操作系统,IBM PC机上的引导信息(加载操作系统)以层次结构的方式安排。如图8.3所示:
图8.3:典型的PC启动顺序
只读存储器:包含一个初始化的例程,用来查找辅助存储设备上的主引导扇区。
主引导扇区:位于标准的位置。在软盘上是0面1道0扇区;包含一些可执行代码和分区表(用来将盘划分为分区并标明哪些分区是引导分区)。在引导过程中,引导分区被按照次序搜索。主引导扇区也在辅助存储设备上查找DOS引导扇区。
DOS引导扇区:包含可执行代码和文件分配表(FAT):文件分配表记录了文件的存放位置。每个文件都有一个簇链表(一组记录);物理上已经损坏的簇在文件分配表中被标记为坏扇区。
引导顺序为:
装入IO.SYS(或IBMBIO.COM)程序,包含BIOS(基本输入输出程序));装入SYSINIT程序;
SYSINIT装入MSDOS.SYS(或IBMDOS.COM);
将控制交给DOS(磁盘操作系统),DOS参考AUTOEXEC.BAT文件运行命令解释器(通常都是COMMAND.COM)。COMMAND.COM响应用户的输入。
PC现在已经准备好了,可以接受用户的输入了,并可以执行应用程序,等等。
8.8.3 自引导病毒(bootstrap virus)
病毒首要的攻击点是操作系统自身。正如我们所知,PC中操作系统只有一小部分被保存在只读存储器中并自动受到完整性保护。剩下的部分存储在一个可被感染的存储介质上,可以被篡改用于进一步的攻击。
在PC的引导过程中,插入恶意代码的机会相当多。自引导病毒存储在引导扇区里(图8.4)。由于它在DOS完全运行之前就被激活,它能够只使用BIOS函数并且是根据特定的机器架构来写的。在不同的机器上,它也许不会像预计的那样工作,但是很可能让计算机崩溃。
stoned 病毒(也称作新西兰病毒)将主引导扇区的内容拷贝到盘的特定位置,并将病毒代码插入到原来主引导扇区中。当PC引导的时候,病毒在正常的服务启用之前执行了。Brain病毒在DOS引导扇区中重复这一技巧。它寻找空簇来存放原始DOS引导扇区的内容,然后在DOS引导扇区中放入病毒代码和指向原来DOS引导扇区内容的指针。如前所述,当PC启动的时候,病毒在正常的服务启用之前运行了。病毒可以在文件分配表中将它使用的扇区标记为坏扇区,从而隐蔽自己。
病毒也可以将自身插入到引导过程稍后的阶段。如”proof of concept”类的病毒存在于IO.SYS中(如Pacman 病毒)、COMMAND.COM中(如Lehigh病毒)和AUTOEXEC.BAT中。存在于引导扇区中的病毒很常见,后一种病毒相对少见。
自引导病毒通过被感染的存储媒介进入系统(软盘)。使用一个干净的盘启动是有效的避免自引导病毒的方法。然而,如果引导扇区的某一部分被保存在静态的随机存储器(RAM)上,那么引导病毒就能够驻留在那里,从一张干净盘上启动就不一定能保证成功了。
感染前
感染后
图8.4,引导扇区病毒的感染模型
8.8.4 寄生病毒(parasitic virus)
病毒的第二个攻击点是用户程序。寄生病毒附在一个可执行程序中,譬如一个.COM或.EXE文件,并且此病毒能感染其他程序。寄生病毒通常把自身附加在受感染的程序中,并在程序的开头插入一个跳转到病毒代码位置的命令。在病毒代码执行完毕后,再跳回程序的开头(图8.5)。Vienna病毒的变种就是这样感染.COM文件的,它保存原来程序的三个字节,并将它们替换为一个跳转到病毒代码开始位置的命令。当程序执行时,首先跳转到病毒代码的开头,然后病毒被执行,接着宿主的原始三个字节被恢复,继续跳回程序的开头执行。
较复杂的病毒可以分解为更小的程序块隐藏在受感染的程序中间。当被传染的程序执行时,首先执行的是病毒代码,然后被感染的程序正常执行,这样病毒产生的效果就不会被立即观察到。在一个没有完整性控制的操作系统中,对病毒可以感染的程序是没有任何限制的。在一个控制性较强的系统中,病毒只能感染属于执行病毒感染程序的用户的文件,或者是这些文件的一个更小的子集。
图8.5,一个寄生病毒的典型的感染模型
8.8.5 伴生病毒(companion virus)
DOS中的文件名的形式为name.extension(名字+扩展)。典型的扩展名为.DIR、.COM、.EXE等。为了方便,用户不需要指明他们想要执行的程序的全名,可以忽略扩展名。如果用户按照这种方式调用程序,DOS首先寻找扩展名为.COM的同名文件。然后寻找扩展名为.EXE的同名文件,最后才寻找扩展名为.BAT的同名文件。伴生病毒利用了这种搜索路径。如果原始的程序是.EXE文件,那么可以创建一个扩展名为.COM的同名文件,其中包含病毒。那么执行的就是这个感染了病毒的文件。AIDS 2病毒就是使用这种技术。
缺省的搜索路径很方便但是很危险。Unix中相同的攻击类型也是有可能的,方法是建立一个和期望感染的目标相同名字的已感染文件,根据PATH环境变量的设置,将此文件放置在先于目标文件目录搜索的目录中。
8.8.6 宏病毒(macro viruses)
将自身加入引导过程中的病毒是用机器语言写的,所有早期病毒都是在此级别上运作的。但是,这并不是说每个病毒都必须用机器语言来写。早在1989年,Harold Highland就提出构造一个宏病毒的可能性。它可以附着在电子数据表格软件的工作单和数据文件里面。宏病毒特别让人感兴趣,它是毁灭性的。
病毒附着于数据文件中。因此,它绕开了对一般的可执行目标(操作系统,程序)进行的完整性保护机制。
病毒用高级语言写成。因此,它比用机器语言写的病毒具有更高的平台独立性。
文本文档通过电子邮件广泛地交换。对于病毒来说,这是一个极好的传播媒介。
宏病毒在1995年变成现实。微软的字处理系统,MS-Word,允许用户定制他们的文档显示环境信息。格式信息、功能键和图标的定义都包括在一个与文本文档相伴的宏文件中。当文本文档被打开,宏中的指令即被MS-Word执行。当创建一个新的文档的时候,文件NORMAL.DOT被用作这个文档的宏模板。
一个宏可以仅仅看作一个数据文件的附件。其实它是一段可执行代码。然而,使用者打开一个文件的时候根本没有意识到自己在运行一个程序。所有可以用来编写宏的指令都可以被病毒编制者用来将病毒代码隐藏在宏文件中。概念宏病毒就是如此,它感染.DOC 和.DOT文件。一旦NORMAL.DOT被传染,每个新创建的.DOC文件会自动被传染。
在灵活性和完整性之间存在折衷。如果将整个操作系统放入只读存储器,非授权的修改当然不可能,但是授权的更新,打补丁等也不可能了。
程序文件和数据文件的严格分离是在一个环境中(此环境中程序没有变化)维持完整性的极佳基础。一个字处理系统是这样一个程序的良好的例子。
数据文件可以改变但是其中不包含可执行代码,因此它们不能毁坏系统。
程序文件包含可执行代码,但是不需要改变。所有程序的完整性检查值可经计算后得到并存在只读存储器中,任何程序在执行前要经过检查。
引入宏是为了向用户提供更灵活的字处理系统。与此同时,宏也使得数据文件和可执行文件的区别模糊了。由此就引出了新的安全问题。
我们又回到了本章的开头。系统的变化引出了新的安全弱点(open up a new vulnerability(脆弱性,易损性(弱点,致命性)))。
8.8.7 中断的重定向病毒在特权模式下执行具有更大的毁坏性。为了进入微处理器的特权模式,必须要产生一个中断(陷阱中断)。操作系统然后从中断表中查找中断处理程序的地址。中断表,还有任何相似的结构,因此成为了攻击的主要目标。通过改变中断程序的地址,操作系统被重定向去执行病毒。病毒让自己驻留在内存中(作为一个TSR(terminate-and-stay-resident ) program),当相应的中断发生的时候,病毒就会被执行。
这种攻击非常有效,因为它不改变原始中断处理程序,检查此中断处理程序的完整性控制机制不会发现它。相似的攻击也可能通过修改文件分配表的表项来实现。文件分配表的表项被修改指向病毒,病毒代码中再包含一个指向原来文件的链接。
删除这样类型的病毒可能会引起更大的损害。因为此病毒是文件分配表和所指文件的地址链接的一部分。如果病毒被删除,链接就被破坏,文件也就无法找到,至少,通过操作系统是找不到了。
8.8.8 伪装病毒可以通过各种方法来伪装自己。它可以压缩被感染的程序,这样就不会增加被感染程序占用的存储。 Stealth 病毒隐藏在一个在文件分配表中被标记为坏的扇区中。因此,别的程序通常在读盘的时候会跳过这个扇区。病毒可以截获能够检测出它的存在的中断,譬如:试图去读已被感染文件的长度、日期和校验和的中断,病毒然后返回初始值。多态病毒将自身加密,在每一次新的感染的时候都使用一个新的密钥,这样就避免了被模式识别检测工具发现。多裂变(multi-partite(分裂的; 分成若干部分的(常用于复合词中)))病毒结合了几种不同的感染方式,这样就使检测更加困难。缓慢感染病毒控制感染率,这样可以避免感染被立刻检测到。
8.9 反病毒软件缺乏完整性控制的系统容易被计算机病毒所利用。为了保护你自己,你应该向系统中加入这些控制手段。一些可用的保护机制是专门针对病毒的,不过它们的大多数解决完整性问题是一般性的。一个防御战略应该包括以下部分:
预防:在病毒感染系统之前制止病毒。
检测:在病毒感染系统之后查出病毒。
反应(reaction):使被感染的系统恢复到非感染状态。
良好的行政管理和用户的防范意识是成功保护系统免受病毒之害的基础。
8.9.1 物理的和行政的控制物理的和行政的控制是防止病毒侵入你的系统的极佳途径。其中一些方法是出奇的简单。如果你不想让病毒写到你的软盘上去,只要把写保护打开,就没有任何病毒能够感染这张软盘了。如果操作系统提供访问控制,你就正确地使用它,如说,把网络服务器上所有应用程序的文件许可权限设定为只能读和执行。
在病毒有可能入侵你系统的部分做好控制。在安装了反病毒软件的检疫机器上测试新软件。使用特权尽可能少的帐户来做测试工作,比如用访客Guest帐户。最好使用网关机器运行病毒扫描程序,对所有进入系统的软盘进行检查。如果软盘是干净的,就给软盘一个标签,证明这张软盘可以在系统内部使用流通。如果标签是贴在软盘上的,那就需要使用者有意识的检查出系统中没有被授权的软盘。如果是一个写在盘上的电子标签,系统内部的机器就能够检查软盘的状况并拒绝使用非授权软盘。如今,防火墙产品通常都装配了病毒扫描程序以查找通过网络入侵的病毒。
坚持有规律的病毒检测,并对你的防毒产品随时更新。防病毒软件可以包括在每一个用户的登录脚本中,系统就能够自动地在预先设定好的时间内进行检查。比如,Unix 系统管理员可以告诉CRON例程何时运行完整性检查程序。不要依赖于某一种保护机制,而要几种方法结合起来使用。
偶然的计划应该针对于探索如何对病毒事件作出反应。我们常常说,对一个病毒攻击的不适当反应,可能比病毒本身造成更大的破坏。显然,在病毒攻击后恢复系统时,未被感染的备份文件是必需的。但是,通常都是这样的,当病毒被检测出来的时候,病毒也早已经找到了感染所有的备份文件之路了。
8.9.2加密的校验和加密的校验和是一种标准的完整性保护技术。校验和从需要保护的干净文件版本中计算出来,然后保存在一个安全的地方,理想的应该是在只读存储器里,比方说光盘里。每一次要使用这个文件时,就计算当前版本的校验和,与先前存储的校验和比较。这样,对原始文档的任何改变都可以被检测到。显然,校验和程序不需要知道病毒并检测它的存在。
无论何时,当需要重新计算校验和时,校验和程序也是易受攻击的,例如,文件改变了或者干净的校验和丢失了。因此,它们更适合使用在这样的环境中,这里仅使用固定的一组软件工具,而不是开发自己的软件系统的机构中。并且,校验和程序也不能指出是什么病毒引起了感染,即使检查出了感染,也很难决定应该采取的进一步行动。
当安全系统知道所要保护的对象是什么样子时,就不需要知道攻击者是何模样了。因为,它可以检测被保护对象发生的变化。
8.9.3 扫描器扫描程序可以通过搜索带有特殊模式(病毒特征)的文件从而确认已知计算机病毒的存在。毫无疑问,它们必须知道病毒特征,从而去检测病毒,因此需要不断更新病毒知识。 扫描器仍旧是最流行的反病毒软件。使用扫描器不需要任何准备,而校验和方法必须在校验和已经计算出来后才能生效。并且扫描器可以告诉用户发现了什么病毒,从而让用户能够采取正确的行动。
从缺点方面来说,扫描器需要快速搜索技术才能有效率。因此,它可能只检测文件的开始和结束部分,这样的话,多裂变病毒就很容易通过网络逃脱。传统上,查毒时扫描器会检查内存中所有的文件。而访问扫描器 (on-access scanner)只在对文件有访问请求时才检测文件。
扫描器必须面对日新月异,层出不穷的新病毒。变异引擎(MUTATION ENGINES)使病毒自动更新换代。多形态病毒(POLYMORPHIC VIRUSES)可以击败模式识别技术,因为它们可以不断变换病毒外表,一个病毒链呈现出多种模式,简单的病毒模式搜索的扫描器对此无能为力。宏病毒(MACRO VIRUS)也给扫描器制造它们的麻烦,因为它们是由高级语言写成,因此串匹配并不是非常适合用来鉴定非法编码的。
由其天性所决定,串匹配方法采用代码的句法特性来检测恶意软件,并且只在这种保护确实需要时才这样做。因此,高级的扫描器正朝向行为的模式识别发展,即语义特性,取代位串模式识别。
最后,还有一个假阳性(false positive)的问题。一个文件有可能含有类似的病毒特征,扫描器就会发出一个错误的警报。扫描器所用的病毒库越大,这个问题就越容易发生。
当安全系统不知道所要保护的对象是什么样子的时候,因为对象可能被合法地改变,就必需要知道攻击者是什么样子,或者他们的行为会怎样。只有这样,它才可以检测到攻击者的存在进一步的阅读参考文献[85]给出了计算机程序安全漏洞的分类,也可以在以下网站获得:
http://www.itd.nrl.navy.mil/ITD/5540/main_fra.html
安全漏洞的电子邮件列表Bugtraq可在下列网站得到:
http://www.netspace.org/lsv-archive/bugtraq.html
参考文献[142]分析了Intel80x86处理器的安全问题。
许多关于计算机病毒的书仅仅给出病毒的不同变种的列表。为此,文献[8]和[49]是显然不同,给出了相当详细的技术细节。
如果你对真实攻击背后的故事感兴趣,可以看看[148,140,43]。这是为一般读者写的,有许多攻击的事实。关于因特网蠕虫(Internet Worm)的材料可以在1989年6月的ACM通信(32卷,第6期)和文献[44]中找到。[22]给出了关于宏病毒的详细讨论。关于Java漏洞,可以读文献[55]。你可以通过CERT的公告或者订阅各种专门的新闻组学到各种新的攻击。
练习题练习8.1 许多缓冲区溢出问题都是由字符串操作引起的,这些操作包括接受任意长的输入,通过寻找特殊的null符号来检查一个字符串的结束。用这个null符号来设计一个系统,能够检查出一个字符串操作已经覆盖了存储在栈中的返回地址。
练习8.2 安全引导是一个非常重要的安全机制。做一个调查,看看有多少商品提供了安全引导。你怎样实现这样的机制?
练习8.3 Bell-LaPadula模型的强制与自主安全策略可以预防或减轻病毒感染吗?
练习8.4 在何种情况下,病毒能够感染被写保护的文件?
练习8.5 讨论一下校验和和扫描器在检测病毒方面的优缺点。
练习8.6 宏病毒带来了计算机病毒的新威胁,反病毒软件应如何面对这个挑战?
练习8.7 软件能够通过加密可执行文件来加以保护。当一个程序被调用的时候,可执行文件被解密和执行。考虑以下三种存储必需的加密密钥方法的可能性:
■ 密钥被隐藏在机器中的某个地方(草中藏针法)。
■ 密钥被存储在一个由用户保管的令牌中,比如智能卡。
■ 密钥被存储在一个能够防止篡改的设备中,该设备能够解码和执行命令。
比较这三种方法的安全性。一个攻击者怎样才能绕过这些控制?这些控制能够在多大程度上抵抗计算机病毒的侵袭?
练习8.8 为你工作的地方写一个简要的有关计算机滥用的立法和使用的规章制度。
第9章 安全评估
安全系统的用户需要某种对于他们正在使用的产品能提供足够安全性的保证。他们可能:
依赖制造商/服务提供商的保证;
自行测试安全系统本身;或者依靠独立机构(评估机构)的公正评价。
若采用第2种方法,用户必须是安全领域的专家。但是大多数的用户并不是安全领域的专家。因此某种安全评估是信任安全产品所能作的唯一选择。本章将要探究安全评估和讨论目前的评估方案是否可以使我们获益。
本章内容认识任何一组评估标准必须解决的基本问题为比较评估标准提出标尺给出主要评估标准的概况了解一些评估产品和系统的优点
9.1 引言可信任计算机安全评估标准(TCSEC,橙皮书)[112]是第一个获得广泛认可的安全评估标准。安全系统的厂商现在仍然喜欢引用橙皮书的等级来评估他们的产品。许多其他的标准已经被开发出来,一方面对橙皮书作改进,另一方面统一已有的其他标准。新的评估标准通常都感到有责任说明橙皮书所提出的标准是如何适合他们自己的框架。这方面的重要文档有:
信息技术安全评估标准(ITSEC)[117]
加拿大可信任计算机产品评估标准[150]
信息技术安全联邦标准[115]
信息技术安全评估通用标准[26]
我们将通过提出下列问题来构造我们对评估标准的讨论。
评估目标是什么?
评估标准一方面是(refer to,涉及,参考,查阅,向...打听[查询],认为与...有关,认为...起源于...)针对具体的产品,例如一个操作系统,它将被应用在各种领域且需要满足一般的安全要求;另一方面是针对系统,即满足指定应用要求的各种产品的集合体。在第一种情况下,我们必须找到一个可接受的一般需求集。橙皮书的安全分类和联邦标准、通用标准的保护简档[表](protection profiles)都是为了尽量达到上面要求。在第二种情况下,需求获取和分析已经成了每个独立评估的一部分。ITSEC就适合对系统进行评估。
产品和系统间的区别突出了安全评估在基本方面上处于进退两难的局面:用户不是安全专家但又有一定的具体安全要求。依据通用标准对已出售(off the shelf)产品的评估抓住了典型的需求,对非专家来说是个非常有用的决策标准,但是产品可能不会满足实际的安全需求。对专用系统的评估会涉及到我们感知到的需求,但是我们要使非专家用户确信我们已经正确获得了安全需求。在这一阶段如果能提供更进一步的帮助,我们才能开始跨过这一界线,即一般公共目的的安全评估和指导特定用户的安全顾问的任务之间的界线。
评估的目的是什么?
橙皮书中给出了下列各概念之间的区别:
评估(Evaluation):评定一个产品是否具有它所声明的安全属性证明(Certification):评定一个(已评估的)产品是否适合给定的应用场合鉴定(Accreditation):确定一个(已证明的)产品是否可以在给定场合里应用这些是橙皮书上的术语。当然其他的评估标准会使用不同的术语或者对同样的术语有不同的用法。对各种具体活动的命名没有它们各自应用目标上的基本区别重要。
评估采用什么样的方法?
评估的可信性与评估所使用的方法密切相关。下面这两种条件是一个评估方法所必须避免发生的:
已评估过的产品后来被发现含有严重的缺陷。
不同评估方法对同一产品的评价产生分歧。因此,可重复性和再生性(可再现性(复验性,可再制性))常常应该包含在评估方法必须满足的要求之中。
安全评估是面向产品的,也可以是面向过程的。面向产品(检测)的方法检查和测试产品。这种方法比面向过程的方法告诉我们更多关于产品的信息,但是不同的评估可以给出不同的结果。这是个可信问题吗?
面向过程(审计)的方法检查文档和产品开发的过程。这种方法代价小,而且容易达到可重复的结果,但是结果本身并不是很有价值。欧洲信息技术安全评估手册[118]第一版对于重复性的压倒性优势的内容是个最基本的实例。这也是个可信问题吗?
评估标准的结构是什么?
安全评估的目标是对一个产品或系统是否安全给出保证。安全和保证可以有下列联系:
功能性:系统的安全特性,例如自主访问控制(DAC)、强制访问控制(MAC)、认证、审计。
效果:对于给定的安全需求,所用评估机制是否合适?
保证:评估的完全性。
橙皮书为典型的美国国防部(DoD)需求定义了评估级别。因此上述三个方面在评估级别的定义上都是要同时考虑的。ITSEC提供了一种可变化的评估框架,这个框架能适应新的安全需求。因此,上面三个方面是独立地解决的。
评估过程的组织架构是什么?
对于安全产品各种属性的安全评估应该达到独立的、被公共认可的定论。一个独立的评估机构可以是一个政府部门(在美国),也可以是一个合适的(properly,适当地;正确地;真正地;完全地;彻底地)认可的私有企业(在欧洲[135])。在上面的两个方案中,政府支持评估过程并且给予认证。我们可以想象有多少种不同的方案,哪些公认的评估机构自己发布证书,哪些评估专家约定俗成的经验证据可以代替正式的鉴定。
如果所有的评估都由某单一政府部门来操作的话,那么创建一个更有结构化的管理机构来确保评估的一致性将几乎是不必要的。然而,随着时间的推移,依然存在着解释偏差(标准蠕变)的危险。评估过程可能因为评估机构缺乏竞争和资源有限而变得缓慢。当有经验的评估专家因为私人机构的更高薪水而跳槽时,也就存在着人员流动的问题。
一个政府机构可能要收取评估费用,或者象在美国,进行评估是免费的公众服务。
在一个私营评估机构环境中,发证机构必须加强不同机构中评估的一致性(可重复,可再生),也可以象在欧洲,确认评估机构的评估结果。为了避免不同的解释,关于标准的精确形式化变得很重要。评估所要支付的费用以及承受的商业压力迫切要求更快的评估和评估主办机构所提供的资源都是可以预计得到的。另一方面,采取防范措施才能使商业压力不会导致不正确的结果。
进一步的组织的机构方面涉及到评估的主办者、产品制造商、评估机构间的合同关系。还有,对于开始评估、发放评估证书和已被评估过的产品改进后的再评估等,应该有一个合适的过程。
评估的花费和收益是什么?
除了支付评估费外,你还必须考虑间接花费,如花费在产生评估所需要的证据上的时间,评估员的培训时间,评估团体的联系时间。当考虑评估花费时,你可以再区分为已出售产品和专用系统两种不同的评估。在第一种情况下,评估的主办者能潜在地在一大堆用户中分散了费用。在第二种情况下,评估主办者,或者单个客户不得不自己来承受所有的费用。
评估是政府部门所需要进行的工作,从用户的角度可以提高产品质量。有趣的是,我们可以注意到后一种观点看上去在个人计算机安全市场上更重要。
9.2 橙皮书安全评估指南的工作在美国开始于1967年。这项工作产生了可信任计算机安全评估标准(橙皮书)[112],即第一个评估安全产品(操作系统)的指南。虽然这些努力是集中在“国家安全”部分,但橙皮书的编写者想创建一个更能被普遍应用的文档,它包括:
一个可以被用户使用在计算机安全系统上的评定可信程度的标尺(yardstick,尺度,标准,码尺)
为计算机安全系统生产商提供的指南当要求一个计算机安全系统时作为说明安全需求的基础安全评估检查系统的各个安全关联部分,即可信计算基础(TCB)(见5.2节)。橙皮书中的访问控制策略很接近于Bell-Lapadual模型(见4.2节),即自主访问控制和强制访问控制都以安全标签的格为基础。引用监控器核实验证了哪些主体可以访问他们需求的对象。
高保证性总是与形式方法、简单的可信计算基础以及结构化设计方法学联系起来。Bell-LaPadula模型对一个满足橙皮书安全策略的正式模型是一个合适的参考,但其他模型也可以用到TCSEC评估中。总是假设可信计算基础的简单性可以有助于的更综合的分析。因此,复杂系统一定落入较低的评估类别中。
9.2.1安全和评估的种类橙皮书中的评估类是设计来说明安全需求的典型模式的。因此,具体安全特点需求和保证需求都是结合在这些评估类的定义中的。一个评估类描述的主题有:
安全策略:用主体和客体来说明的强制的和自主的访问控制策略标记客体:标签说明客体的安全敏感度主体识别:单个主体必须要被识别和认证审计:审计保存的安全关联事件的日志保证:主要涉及安全体系结构的操作保证;如关于设计方法、测试和配置管理的生命周期保证文档:安全系统的系统管理员和用户需要的安装和正确使用安全产品的指南;评估者需要测试和设计文档。
持续的保护:安全机制不可被破坏。
橙皮书用这些标准来定义四个安全分类和七个安全级别。通过更严格的分析,较高安全级别的产品提供更安全的机制和较高保证性。这四个安全分类是:
D 最小保护
C 自主保护(必须了解(须知,need to know))
B 强制保护(基于标签)
A 查证保护橙皮书的安全级别定义是递增的。一个级别的所有需求自动地包括在更高级别的需求中。橙皮书是国家安全机构执行的独立于应用的安全评估的基础。
D—最小保护这个级别,是适用于那些需要评估但达不到橙皮书最低级别要求的产品。
C1—自主安全保护
C1级别的系统是用在协作用户在同一完整性级别处理数据的环境。建立在单个用户和组基础上的自主访问控制(DAC),使用户可在一定控制级别上共享对客体访问。但用户必须证明自己的身份而且该身份是被系统认可的。
对于操作的保证而言,可信计算基础(TCB)有自己的执行环境,而且必须有周期性验证可信计算基础操作是否正确的特点。生命期的保证仅指对“明显”缺陷进行安全性测试。用户指南(橙皮书文档的一章)、可信设备操作手册(适用于系统管理员)、测试文档、设计文档等都要提供。总之,C1系统适合应用于友好环境,并不刻意提供强安全性。目前,声明C1安全级别的系统并不多。
C2—受控制的访问保护
C2系统使得用户分别地对他们的行为负起责任。自主访问控制加强了对单个用户的控制粒度。现在还必须控制访问权限的传播。访问主体不能获得由可信计算基础管理的客体,该客体含有由一个在先的主体产生的信息(客体重用)。审计安全关联事件的轨迹的机制,如C2级别明确定义的,必须保留。
测试和文档必须包含最新增加的安全特性,但必须保证是适度的。测试仍然是为了寻找明显的漏洞。
一般说来,虽然C2系统有许多固有的弱点,但C2仍被认为对商业应用是最合理的安全级别[7]。大多数厂商都提供经C2评估过的操作系统或数据库管理系统的版本。有时,厂商也提供专门的应用程序为在适应C2配置的条件下安装他们的系统提供帮助 [122,63]。
B1―标签安全保护
B级别是为了处理保密数据和加强强制的Bell-LaPadula策略的。每个主体和客体都依据层次分类级别和非层次类别设置标签。标签的完整性需要保证。识别和认证用于确定主体的安全标签。
一旦保护基于标签之上,你就必须考虑当被标记过的客体输出到其他系统或打印机时会发生什么情况。解决方法应该依据输出通道的特性而定。通信和I/O通道可以是单级别,也可以是多级别的。在多级别上的通道上,客体带着标签输出。在单级别通道上,可信计算基础和授权用户一起指定输出信息的敏感级别。可被人读的输出也必须加以标签,比如,在敏感文档的每一页打印上密级。
为达到更高的保证,需要正式的或非正式的安全策略模型。测试和文档必须相当完备。设计文档、源代码、目标代码都要分析。在测试中发现的错误都要排除掉。
但是,由于可信计算基础的结构对B1级别的需求并不非常强烈,因此,复杂软件系统如多级别安全Unix系统或数据库管理系统都要有B1证书。B1级别是为带隔离环境使用的系统设计的。
B2—结构化保护
B2级别主要通过在系统设计时增加安全需求来提高安全保证性。强制访问控制也包含对物理设备使用的控制。一旦用户的安全等级发生变化则必须通知他们。对于登录和初始认证必须有可信路径。
安全策略的正式模型和系统的描述的顶级规范(DTLS)都是需要的。模块化是系统体系结构的重要设计特点。可信计算基础必须提供明确的(distinct,清楚的(各别的,分别的))地址空间来隔离不同的进程。硬件支持,比如分段,可支持内存管理。隐蔽通道分析必须实现,并且事件潜在地创建隐蔽通道的过程必须被审计。安全测试应该实现,使可信计算基础被相对定位到可以抵抗穿透。
B3—安全域
B3系统被定位到可以高强度防止穿透。B3级别中的许多新成分都要考虑安全管理,也必须支持安全管理员操作。审计机制监视着正在发生的或累积的与安全相关的事件,并对可疑情形自动发布警告信息。必须建立系统失败后可信恢复机制。
最小化可信计算基础的复杂性和排除与安全无关的模块是大多数系统工程的任务。令人信服的观点必须在安全策略的正式模型和非正式的详细实验说明书(DTS)之间达到一致性。
A1—验证的设计
A1级别功能上相当于B3级,通过正式方法的使用达到最高的保证性。策略和系统的正式规范和一致性证明都要高度确保可信计算基础是正确实现的。评估A1级别的要求如下:
安全策略的正式模型系统要具有正式顶级规范(specification,规约,(又称)规格说明,(规范)说明书,技术要求)(FTLS),包括可信计算基础功能的抽象定义模型和正式顶级规范之间的一致性证明(形式的、有可能的话)
可信计算基础的实现非正式地证明了和正式顶级规范的一致性隐蔽通道的正式分析(定时通道用非正式的),隐蔽通道的持续存在必须经过认定(justify,证明…有道理),但带宽必须有限。
另外,更严格的配置管理和分布(distribution,分发,分配;分布,散布;(商品的)销售,推销)控制(节点安全确认测试)要保证装在客户节点上的版本和(评估过的)主版本一样。
现在达到A1级别的产品几乎没有。当前,尽管在联盟产品中有保密的产品,但只有两个网络组件达到了A1级别要求。当时编写橙皮书标准时,曾考虑定义比A1级别更高的安全级别,主要是在系统体系结构,测试,形式描述和验证,以及可信设计环境等方面增加更多的需求。如果评估复杂软件产品的难度降低了安全保证级别,那么对评估工作进一步的开展是没有激励的。
9.3 TNI-可信网络说明可信网络说明(红皮书)[107]尝试用橙皮书中提到的概念和术语来解决网络安全问题。红皮书是对橙皮书非常有趣的概括,更确切地说,它概括失败的地方是很有趣的。例如,红皮书是受有限的网络分类限制的,但不得不说明那些在橙皮书中没有提到的问题,在一定程度上(to some extent,某种程度上)和ISO安全体系结构(ISO 7498-2[51])等同(compete,竞争,比赛)。因此,红皮书被看作是橙皮书与以后建议提出的新标准[117]之间的过渡。
假定计算机网络可以简单地看成是计算机系统的具体(specific,特殊的(具体的,单位的))例子,那么橙皮书上的方法是适用的。红皮书检查了(examine,调查,检查,检验,研究)上面的假定,立即就需要来区别两种不同类型的网络:
独立组件的(component,分量;成分;元件;组件;部件)网络(相互连接的可信自动信息系统),具有不同权限(jurisdiction,权限;管辖范围,管辖区域)、策略、管理方法等。在这样的网络中加强安全是非常困难的问题。
集中式网络(单个可信系统),具有单一的可信权威(accreditation,任命(鉴定),认可,授权,委派,信赖,鉴定合格;authority,管理局(官方,权力),权威,威信,权威人士,权力,职权,典据,著作权威)、策略和网络可信计算基础(NTCB)。
红皮书仅考虑第二种类型的网络。在计算机网络中,安全机制是被分布到不同的网络组件中的,因此,新的安全问题就由于下列原因产生:
通信路径的脆弱性网络部件的并发的和异步的操作另外,必须采用技术手段解决这些问题,如密码,在橙皮书中就没提到。为处理这些新问题,红皮书被分成两部分:
第一部分:是对橙皮书的翻译解释第二部分:其他安全服务,在一定程度上相当于ISO 7498-2标准,现在被可信网络说明环境指南[108]取代了。
9.3.1 红皮书策略在网络中,不同的实体(用户,服务提供商,网络操作员,系统管理员,……)都有责任(be responsible for,对…负责,形成...的原因)设置安全策略,这一点变得越发明确了。在红皮书中,负责说明安全需求、定义安全策略和提交评估系统的实体都被称作主办人(sponsor,发起人(保证人,资助人);发起者,主办者,倡仪者)。
安全策略涉及(deal with,应付,对付; 处理;论及,涉及,研究)保密性和完整性。这些要借助面向客体的抽象和控制建立授权的连接来阐明。在C1级别中,节点名字可以被作为自主访问控制(DAC)组的标识。强制访问控制(MAC)用于新的概念实体,如会话、连接、或虚拟电路。识别和认证都建立在“用户来自”的节点上的。审计踪迹必须记录密钥的使用。关于代理用户的讨论是委托问题的一个实例,唯一用户标识是分布系统中命名问题的实例。红皮书认为,当把强制访问控制用在集中策略时,自主访问控制也可以在系统的节点中分布使用。
红皮书尽量识别一个明确的目标。文档中有许多典型的例子和建议都是为了达到评论上所说的像‘支持自主访问控制的网络需要用其他方式处理对待上面提到的典型情况’。当在新的环境中使用已建立的概念时,这是个出现了需要面对的新问题的预示。
9.3.2 完整性在1.1.4节中说过对于完整性还没有个单一的定义。红皮书在文档中用两个不同的定义解释了这个问题。在第一部分,完整性指的是保护数据和标识不被非授权的修改。BiBa模型被提出作为正式的完整性模型。完整性也指网络可信计算基础的正确操作。在第二部分,信息传输的完整性是指消息传输的正确性,特别指信息的源和目的的认证。密码机制可以防止对数据的有意修改。
9.3.3 标签网络中的强制访问控制包括强制的完整性策略。因此引进了完整性标签。例如这样的完整性标签可以指示一个客体在节点间是否已经被传输过。
在橙皮书上对标签的狭义解释要求安全标签要依附于主体和客体的数据结构。然而还是存在对这种显式安全标签的其他选择。当加密用于保护客体时,你就能用加密密码作为隐式安全标签。只有对相应的密码有访问权限的主体才可以访问客体。因此控制访问密码的标签实际也控制了对加密客体的访问。
9.3.4其他安全服务在设计安全服务中,加密和协议都是支撑的基本元素。红皮书中具体的安全服务见图9.1([107]的表II-2和[108]的表4)。对于每项服务的功能性强壮性保证性都要定义描述。强壮性是指一个机制是如何很好地到达它的预期目标的。典型的例子是密码算法的密钥长度。保证性开始于理论研究、许多领域的测试、好的软件工程实践、合法性和验证。等级为:
无最小(C1)
一般(C2)
好(B2)
目前还没提出的这个等级是和具体的应用相结合的,没有橙皮书的分级稳定。
9.3.5评估分类和合成规则橙皮书分类是依据典型的安全需求。级别C适用于相互操作的用户环境。因此对保证性的要求并不是太高。你可以假想在特定的环境下,用户可以容易地绕开安全性检查,这种方法比攻破操作系统更简单。在网络中,从单一层次的组件建立多级安全系统(MLS)是可能的。但经过C2评估的单一层次的组件却不能保证是否达到B级别系统中的评估要求。因此增加了一个新的安全级别C2+,用于那些提供了自主访问控制和审计时的实时报警,但没有达到强制访问控制的安全要求的组件,保证水平相当于B3级。
计算机网络有明显的可识别的组件,如节点和通信协议。寻找这样的评估方案是诱人的,它能从评估过的网络组件的安全级别来计算由那些组件构成的网络的安全级别。例如,考虑通过足够强壮的标识护照协议进行通信的两个自主访问控制组件的合成物。合成的级别可以定义为两个组件中级别最低的一个的级别。
图9.1 红皮书中的网络安全服务这个想法对简单例子还行,但在较复杂的网络中能用的却有限。红皮书考察了这个问题并为那些评估需要另外解释的合成提供例子。
9.4 信息技术安全评估标准协调的欧洲信息技术安全评估标准[117]是由荷兰、英国、法国和德国在定义国家安全评估标准时的结果。第一个草案公布于1990年,信息技术安全评估标准(ITSEC)正式作为推荐版本被欧洲联合会批准是1995年4月7号。作为欧洲的文档,ITSEC以多种语言存在,这增加了统一解释标准的难度。
ITSEC从橙皮书各种版本的经验教训中学到了东西,取得了逻辑进步。橙皮书被认为太严格太僵化了,ITSEC致力于提供一个安全评估的框架,当有新的安全需要时可以很容易地加进去。在ITSEC中,功能性和保证性之间的联系被分开了。红皮书中区分功能性和保证性的地方,ITSEC中采用有效性和正确性。有效性描述了一个系统如何有效地适应面临的威胁。正确性覆盖了系统开发和操作的各种保证措施。
9.4.1评估过程评估标准应用于安全产品和安全系统。产品可以马上买到,但仅能假设它的一般的工作环境。系统是被部署在特定的现实环境中的。为覆盖以上两个方面,ITSEC特将需要评估的安全产品和安全系统通称为评估目标(TOE,Target of Evaluation)。
评估的发起人决定运行条件和可能的威胁。评估目标的安全目的进一步依赖于法律和其他规则。这些形成所需的安全功能和评估级别。安全客体(Security Target)定义了评估相关的评估目标的所有方面。它描述了评估目标的安全功能,也可能是面对的威胁、客体和所用安全机制的细节。安全客体要包括下面各项:
安全目标(在系统安全策略中可能提到,这也是全体安全策略的一部份)
系统环境的要求评估目标环境的假定安全作用的原理(在技术安全策略中加以说明)
安全功能的合理性所需的安全机制所需的评估级别(9.4.4节)
声明的安全机制最小强度的等级对每一个评估层次,评估标准要列出各项由评估发起人发送给评估者。
评估者要确保这些列项都提供了,要关心内容和表示是否达到需求,各项都清楚地提供或者支持需要的结果和证据。
产品开发者和评估者之间紧密合作是必须的。对E1以上级别,评估者将主要检查评估发起人提供的每一个测试和分析结果。并以证书的形式声明评估目标是否达到了安全目标。
9.4.2安全功能性在橙皮书级别的定义中,你可以找到少许有关某一保护机制、其功能和实现方法的原理的提示。但在橙皮书中关于上面三点却没有系统的说明。ITSEC中涉及了这三个方面。在描述安全功能性时,你需要说明:
安全目标:为什么需要这种安全功能?
安全功能:具体要做些什么工作?
安全机制:是怎么实现的?
一般的安全功能分类依据如下:
识别和认证;
访问控制;
可说明性:记录事实真相;
审计:检测和调查可能对安全造成威胁的事件;
客体的再使用;
精确性:正确性和数据的一致性(这也是我们定义完整性的一部分);
可靠性:服务的一致性和可用性;
数据交换:参考国际标准ISO7498-2
评估目标的功能性是一项一项定义的,也可参考十个预定义功能级别中的一个。第一组五个级别,F1到F5,对应于橙皮书级别的各个功能方面。橙皮书和ITSEC的对照见图9.2。其他的级别根据具体的应用而不同。
F6 应用于高完整性;如数据库
F7 应用于高可用性
F8 应用于通信时数据完整性
F9 应用于高机密环境(加密设备)
F10: 应用于机密性和完整性要求很高的网络这些级别不再一层一层向上定义。ITSEC原则上是开放的,可以增加新的功能级别,虽然这种情况很少发生。
9.4.3有效性保证为了检查安全功能和机制的有效性,你必须确定它们对特定应用是合适的。不要忘了,完美的安全是不现实的目标。你将不得不跟着新漏洞打补丁。你必须确认你所做的防止威胁的工作是否真的没有发生公开漏洞引起的后果。有效性的评估需要检查以下几点:
功能(functionality,函数[操作,功能]性,.函数性(泛函性,官能度))的适用性功能的可捆绑性(不同功能间的兼容性)
机制的强壮性使用的方便性对评估目标结构下安全漏洞的评估,例如绕过和破坏安全强制性功能;
对评估目标操作下安全漏洞的评估
橙皮书
ITSEC
D
E0
C1
F1+E2
C2
F2+E2
B1
F3+E3
B2
F4+E4
B3
F5+E5
A1
F5+E6
 图9.2 橙皮书和ITSEC级别的比较
9.4.4正确性的保证正确性的保证需要通过七种评估层次来表示。E0到E6从低到高表示保证性的强度级别。这些级别是递增定义的,参考的是评估目标的结构和操作,评估发起人必须提供详细的文档列表,评估的具体动作由评估者执行。这些文档和动作如下:
开发过程:按照自顶向下的分析方法,先分析安全需求、总体设计、详细设计,最后具体实现。
开发环境:包括配置控制,从E2级向上,到开发器的安全性,例如文档的机密性都和评估有关。
操作:参考用户和管理员操作手册,以及操作环境,包括递送、配置、启动和操作。
七个评估级别的主要特点可以总结如下:
E0 没有足够的保证性,对评估目标来说是失败的评估
E1 有安全目标和评估目标的非正式描述。测试能说明评估目标达到安全目标。
E2 在详细设计中加非正式描述。提供测试的证明,必须有配置控制和受控的分发过程。
E3 必须提供有关安全功能的详细设计和源代码。
E4 安全策略必须有正式模型。必须有体系结构和详细设计的严格的方法和表示。漏洞分析必须以采用的方法为基础。
E5 详细设计和源代码之间的关系要紧密。漏洞分析要用源代码。
E6: 必须有和安全策略正式模型一致的评估目标的安全体系结构的正式描述。评估目标的可执行形式的部分必须与源代码相关联。
今天,E3是商用安全产品最普遍采用的评估级别。安全操作系统或数据库管理系统的安全评估典型的目标定位在F2和E3结合上。这里要再一次提到,自主访问控制被认为是满足上面要求的,但比C2级别更高的保证性是人们所需要的。大多数的评估都是依据橙皮书级别结合的功能级别进行的,这点很重要。
9.5 通用标准欧洲安全评估标准能解决红皮书、可信数据库翻译器(可信数据库解释,Trusted Database Interpretation(解释;说明;翻译))中不能解决的问题,通过区分功能和保证性需求,以及考虑整体安全系统的评估。由ITSEC提供的灵活性有时是优点,有时却是缺点。记得1.4.3节中强调的基本的进退两难情况吧。不是安全专家的用户怎么决定一个给定的安全客体(目标,target)是否适合他们呢?
评估标准发展链上的下一个环节是美国的联邦标准[115]。他们采用了下一个逻辑步骤,在评估级别的定义上提供了更多的指导,但仍然保留一定的灵活性。联邦标准坚持对产品的评估,坚持评估级别的定义中的功能和保证性之间的联系,并通过产品独立的保护框架[表](保护简档[表],protection profile)来尽力克服橙皮书中严格的僵化结构。保护简档[表]包括下面五部分:
描述的元素:保护简档[表]的“名称”,包括要解决的信息保护问题的描述基本原理(rationale):保护简档[表]的基本判断(理由,合理性,认为有理,认为正当,justification),包括威胁、环境、使用假设,要解决的信息保护问题更详细的描述,和保护简档[表]大体一致的产品支持的安全策略指南。
功能需求:建立产品提供的保护界线,这样在边界内可以统计预期的威胁(P159)。
开发保证需求:从初始设计到实现的所有阶段,包括开发过程、开发环境、操作支持、开发根据(证据,事实,evidence)。
评估保证需求:说明评估的类型和强度(intensity)。
因为安全评估在商业上是非常有吸引力的,评估证书应该被广泛地接受。在这个方向上,第一步要求评估标准集的普遍化。因此,负责国家安全的各种评估组织走到一起,形成了共同标准编写委员会(CCEB),产生了共同标准[26],作为联合现有的和将继续出现的评估标准的一种努力,这些现有标准包括TCSEC、ITSEC、CTCPEC和联邦标准。最终目标是以ISO标准的形式被全世界广泛接受的一组标准。
共同标准融合了来自各种以前的标准的思想。(这种融合的不幸的一面是,读者必须面对大量的文档)。共同标准又放弃了ITSEC的灵活性,在使用保护简档[表](protection profile)和预定义安全级别上遵循了联邦标准。为了指导用户,这些级别的定义包含安全目标、原理、威胁、威胁环境和进一步应用注意等信息。有些结合了橙皮书内容的级别给出来是作为例子用的,但是想有一个过程来增加新的安全级别。
9.6 质量标准以审计为基础的评估的最终一步是在没有关于产品的任何参考的情况下评定产品是怎么开发的。这样的公司会成为“安全系统的认证(证明合格,授与合格证书,证明;证实,certify)制造商”。这种方式在质量控制领域的流行已经得到了证明。像ISO 9000标准会建议一个公司怎样摆正内部质量管理和外部质量保证的位置来保证公司产品的质量。一些厂家声明,通过了ISO 9000质量认证取得的销售比一般只有安全证书的特定产品要强多了,安全评估也要走向这条道路。
这样的提议已经吸引了不少公司认为开发安全系统是显然的。评估的开销很大程度上减少了。如果安全系统的开发者在这个提议上成功了,安全系统的用户会失败吗?这不是个可以预测的结论。毕竟,一份证书并不能保证系统不可能被攻破。因此,你不得不根据每一种评估机制自己的优点来决定已评估过的各别产品是否能比授权开发者的产品提供更多的安全保证。
9.7 成果充分利用了吗?
安全评估被批评为一种由政府驱使的代价昂贵的过程。上面的观点见欧洲计算机制造商联合会(ECMA)公布的报告[7]。这个报告坚持要求成本、生产率和安全的三者平衡,其中的任何两项都会严重影响第三项。欧洲计算机制造商协会(ECMA)的警告反对把IT安全仅仅看成技术上的问题,评述说随着具有更多安全评估误导的作用,会造成当前投资不平衡,同时安全系统的操作管理的重要性将被忽略。
在他们对当前评估过程的批评中,评估成本(占开发成本的10%--40%)和到评估完成的时间当然是关心的方面。被提到的更多问题还有:
标准的解释和标准的推广上的不明确性;
对已评估产品新版本的重新评估成本;
评估过程的保密性。
欧洲计算机制造商协会(ECMA)意识到橙皮书级别C2在为操作系统安全建立的基准上扮演了重要角色。尽管如此,C2也只是看上去在主体上达到了政府的安全需求和商业功能级别(COFC)[6],C2级别考虑了识别和认证、访问控制、可说明性和审计、客体重用、准确性、服务可靠性以及大量特定口令需求。ECMA还建议深入开发像ISO 9000的质量标准作为安全评估的另一选择。
最后,你必须注意到证书只适用于产品的特定版本和特定配置。在一个实际安装中,使用的很可能是不同的配置,也可能是不同的版本。因此严格上说,证书并不能提供直接的安全保证。
进一步的阅读安全评估和正式安全模型化的早期历史见[93]。橙皮书级别总体的安全评估的实际方面在[30]上有说明。Blacker的简短描述在[157]可以找到。为达到A1需求开发的原型但没有成为商业产品见[76]。具有评估标准、辅助文档和评估产品的网站有:
http://www.radium.ncsc.mil/tpep/process/faq.html 为美国TCSEC项目而建立,在上面你可以找到已评估过产品的列表。
http://www.itsec.gov.uk 为英国ITSEC计划而建立。
ftp://ftp.cse-cst.gc.ca/pub/criteria/CTCPEC 是加拿大评估标准。
http://csrc.ncsl.nist.gov/cc 是共同标准
ITSEC认证的产品列表已被英国ITSEC整理出版,见[136],且每六个月更新一次。
关于保证和多层次安全系统的隐蔽通道方面的案例可以见[74]。
练习题:
练习9.1 安全评估要处理移动目标的问题。当某产品的一个版本被评估时该产品的开发仍然不能停止。怎样才能保证评估证书不过时呢?当考虑你的提议时可以参考RAMP方案。
练习9.2 安全产品必须紧随正在变化的目标。在一个正在使用中的产品的生命期内,外界的威胁环境可能会改变。你怎样设计一个方案来使防病毒产品的评估能在威胁变化的环境中保证它们的证书继续更新?在你的方案中有哪些组件应该包括在对操作系统的评估中?
练习9.3 有时听说评估的产品主要用来作为在没有建立好的机制时被指控时的保险,而不是因为它们能提供更好的安全性。从提供附加值的安全评估方案中你希望得到什么?
练习9.4 评估标准是设计了用来帮助对安全无知的用户满足特定的安全需求。保护简档[表]是不是能解决这个问题?
练习9.5 ITSEC覆盖了安全系统的评估。咨询顾问为客户在他们的安全问题上建议解决方案。从哪里可以分清顾问的工作和评估工作?评估比起雇用顾问有无优点?
练习9.6 为防火墙写一个保护简档[表]。
练习9.7 考查阻塞和监视隐蔽通道的两种选择。被阻塞隐蔽通道影响的系统的可用性如何?