购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

第5章

语言、程序、软件与安全

5.1 语言与程序

5.1.1 计算机语言

计算机语言的发展是一个不断演化的过程,其根本的推动力就是抽象机制更高的要求,以及对程序设计思想的更好的支持。具体地说,就是把机器能够理解的语言提升到也能够很好地模仿人类思考问题的形式。计算机语言的演化从最开始的机器语言到汇编语言再到各种结构化高级语言,最后到支持面向对象技术的面向对象语言。

1.机器语言

电子计算机所使用的是由“0”和“1”组成的二进制数,二进制是计算机语言的基础。计算机发明之初,人们只能降贵纡尊,用计算机的语言去命令计算机干这干那,一句话,就是写出一串串由“0”和“1”组成的指令序列交由计算机执行,这种语言就是机器语言。使用机器语言是十分痛苦的,特别是在程序有错需要修改时更是如此。而且,由于每台计算机的指令系统往往各不相同,所以,在一台计算机上执行的程序,要想在另一台计算机上执行必须另编程序,造成了重复工作。但由于使用的是针对特定型号计算机的语言,故而运算效率是所有语言中最高的。机器语言是第一代计算机语言。

2.汇编语言

为了减轻使用机器语言编程的痛苦,人们进行了一种有益的改进:用一些简洁的英文字母、符号串来替代一个特定指令的二进制串,如用ADD代表加法、MOV代表数据传递等,这样一来,人们很容易读懂并理解程序在干什么,纠错及维护都变得方便了,这种程序设计语言就称为汇编语言,即第二代计算机语言。然而计算机是不认识这些符号的,这就需要一个专门的程序,专门负责将这些符号翻译成二进制数的机器语言,这种翻译程序称为汇编程序。汇编语言同样十分依赖于机器硬件,移植性不好,但效率仍十分高,针对计算机特定硬件编制的汇编语言程序,能准确发挥计算机硬件的功能和特长,程序精练且质量高,所以至今仍是一种常用而强有力的软件开发工具。

3.高级语言

从最初与计算机交流的痛苦经历中人们意识到,应该设计一种接近于数学语言或人的自然语言,同时又不依赖于计算机硬件,编出的程序能在所有机器上通用。经过努力,1954年第一个完全脱离机器硬件的高级语言——FORTRAN问世了,40多年来,共有几百种高级语言出现,有重要意义的有几十种,影响较大、使用较普遍的有FORTRAN、ALGOL、COBOL、BASIC、LISP、SNOBOL、PL/1、Pascal、C、PROLOG、Ada、C++、VC、VB、Delphi、Java等。高级语言的发展也经历了从早期语言到结构化程序设计语言,从面向过程到非过程化程序语言的过程。相应地,软件的开发也由最初的个体手工作坊式的封闭式生产,发展为产业化、流水线式的工业化生产。

20世纪60年代中后期,软件越来越多,规模越来越大,而软件的生产基本上是人自为战,缺乏科学规范的系统规划与测试、评估标准,其恶果是大批耗费巨资建立起来的软件系统,由于含有错误而无法使用,甚至带来巨大损失,软件给人的感觉是越来越不可靠,以致几乎没有不出错的软件。这一切极大地震动了计算机界,史称“软件危机”。人们认识到大型程序的编制不同于写小程序,它应该是一项新的技术,应该像处理工程一样处理软件研制的全过程。程序的设计应易于保证正确性,也便于验证正确性。1969年,提出了结构化程序设计方法,1970年,第一个结构化程序设计语言——Pascal出现,标志着结构化程序设计时期的开始。

20世纪80年代初,面向对象程序设计出现。在此之前的高级语言几乎都是面向过程的,程序的执行是流水线似的。在一个模块被执行完成前人们不能干别的事,也无法动态地改变程序的执行方向。这和人们日常处理事物的方式不一致,对人而言是希望发生一件事就处理一件事,也就是说,不能面向过程,而应是面向具体的应用功能,也就是对象(Object)。其方法是软件的集成化,如同硬件的集成电路一样,生产一些通用的、封装紧密的功能模块,称之为软件集成块,它与具体应用无关,但能相互组合完成具体的应用功能,同时又能重复使用。对使用者来说,只关心它的接口(输入量、输出量)及其实现的功能,至于如何实现的那是它内部的事,使用者完全不用关心,C++、VB、Delphi就是典型代表。高级语言的下一个发展目标是面向应用,也就是说:只需要告诉程序要干什么,程序就能自动生成算法,自动进行处理,这就是非过程化的程序语言。

4.第四代语言

4GL(Fourth-Generation Language,第四代语言)是按计算机科学理论指导设计出来的结构化语言,如ADA、Modula-2、Smalltalk-80等。

4GL简单易学,用户界面良好,非过程化程度高,面向问题,只需告知计算机“做什么”,而不必告知计算机“怎么做”,用4GL编程使用的代码量较之COBOL、PL/1明显减少,并可成数量级地提高软件生产率。许多4GL为了提高对问题的表达能力,也为了提高语言的效率,引入了过程化语言成分,出现了过程化语句与非过程化语句交织并存的局面,如LINC、NOMAD、IDEAL、FOCUS、NATURAL等均是如此。

4GL以数据库管理系统所提供的功能为核心,进一步构造了开发高层软件系统的开发环境,如报表生成、多窗口表格设计、菜单生成系统等,为用户提供了一个良好的应用开发环境。4GL的代表性软件系统有PowerBuilder、Delphi和Informix-4GL等。

4GL的出现是出于商业需要。4GL这个词最早是在20世纪80年代初期出现在软件厂商的广告和产品介绍中的。因此,这些厂商的4GL产品不论从形式上看还是从功能上看,差别都很大。1985年,美国召开了全国性的4GL研讨会,也正是在这前后,许多著名的计算机科学家对4GL展开了全面研究,从而使4GL进入了计算机科学的研究范畴。进入20世纪90年代,随着计算机软、硬件技术的发展和应用水平的提高,大量基于数据库管理系统的4GL商品化软件已在计算机应用开发领域中获得广泛应用,成为面向数据库应用开发的主流工具,如Oracle应用开发环境、Informix-4GL、SQL Windows、Power Builder等。它们为缩短软件开发周期、提高软件质量发挥了巨大的作用,为软件开发注入了新的生机和活力。

5.1.2 程序结构与执行方式

1.程序的基本结构

计算机程序或者软件程序(简称程序)是指一组指示计算机执行动作或做出判断的指令,通常用某种程序设计语言编写,运行于某种目标的计算机或智能仪器上。

早在1966年Bohm和Jacopin就证明了程序设计语言中只要有3种形式的控制结构,就可以表示出各式各样的其他复杂结构。这3种基本控制结构是顺序、选择和循环。对于具体的程序语句来说,每种基本结构都包含若干语句。

1)顺序结构

顺序结构表示程序中的各操作是按照它们出现的先后顺序执行的。先执行A模块,再执行B模块,如图5-1(a)所示。

图5-1 程序的3种基本结构

2)选择结构

选择结构表示程序的处理步骤出现了分支,它需要根据某一特定的条件选择其中的一个分支执行。选择结构有单选择、双选择和多选择3种形式。当条件P的值为真时执行A模块;否则执行B模块,如图5-1(b)所示。

3)循环结构

循环结构表示程序反复执行某个或某些操作,直到某条件为假(或为真)时才可终止循环。在循环结构中最主要的是什么情况下执行循环、哪些操作需要循环执行。

当型循环结构:当条件P的值为真时,就执行A模块,然后再次判断条件P的值是否为真,直到条件P的值为假时才向下执行,如图5-1(c)所示。

直到型循环结构:先执行A模块,然后判断条件P的值是否为真,若P为真,再次执行A模块,直到条件P的值为假时才向下执行,如图5-1(d)所示。

2.程序的执行方式

一般的程序是用高级语言编写的,如C/C++以及面向对象的Visual系列,而编写的程序在计算机上是不能直接执行的,因为计算机只能执行二进制程序。因此,要将编写的程序翻译成二进制程序。在计算机上执行的程序通常有两种方式:一种是编译执行方式;另一种是解释执行方式。

1)解释方式

解释方式是每执行一句就翻译一句,即边执行边解释。这种方式每次运行程序时都要重新翻译整个程序,效率较低,执行速度慢,如BASIC语言。解释执行方式按照源程序中语句的动态顺序逐句进行分析解释,并立即执行。所以,解释程序是这样一种程序,它能够按照源程序中语句的动态顺序,逐句地分析解释并执行,直至源程序结束。

2)编译方式

编译方式是在程序第一次执行前,先将编写的程序翻译成二进制形式,然后每次执行时就可以直接执行这个翻译好的二进制程序了。程序的翻译过程叫编译。现在的大多数语言都是采用这种方式。编译方式把源程序的执行过程严格地分成两大步,即编译和运行,也就是先把源程序全部翻译成目标代码,然后再运行此目标代码,获得执行结果。

5.2 软件与软件工程

5.2.1 软件与分类

1.软件

软件(Software)是一系列按照特定顺序组织的计算机数据和指令的集合。一般来讲,软件被划分为编程语言、系统软件、应用软件和介于这两者之间的中间件。软件并不只是可以在计算机(这里的计算机指广义的计算机)上运行的程序,与这些程序相关的文档一般也被认为是软件的一部分。简单地说,软件就是程序加文档的集合体。

软件是用户与硬件之间的接口界面。用户主要是通过软件与计算机进行交流。软件是计算机系统设计的重要依据。为了方便用户,为了使计算机系统具有较高的总体效用,在设计计算机系统时,必须全局考虑软件与硬件的结合以及用户的要求和软件的要求。

2.软件分类

一般来讲,软件分为系统软件和应用软件,其中系统软件包括操作系统和支撑软件(包括微软发布的嵌入式系统,即硬件级的软件,使计算机及其他设备运算速度更快、更节能),见图5-2。

图5-2 软件分类框图

1)系统软件

系统软件为计算机使用提供最基本的功能,可分为操作系统、数据库管理系统、系统实用程序和程序设计语言与编译系统等。

(1)操作系统是管理计算机硬件与软件资源的程序,同时也是计算机系统的内核与基石。操作系统身负诸如管理与配置内存、决定系统资源供需的优先次序、控制输入与输出设备、操作网络与管理文件系统等基本事务。操作系统分为Windows、UNIX、Linux、Mac OS、OS/2等。

(2)数据库管理系统是对数据库进行管理和操作的系统,是用户与数据库之间的接口,它提供了用户管理数据库的一套命令,包括数据库的建立、修改、检索、统计和排序等功能。关系型数据库管理系统应用广泛,常见的有FoxPro、SQL Server、Oracle、Sybase、DB2和Informix等。

(3)系统实用程序是一些工具性的服务程序,便于用户对计算机的使用和维护。主要的实用程序有语言处理程序、编辑程序、连接装配程序、打印管理程序、测试程序和诊断程序等。

(4)程序设计语言与编译系统。目前被广泛使用的高级语言有C、BASIC、PASCAL、FORTRAN、COBOL等。

2)应用软件

(1)通用应用软件,是某些具有通用信息处理功能的商品化软件。它的特点是通用性,因此可以被许多类似应用需求的用户使用。它所提供的功能往往可以通过选择、设置和调配来满足用户的特定需求。比较典型的通用软件有文字处理软件、表格处理软件、数值统计分析软件、财务核算软件等。

(2)专用应用软件,是满足用户特定要求的应用软件。因为某些情况下,用户对数据处理的功能需求存在很大的差异性,通用软件不能满足要求时,需要由专业人士采取单独开发的方法,为用户开发具有特定要求的专门应用软件。

5.2.2 软件工程概述

1.定义

软件工程(Software Engineering)是一门研究用工程化方法构建和维护有效的、实用的和高质量软件的学科。它涉及程序设计语言、数据库、软件开发工具、系统平台、标准、设计模式等方面。就软件工程的概念,很多学者、组织机构都分别给出了自己的定义。

(1)BarryBoehm:运用现代科学技术知识来设计并构造计算机程序及为开发、运行和维护这些程序所必需的相关文件资料。

(2)IEEE在软件工程术语汇编中的定义:软件工程是将系统化的、严格约束的、可量化的方法应用于软件的开发、运行和维护,即将工程化应用于软件。

(3)FritzBauer在NATO会议上给出的定义:建立并使用完善的工程化原则,以较经济的手段获得能在实际机器上有效运行的可靠软件的一系列方法。

(4)《计算机科学技术百科全书》中的定义:软件工程是应用计算机科学、数学及管理科学等原理开发软件的工程。软件工程借鉴传统工程的原则、方法,以提高质量、降低成本。其中,计算机科学、数学用于构建模型与算法,工程科学用于制定规范、设计范型(Paradigm)、评估成本及确定权衡,管理科学用于计划、资源、质量、成本等管理。

2.软件工程过程

1)软件过程

软件过程可概括为3类,即基本过程类、支持过程类和组织过程类。

(1)基本过程类包括获取过程、供应过程、开发过程、运作过程、维护过程和管理过程。

(2)支持过程类包括文档过程、配置管理过程、质量保证过程、验证过程、确认过程、联合评审过程、审计过程以及问题解决过程。

(3)组织过程类包括基础设施过程、改进过程及培训过程。

2)基本过程

软件过程主要针对软件生产和管理。为了获得满足工程目标的软件,不仅涉及工程开发,而且还涉及工程支持和工程管理。对于一个特定的项目,可以通过剪裁过程定义所需的活动和任务,并可使活动并发执行。与软件有关的单位,根据需要和目标可采用不同的过程、活动和任务。

软件工程过程指生产一个最终能满足需求且达到工程目标的软件产品所需要的步骤。软件工程过程主要包括开发过程、运作过程、维护过程。它覆盖了需求、设计、实现、确认及维护等活动。

3.软件生命周期

软件生命周期(Systems Development Life Cycle, SDLC)是软件的产生直到报废的生命周期,周期内有问题定义、可行性分析、总体描述、系统设计、编码、调试和测试、验收与运行、维护升级到废弃等阶段,这种按时间分层的思想方法是软件工程中的一种思想原则,即按部就班、逐步推进,每个阶段都要有定义、工作、审查、形成文档以供交流或备查,以提高软件的质量。但随着新的面向对象的设计方法和技术的成熟,软件生命周期设计方法的指导意义正在逐步减少。

同任何事物一样,一个软件产品或软件系统也要经历孕育、诞生、成长、成熟、衰亡等阶段,一般称为软件生存周期(软件生命周期)。把整个软件生存周期划分为若干阶段,使得每个阶段有明确的任务,使规模大、结构复杂和管理复杂的软件开发变得容易控制和管理。通常,软件生存周期包括可行性分析与开发项计划、需求分析、设计(概要设计和详细设计)、编码、测试、维护等活动,可以将这些活动以适当的方式分配到不同的阶段去完成。

5.2.3 软件开发方法

1.结构化方法

结构化方法是一种传统的软件开发方法,它由结构化分析、结构化设计和结构化程序设计三部分有机组合而成。它的基本思想:把一个复杂问题的求解过程分阶段进行,而且这种分解是自顶向下、逐层分解,使得每个阶段处理的问题都控制在人们容易理解和处理的范围内。

结构化方法的基本要点是自顶向下、逐步求精、模块化设计。结构化分析方法是以自顶向下、逐步求精为基点,以一系列经过实践的考验被认为是正确的原理和技术为支撑,以数据流图、数据字典、结构化语言、判定表、判定树等图形表达为主要手段,强调开发方法的结构合理性和系统的结构合理性的软件分析方法。

结构化方法按软件生命周期划分,有结构化分析(SA)、结构化设计(SD)、结构化实现(SP)。其中要强调的是,结构化方法学是一个思想准则的体系,虽然有明确的阶段和步骤,但是也集成了很多原则性的东西,所以学会结构化方法,不是单从理论知识上去了解就足够的,需要更多的还是在实践中慢慢理解各准则,慢慢将其变成自己的方法学。

2.面向对象方法

面向对象方法(Object-Oriented Method)是一种把面向对象的思想应用于软件开发过程中,指导开发活动的系统方法,简称OO(Object-Oriented)方法,是建立在“对象”概念基础上的方法学。对象是由数据和允许的操作组成的封装体,与客观实体有直接对应关系,一个对象类定义了具有相似性质的一组对象。而继承性是对具有层次关系的类的属性和操作进行共享的一种方式。面向对象就是基于对象概念,以对象为中心、以类和继承为构造机制,来认识、理解、刻画客观世界和设计,构建相应的软件系统。

OO方法作为一种独具优越性的方法已被全世界越来越广泛的接受,它被誉为“研究高技术的好方法”,更是当前计算机软件界关注的重点。

3.软件复用和构件方法

1)复用定义

软件复用(Software Reuse)就是将已有的软件成分用于构造新的软件系统,以缩减软件开发和维护的花费。无论对可复用构件原封不动地使用还是作适当的修改后再使用,只要是用来构造新软件,都可称为复用。被复用的软件成分一般称为可复用构件。软件复用是提高软件生产力和质量的一种重要技术。早期的软件复用主要是代码级复用,后来扩大到包括领域知识、开发经验、项目计划、可行性报告、体系结构、需求、设计、测试用例和文档等一切有关方面。对一个软件进行修改,使它运行于新的软、硬件平台不称为复用,而称为软件移植。

2)基于构件的软件开发方法

传统软件开发过程在重用元素、开发方法上都与基于构件的软件开发(Component-Based Software Development, CBSD)有很大的不同。虽然面向对象技术促进了软件重用,但只实现了类和类继承的重用。中间件技术出现后,软件重用才得到了根本改变。CBSD实现了分析、设计、类等多层次上的重用。图5-3是CBSD重用元素分层实现的示意图。在分析抽象层上,重用元素有子系统、类;在设计层上,重用元素有系统体系结构、子系统体系结构、设计模式、成语、框架、容器、中间件、类库、模板、抽象类等。

图5-3 基于构件的软件开发

在软件开发方法上,CBSD引导软件开发从应用系统开发转变为应用系统集成。建立一个应用系统需要重用很多已有的中间件模块,这些中间件模块可能是在不同的时间、由不同的人员开发的,并有各种不同的用途。在这种情况下,应用系统的开发过程就变成对中间件接口、中间件上下文以及框架环境一致性的逐渐探索过程。传统的软件开发过程是串行瀑布式、流水线的过程;而CBSD是并发进化式,不断升级完善的过程。图5-4显示了传统软件开发过程与CBSD过程的不同。

图5-4 传统软件开发过程与CBSD过程

5.3 软件系统安全

5.3.1 恶意代码

1.恶意代码概述

恶意代码(Unwanted Code)指没有作用却会带来危险的代码。恶意代码又称为恶意软件。比较安全的定义是把所有不必要的代码都看作是恶意的,而不必要代码比恶意代码具有更宽泛的安全含义,包括所有可能与某个组织安全策略相冲突的软件。因为危险程度不同,所以对应的英文也有差异,如Malicious software(恶意的、有敌意的、蓄意的)或Malevolent software(恶毒的),Malicious code、Malevolent code或者简称Malware。从危险程度上看,可以将其划分为两类,一类是轻微危险程度的,另一类是严重危险程度的。

(1)轻微危险程度的定义:指在未明确提示用户或未经用户许可的情况下,在用户计算机或其他终端上安装运行,侵犯用户合法权益的软件。与病毒或蠕虫不同,这些软件很多不是小团体或者个人秘密编写和散播,反而有很多知名企业和团体涉嫌此类软件。有时也称其为流氓软件(Rogue software)。更具体的可称为广告软件(Adware)、间谍软件(Spyware)、恶意共享软件(Malicious shareware)。

(2)严重危险程度的定义:指故意编制或设置的、对网络或系统会产生威胁或潜在威胁的计算机代码。最常见的恶意代码有计算机病毒(简称病毒,Viruses)、特洛伊木马(简称木马,Trojan horses)、计算机蠕虫(简称蠕虫,Worms)、后门(System backdoor)、逻辑炸弹(Logic bombs)等。

恶意代码编写者的一种典型手法是把恶意代码邮件伪装成其他恶意代码受害者的感染报警邮件,恶意代码受害者往往是Outlook地址簿中的用户或者是缓冲区中Web页的用户,这样可以吸引受害者的注意力。一些恶意代码的作者还表现了高度的心理操纵能力,Love Letter(爱虫,情人节病毒)就是一个突出的例子。一般用户对来自陌生人的邮件附件越来越警惕,而恶意代码的作者也设计一些诱饵吸引受害者的兴趣。附件的使用正在和必将受到网关过滤程序的限制和阻断,恶意代码的编写者也会设法绕过网关过滤程序的检查。使用的手法可能包括采用模糊的文件类型、将公共的执行文件类型压缩成zip文件等。

2.恶意代码类型

1)非过滤性病毒

非过滤性病毒包括口令破解软件、嗅探器软件、键盘输入记录软件、远程访问特洛伊和谍件等,组织内部或外部的攻击者使用这些软件来获取口令,侦察网络通信,记录私人通信,暗地接收和传递远程主机的非授权命令,而有些私自安装的P2P软件实际上等于在企业的防火墙上开了一个口子。非滤过性病毒有增长的趋势,对它的防御不是一个简单的任务。

(1)非法访问权限。口令破解、网络嗅探和网络漏洞扫描是公司内部人员侦察同事,取得非法的资源访问权限的主要手段,这些攻击工具不是自动执行,而是隐蔽操纵。

(2)键盘输入记录程序。某些用户组织使用PC活动监视软件监视使用者的操作情况,通过键盘记录,防止雇员不适当地使用资源,或者收集罪犯的证据。这种软件可以被攻击者用来进行信息刺探和网络攻击。

(3)远程访问特洛伊。远程访问特洛伊是安装在受害者机器上,实现非授权的网络访问的程序,如Net Bus和Sub Seven可以伪装成其他程序,迷惑用户安装,如伪装成可以执行的电子邮件,或者Web下载文件,或者游戏和贺卡等,也可以通过物理接近的方式直接安装。

(4)谍件。谍件与商业产品软件有关,有些商业软件产品在安装到用户机上时,未经用户授权就通过Internet连接,让用户方软件与开发商软件进行通信,这部分通信软件就叫作谍件。用户只有安装了基于主机的防火墙,通过记录网络活动,才可能发现软件产品与其开发商在进行定期通信。谍件作为商用软件包的一部分,多数是无害的,其目的多在于扫描系统,取得用户的私有数据。

(5)P2P系统。基于Internet点到点(Peer-to-Peer)的应用程序如Napster、Gotomypc、AIM和Groove,以及远程访问工具通道像Gotomypc,都可以通过HTTP或者其他公共端口穿透防火墙,从而让雇员建立起自己的VPN,这种方式对于组织或者公司有时是十分危险的。因为这些程序首先要从内部的PC远程连接到外边的Gotomypc主机,然后用户通过这个连接就可以访问办公室的PC。这种连接如果被利用,就会给组织或者企业带来很大的危害。

2)内外恶意攻击

(1)逻辑炸弹和时间炸弹。逻辑炸弹和时间炸弹是以破坏数据和应用程序为目的的程序。一般是由组织内部有不满情绪的雇员植入,逻辑炸弹和时间炸弹对于网络和系统有很大的破坏性,Omega工程公司的一个前网络管理员Timothy Lloyd,1996年引发了一个埋藏在原雇主计算机系统中的软件逻辑炸弹,导致了1000万美元的损失,而他本人也被判处41个月监禁。

(2)Zombies(僵尸)。恶意代码不都是从内部进行控制的,在分布式拒绝服务攻击中,Internet的不少站点受到其他主机上Zombies程序的攻击。Zombies程序可以利用网络上计算机系统的安全漏洞将自动攻击脚本安装到多台主机上,这些主机成为受害者而听从攻击者指挥,在某个时刻汇集到一起再去攻击其他的受害者。

(3)其他。近年对聊天室IRC(Internet Relay Chat)和即时消息IM(Instant Messaging)系统的攻击案例不断增加,其手法多为欺骗用户下载和执行自动的代理软件,让远程系统用作分布式拒绝服务的攻击平台,或者使用后门程序和特洛伊木马程序控制之。

恶意代码编写者一般利用三类手段来传播恶意代码,即软件漏洞、用户本身或者两者的混合。有些恶意代码是自启动的蠕虫和嵌入脚本,其本身就是软件。一些像特洛伊木马、电子邮件蠕虫等恶意代码,利用受害者的心理操纵他们执行不安全的代码;还有一些是哄骗用户关闭保护措施来安装恶意代码。

5.3.2 系统漏洞与后门

1.系统漏洞概述

系统漏洞(System Vulnerabilities)指应用软件或操作系统在逻辑设计上的缺陷或错误,被不法者利用,通过网络植入木马、病毒等方式来攻击或控制计算机,窃取其中的重要资料和信息甚至破坏系统。在不同种类的软、硬件设备,同种设备的不同版本之间,由不同设备构成的不同系统之间,以及同种系统在不同的设置条件下,都会存在各自不同的安全漏洞问题。漏洞会影响到的范围很大,包括系统本身及其支撑软件、网络客户和服务器软件、网络路由器和安全防火墙等。

Windows系统漏洞与时间紧密相关。从发布之日起,Windows系统中存在的漏洞会被逐渐暴露出来,这些被发现的漏洞会被微软发布的补丁软件修补,或在以后发布的新版系统中得以纠正。而在新版系统纠正了旧版本中具有漏洞的同时,也会引入一些新的漏洞和错误。例如,Ani鼠标漏洞,由于利用了Windows系统对鼠标图标处理的缺陷,木马作者制造畸形图标文件从而溢出,木马就可以在用户毫不知情的情况下执行恶意代码。因而随着时间的推移,旧的系统漏洞会不断消失,新的系统漏洞会不断出现。系统漏洞问题也会长期存在。

2.系统后门概述

系统后门指绕过安全性控制而获取对程序或系统访问权的方法。在软件的开发阶段,程序员常常会在软件内创建后门程序以便修改程序设计中的缺陷。但是,如果这些后门被其他人知道,或是在发布软件之前没有删除后门程序,那么它就成了安全风险,容易被黑客当成漏洞进行攻击。即使管理员通过改变所有密码类似的方法来提高安全性,仍然能再次侵入,使再次侵入被发现的可能性减至最低。大多数后门设法躲过日志,大多数情况下即使入侵者正在使用系统也无法显示他已在线。因此,后门是系统最脆弱的地方。

不仅Windows系统有后门,UNIX系统也有。系统后门大致有以下几类:密码破解后门,即薄弱的口令账号;Rhosts++后门,即入侵者只要向可以访问的某用户的Rhosts文件中输入“++”,就可以允许任何人从任何地方无需口令便能进入这个账号;Login后门,即入侵者获取login.c原代码并修改,使它在比较输入口令与存储口令时先检查后门口令,这样入侵者就可以长驱直入;服务后门,即入侵者连接到某个TCP端口的Shell,通过后门口令就能获取网络服务。

5.3.3 软件质量、可靠性、测试与容错

无论是恶意代码或软件还是系统漏洞或后门,只要软件质量很高,系统足够可靠,容错性很强,这些问题都是可以克服的。下面介绍软件的质量、可靠性、测试和容错。

1.软件质量

中华人民共和国国家标准《软件工程术语》(GB/T 11457-1995)中,软件质量的定义是:软件产品中能满足给定需求的性质和特性的总和。包括:符合规格说明;具有所期望的各种属性组合程度;用户觉得软件满足其综合期望程度;确定软件在使用中将满足顾客预期要求的程度。

1977年McCall首先提出了软件质量要素包含的内容,后来被转为ISO/IEC 9126-91标准,即软件质量特性有6个,即功能性、可靠性、易使用性、效率、可维护性和可移植性。而McCall认为,软件质量包括11个要素,即正确性、可靠性、效率、完整性、可使用性、可维护性、可测试性、灵活性、可移植性、重复使用性和连接性,并提出了质量要素、评价准则和度量3层度量模型。有学者将软件质量特性细分为21个二级特性,即合适性、精确性、互操作性、依从性、安全性、成熟性、容错性、易恢复性、易理解性、易学性、易操作性、时间特性、资源特性、易分析性、易改变性、稳定性、易测试性、适应性、易安装性、遵循性和易替换性。

2.软件可靠性

在《软件工程术语》(GB/T 11457-1995)标准中软件可靠性(Software Reliability)的定义是:软件可靠性是软件系统在规定的时间内及规定的环境条件下,完成规定功能的能力。运行时间包括软件系统运行后工作与挂起(开启但空闲)的累计时间。规定的环境条件主要是描述软件系统运行时计算机的配置情况以及对输入数据的要求,并假定其他一切因素都是理想的。软件可靠性还与规定的任务和功能有关。由于要完成的任务不同,软件的运行剖面会有所区别,则调用的子模块就不同(即程序路径选择不同),其可靠性也就可能不同。所以要准确度量软件系统的可靠性必须首先明确它的任务和功能。

软件可靠性是软件系统固有的特性之一,它表明了一个软件系统按照用户的要求和设计的目标,执行其功能的正确程度。软件可靠性与软件缺陷有关,也与系统输入和系统使用有关。从理论上说,可靠的软件系统应该是正确、完整、一致和健壮的。但是实际上任何软件都不可能达到百分之百的正确,而且也无法精确度量。一般情况下,只能通过对软件系统进行测试来度量其可靠性。

3.测试的概念

软件测试是利用测试工具按照测试方案和流程对产品进行功能和性能测试,甚至根据需要编写不同的测试工具,设计和维护测试系统,对测试方案可能出现的问题进行分析和评估。执行测试用例后需要跟踪故障,以确保开发的产品适合需求。

系统测试的目的就是尽可能多地发现系统中的问题和错误。因此,系统测试是一个查找错误的过程。由于人性的弱点,系统设计人员负责测试工作是不可取的。一般地说,这部分工作应交给专门的人员来完成。对于一个大型信息系统来说,测试小组应该担当起这项任务,设计人员只是配合其工作。

应该指出,即使通过了系统测试也不能保证程序一定正确,因为测试只能找出程序中的部分错误,而不能证明整个程序无错。况且,没有问题的软件是不存在的。这就是系统交付给用户后也会发现问题的原因。关键是只要达到设计要求,测试就算“成功”完成。一般地说,所有发现问题和错误的活动都可以算是测试。因此,系统交付用户之后,将由用户继续扮演测试角色。值得一提的是,测试工作不只是在编码之后才开始进行,其工作一般从系统可行性阶段就已经开始,而且一直延续到维护阶段。

4.容错性概述

容错性指软件检测应用程序所运行的软件或硬件中发生的错误并从错误中恢复的能力,通常可以从系统的可靠性、可用性、可测性等几个方面来衡量。

容错(Fault Tolerance),确切地说是容故障(Fault),而并非容错误(Error)。例如,在双机容错系统中,一台机器出现问题时,另一台机器可以取而代之,从而保证系统的正常运行。在早期计算机硬件不是特别可靠的情况下,这种情形比较常见。现在的硬件虽然比从前稳定、可靠得多,但是对于那些不允许出错的系统,硬件容错仍然是十分重要的途径。

软件的容错侧重可用性。可用性指在一年的时间中确保系统不失效的时间比率。可测性在容错系统的设计过程中也是一个非常重要的指标,如果无法对某个系统进行测试,又如何能保证它不出问题呢?此外,还有MTBF(故障间的平均时间),即当系统正常运行后能坚持多长时间不失效;MTTR(故障修理的平均时间),即指系统要清除故障所需的时间。MTTR的大小直接影响着系统的可用性,而MTBF则反映了系统的可靠性。

典型案例

系统后门与魔鬼操作员

1.巴林银行的尼克·里森

图5-5 尼克·里森

最出名的“魔鬼交易员”是巴林银行的尼克·里森(见图5-5),他的行为直接导致了有233年历史的老牌银行——巴林银行倒闭。1992年,尼克·里森是巴林银行的一颗新星,凭借其神奇的交易直觉和投资变现,28岁就成了巴林银行新加坡分行期货与期权交易部的总经理,但很快他就失去了交易的感觉,开始出现大幅度亏损。他利用头号交易员和负责交易结算的双重身份将损失通过一个账号为88888的秘密账户进行了掩盖。1995年初,他在日经指数套利期权上的损失已经非常巨大,更糟糕的是在他押注市场向好的第二天,日本的神户发生了严重的地震,日经指数一路下跌。为了挽回巨大的损失,尼克·里森在地震几天后又大量买入日经指数的期货合同,寄希望于日经指数能在地震后快速回升,结果不但没有如愿,还导致更严重的损失。事发后发现尼克·里森共损失了近14亿美元。尼克·里森潜逃时在德国机场被捕,随后被判处6年半刑拘。

2.日本大和银行的井口俊英

图5-6 井口俊英

1995年9月日本大和银行发布消息,该行纽约分行一位高级交易员通过做假账的方式,在过去11年间隐瞒未经授权的交易亏损达11亿美元。消息公布后,许多国家的银行纷纷暂停对大和银行的资金交易活动,致使该行不得不以高出市场半厘的价格拆入资金度难;其股票也被交易所停止交易。此人是1984-1995年间在大和银行纽约分部负债券交易及清算的副行长井口。他既管前线交易又管后线结算,做美国国债交易时出现的亏损就通过制造假会计凭证的方式隐藏。他还一度被称为工作狂,没想到却是一直在疯狂做假账。11年间共做假账30 000多笔,直到1995年7月24日,他致函大和银行董事长,坦白其不轨行为,大和银行管理层才知悉真相。让人难以想象的是,事发的时候井口(Toshihide Iguchi,见图5-6)已经44岁,已在诈骗犯的道路上走了11年。随后,他被纽约地方法院判处4年有期徒刑及200万美金的罚金。

3.法国兴业银行的杰洛米·柯维尔

图5-7 杰洛米·柯维尔

杰洛米·柯维尔(见图5-7)对后台管理极为熟悉,借助以前的工作经验他成功地一边做假账一边做交易。他利用公司资金对欧洲股指期货投下做空的巨额筹码,并创设虚假的对冲头寸。2008年1月兴业银行管理部门发现一笔高达500亿欧元的多头股指期货交易源头不明,才暴露了科维尔的短期疯狂行为。随后,法国兴业银行宣布,由于该名交易员违规购入大量欧洲股指期货,导致银行损失49亿欧元(约合71.6亿美元)。幸运的是次贷危机的爆发在一定程度上帮助法国兴业银行发现问题;否则杰洛米·柯维尔可能创造更高的亏损纪录。事发时他只有33岁。2010年10月因为违反信任、滥用计算机和伪造罪,柯维尔被巴黎法院判5年牢狱,并向兴业银行赔偿49亿欧元损失。

4.瑞士联合银行的阿多博利

图5-8 奎库·阿多博利

奎库·阿多博利(Kweku Adoboli,见图5-8)在1980年出生于加纳一个海滨城市,父亲退休前在联合国任职。阿多博利从小有数学天赋。2003年他毕业于英国诺丁汉大学电子商务和数码业务专业后,先留在诺丁汉,然后去了伦敦。2006年应聘进入瑞银工作。31岁的阿多博利是瑞银交易平台的开放式指数基金交易员。该交易平台帮助客户对一揽子证券进行投机或风险对冲,同时承担银行的自营交易。瑞银内部调查显示,阿多博利涉嫌违规交易,导致瑞银可能遭受的损失从20亿美元升为23亿美元。阿多博利被捕后,伦敦一家法院裁定其犯有欺诈罪,并对他处以7年监禁。

思考题

5-1 什么是计算机语言?什么是软件?什么是程序?

5-2 软件怎么分类?

5-3 程序有哪几种基本结构?程序有几种执行方式?

5-4 简述计算机语言发展历史。

5-5 什么是第四代语言?

5-6 什么是操作系统?

5-7 简述操作系统的历史。

5-8 简述操作系统的功能。

5-9 简述操作系统的分类。

5-10 介绍几种主要的操作系统。

5-11 什么是软件工程?什么是软件生命周期?

5-12 简述结构化方法。

5-13 简述面向对象方法。

5-14 简述软件复用和构件技术。

5-15 什么是恶意代码?

5-16 什么是系统漏洞?什么是系统后门?

5-17 什么是软件质量?什么是可靠性?什么是软件测试?什么是软件容错? bCK3geGyLX1SKjfuSUiVrMpdpDeI3W+ah9DpFK1kCA8H2ljM6FqgUzc6stGz+XS+

点击中间区域
呼出菜单
上一章
目录
下一章
×