每天十分钟,熟读一个技术点,水滴石穿,一切只为渴望更优秀的你!
————零声学院
连接网络的主机,特别是连接因特网的主机,比没有连接入网络的主机会暴露出更多的安全问题。安全问题。网络安全性高可以降低连接网络的风险,但就其性质而言,网络访问和计算机安全性是矛盾的。网络是一条数据高速公路,它专门用来增加对计算机系统的访问,而安全性却需要控制访问。提供网络安全性是在公开访问与控制访问之间的一种折中。
我们可以将网络想象成高速公路,它就像高速公路一样为所有的访问者——无论是受欢应的访问者还是不受欢应的黑客(hacker,在网络上非法入侵别人机器的人)——提供相等的访问权。通常,我们是通过锁门来为财产提供安全性的,而不是封锁接到。同样, 网络安全性一般是指对单台主机提供何时的安全性,而不是直接在网络上提供安全性。
在很多小城镇中,人们相互之间都互相认识,因而房门往往是不锁的。但在大城市中, 房门安装了笨重的门闩和链条。在短短的十几年中,因特网已从一个只有数十个用户的“小镇”发展到具有数百万用户的“大城市”。就像大城市使邻居之间变得陌生一样,因特网的飞速发展减少了网络邻居之间的信任度。对计算机安全性要求的增长是一个负效应,但这种发展并不是一件坏事情。一个大城市可以提供更大的选择余地和更多的服务,同样,扩展后的网络也可以提供日益增加的服务。对大多数人来说,安全只是访问网络时需要考虑的一小部分。
随着网络的发展,其越来越社会化,网络的非法入侵事件也有增无减。但是,这些入侵的十几程度常常被大大的夸大了。对侵入迹象的反应过度会阻碍对网络的正常利用,因此一定要对症下药。有关网络安全性的最好建议是尊重常规,在 RFC1233 中很好的阐述了这一原则:
“尊重常规是用来确定安全策略的最何时的准则。精心设计的安全性方案和机制,诚然是令人佩服的,也确实可以充分发挥作用,但应兼顾控制的简单性,即实施其方案时, 在经济和时间上的投资也必须予以充分考虑”。
1996 年初,五角大楼宣布其计算机系统在 1995 年遭到 215 万次非法入侵。更令人不安的是大多数非法入侵未被察觉。这些非法入侵给国家安全带来的影响程度还未确定,但是已发现的非法入侵多数是针对计算机系统所存放的敏感信息,其中有三分之二的非法入侵是成功的,黑客盗窃、修改或破坏了系统上的数据。
同时,我们也应该以严肃的态度来考虑企业间谍无处不在这个问题。有很多公司并没
有充分的准备来对付非法入侵者,甚至没有意识到它们的存在,有些公司还没有看到这些威胁对它们的影响。事实上,计算机在线社会是人类生存的真实社会的仿制品,在电子空间中有许多不道德的人不断侵犯各种计算机系统上的安全系统,还有一些并非不道德的人出于某种心理在电子空间徘徊并和用户开一些玩笑来嘲笑用户的安全性。
事实上,网络从其出现的一开始就受到黑客们的攻击,下面是历史上著名的几次网络
事故:
1988 年 9 月,著名的蠕虫程序(worm)被传播到因特网上,造成因特网的瘫痪, 使许多网络不能连接到因特网上。
1991 年 5 月,在 Biscay 海湾发生了一起由于网络被非法入侵而造成的沉船事故。
这是由于欧洲气象预报中心的计算机系统被网络黑客侵入,造成气象预报卫星不能正常工作,导致一场暴风雨的预报失误而酿成的悲剧。
1993 年 6 月,美国一家医院连接到网络上的一些化验报告,其数据被黑客侵入后将阴性改为阳性,许多被化验者因此误认为自己患上了癌症。
在过去的十几年中,网络黑客们一直在通过计算机的漏洞对计算机系统进行攻击,而且这种攻击方法变得越来越复杂。
1988 年,大部分入侵者的方法仅是靠猜测口令,利用系统的配置不当、以及系统上软件本身的漏洞。到了 1998 年,这些方法仍被使用,但又增加了新的手段。有些入侵者甚至通过读取操作系统源代码的方法来获取系统的漏洞,并以此展开攻击。一些网络黑客编写的攻击站点的工具软件,在因特网上也可以容易的得到,这就给网络安全带来了更严峻的挑战。
正是由于这些在线犯罪,FBI 的国家计算机犯罪小组建议采用防火墙作为防止计算机犯罪的措施。虽然 NCCS 还有其它安全措施,但是普遍认为采用防火墙是防止 Intranet 被入侵的最好方法。
其他被推荐的措施有:
对非法访问的登录进行横幅警告。显示在登录屏幕上,警告那些非法用户,它们正在进入一个受保护的系统。
键盘级监控。这个安全措施十几上是捕捉在某台工作站上的键盘敲击并记录在文件中。这些文件经管理员查看后确定是否有非正常方式,如从一台工作站上出现多次登录失败等。
捕捉、跟踪来自电话公司的服务。这种服务允许用户的公司截取进来的电话并跟踪到出发点,并找出和排除非法的远程访问。
呼叫者 ID。这种服务(现在家庭用户中也很流行)识别进入系统的号码和姓名, 能够在一开始就识别并排除非法的远程访问。
电话截取。这种服务(与呼叫者 ID 有关)允许某些电话号码被阻止接通到电话系统。例如。假设调制解调器(远程访问系统)接收到一个来自某大学宿舍的一个数字电话,可以截取这个电话号码(可以自己打个电话到学校机关)。
数据加密措施。可以用加密和解密软件来“搅乱”数据,使多数黑客没有兴趣登录到系统。
防火墙。所有这些安全措施中,防火墙是最具有防护性的。因为它可以根据需要
设计并安装在系统中的最重要部位。如果将防火墙与其他一些安全措施相结合,会得到一个对公司的数据和 Intranet 最佳的安全措施。
信息系统安全的脆弱性
黑客攻击网络已有十几年的历史。它们的攻击方法包括:猎取访问路线、猎取口令、强行闯入、改变与建立 UAF(用户授权文件)记录,偷取额外特权、引入“特洛伊木马” 软件掩盖其真实企图、引入命令过程或程序“蠕虫”把自己几声在特权用户上、清理磁盘、使用一个节点作为网关(代理)到其他节点上以及通过隐蔽信道进行非法活动等。
黑客使用很多工具进行攻击,例如 Rootkit 工具、特洛伊木马和轨迹跟踪等。SATAN 工具专门用来查找和分析一个网络安全的薄弱环节。Aita Vista 工具可以用来查找一个网络的脆弱部分或者黑客敏感的信息。
黑客在网络上经常采用的攻击手段是:利用 UNIX 操作系统提供的 telnet、ftp 和 remoteexec 守护进程等缺省帐户进行攻击。另外,黑客还可以采用 UNIX 操作系统提供的命令 finger 与 rusers 等收集的信息不断提高自己的攻击能力;利用 sendmail 漏洞,采用 debug 工具、wizard 工具、pipe 机制、假名及 Ident 守护进程进行攻击;采用 ftp 的匿名访问进行攻击; 利用 NFS 的漏洞进行攻击;利用 CGI 程序的漏洞进行攻击;通过 rsh、rlogin、rexec 守护进程以及 X Windows 等方法进行攻击。
网络黑客之所以能够得逞,是因为信息系统本身存在一些安全方面的脆弱性。
下面是信息系统在安全方面存在的一些问题:
1. 操作系统安全的脆弱性
操作系统的体系结构造成操作系统本身的不安全,这是计算机系统不安全的根本原因。操作系统的程序可以动态链接,包括 I/O 的驱动程序与系统服务,都可以用打补丁的方式进行动态链接。Linux 操作系统的许多版本升级开发都是采用打补丁的方式进行的。这种方法厂商可以使用,黑客同样也可以使用。这种动态链接是计算机病毒产生的好环境。一个靠升级与打补丁开发的操作系统不可能从根本上解决安全问题,但操作系统支持程序动态链接与数据动态交换又是现代系统继承和系统扩展的必备功能,因此这是互相矛盾的。
操作系统支持在网络上传输文件,包括可执行的映象文件,即在网络上加载程序。这样也破坏了系统的安全性。
操作系统不安全的另一个原因在于它可以创建进程,甚至支持在网络的节点上创建和激活远程进程,更重要的是被创建的进程可以继承创建进程的权限。这一点与上一点(可以在网络上加载程序)结合起来就构成了可以在远端服务器上安装“间谍”软件的条件。若再加上把这种间谍软件以补丁的方式“打”在一个合法的用户上,尤其“打”在一个特权用户上,间谍软件就可以使系统进程与作业的监视程序都检测不到它的存在。
操作系统通常都提供守护进程。这种软件实质上是一些系统简称,它们总在等待一些条件的出现。一旦有满足需要的条件出现,程序便继续运行下去。这样的软件都是黑客可以利用的。这里应该说明的是:关键不在于有没有守护进程,而在于这种守护进程在UNIX、Windows NT 操作系统上是否具有与操作系统核心层软件同等的权力。
操作系统提供远程过程调用(RPC)服务,RPC 服务本身也存在一些可以被非法用户利用的漏洞。
操作系统提供 debug(调试器)程序。许多研制系统软件的人员,它们的基本技能就是开发补丁程序和系统调试器。掌握了这两种技术,它们就有条件从事黑客可以从事的事情。
操作系统安排的无口令入口是为系统开发人员提供的便捷入口,但它也是黑客的通道。另外,有些操作系统还有隐蔽的通道。
2. 计算机网络安全的脆弱性
Iternet/Intranet 使用的 TCP/IP 协议以及 FTP、E-mail、RPC 和 NFS 等都包含许多不安全的因素,存在许多漏洞。
许多人都知道,1988 年 Robert Morries 在 VAX 机上用 C 语言编写了一个通过 GUESS 软件,根据搜索的用户名字来猜测机器密码口令的程序。结果是该程序自 1988 年 11 月开始在网络上传播依赖,几乎每年都给因特网上的系统造成一亿美元的损失。
黑客通常采用源端口、源路由、SOCKS 、TCP 序列预测或者使用远程过程访问(RPC)进行直接扫描等方法对防火墙进行攻击。
3. 数据库管理系统安全的脆弱性
数据库管理系统的安全必须与操作系统的安全相匹配。由于数据库的安全管理同样是建立在分级管理的基础之上的,因此 DBMS 的安全也是脆弱的。
4.缺少安全管理
世界上现有的信息系统绝大多数都缺少安全管理员,缺少信息系统安全管理的技术规范,缺少定期的安全测试与检查,更缺少安全监控。
我国许多企业的信息系统已经使用了许多年,但计算机的系统管理员与用户的注册还出于缺省配置的状态。
从某种意义上讲,缺少安全管理是造成系统不安全的最直接因素。因此,如果要提高整个系统的安全性,首要的任务就是找一位专门管理系统的人员,由他来维护和监督系统的安全。
大部分计算机安全问题是由于管理不当,而不是由于系统软件的漏洞。严谨的管理将会大大减少系统被非法入侵的可能性。
下面是一些常见的安全漏洞。
1. 特权软件的安全漏洞
IFS
一种攻击的方法是通过 IFS(Input Files Separator,输入字段分隔符) shell 变量来实现的。该变量用于决定传给 shell 字符串的分隔符。例如,一个程序调用函数 system()或 popen()执行一个 shell 命令,那么该命令首先由 shell 来分析,如果执行的用户可以控制 IFS 环境变量,就可能会导致不可预测的结果。
这是一个典型例子:如果程序执行如下的代码:
system(“/bin/ls –l”);
如果 IFS 变量被设置为包含”/”字符,而一个恶意的程序被命名为 bin 并且放在用户的path 变量那,则该命令会被解释成 bin ls –l,它执行程序 bin 并带有两个参数 ls 和-l。为了防止这种情况的发生,一个程序应该尽量不要使用 system()、popen()、execlp()、和 execvp() 这些依赖外部环境的函数来运行其他程序,而应该使用 execle()这样自行传递环境变量的函数。
下面是一个设置 IFS 变量的命令行指令:
%setenv IFS / #C shell
$IFS=/ #B shell
$export $IFS HOME
另一个攻击方法是通过使用 HOME 环境变量。
通常,csh 和 ksh 在路径名称中用字符”~”来代替 HOME 变量。因此,如果一个入侵者能改变 HOME 变量的值,就能利用一个使用字符”~”作为 HOME 命令的 shell 文件来达到目的。
例如,如果一个 shell 文件用~/。rhosts 或者$HOME/。rhosts 指向用户指定的文件,就有可能被人通过在执行命令前重新设置 HOME 环境变量的方法来进行破坏活动。
PATH
使用 PATH 攻击方法的特征是,利用 PATH 环境变量中文件路径的值和顺序。不合理的路径顺序会导致意外的结果——如果执行的命令不是以绝对路径的方式执行。例如,用下面的方式指定 PATH:
PATH=。/:/usr/bin:/bin:/sbin
如果有人在当前路径创建了一个名为 ls 的文件,它就会比/bin/ls 先执行。如果该文件包括如下内容:
#! /bin/sh
/bin/cp /bin/sh /tmp/。secret 2>/dev/null rm –f $0
exec /bin/ls “$1”
该代码会暗中创建一个/bin/sh 的拷贝,它在执行时会以执行该文件的用户的身份被执行。此外,它消除证据,使用户在执行该命令时感觉不到是在执行另外一个程序。
缓冲区溢出
由于不好的编程习惯,也会导致软件本身的安全漏洞。在这个方面最典型的例子是Morris 蠕虫攻击程序。该漏洞是由于系统调用 gets()(系统调用 fgets()没有这个问题)时不检查参数的长度而造成的。这使得在用户的控制下缓冲区会溢出。因此,在正常情况下,程序在遇到缓冲区溢出时会停止运行。而如果用户对操作系统很熟悉,就可以使程序在遇到缓冲区溢出时转而运行另一个程序。
设想如下情况,一个特权程序(suid )在遇到缓冲区溢出后转而执行一个 shell,那么这时的普通用户就变成得来 root 用户。因此,缓冲区溢出问题是非常严重的。据统计,有70%以上的成功的非法入侵是通过缓冲区溢出来实现的。另外还有几个系统调用也存在同样的漏洞,如 scanf()、sscanf()、fscanf()和 sprintf()。
umask 值
一个程序员经常犯的错误是,umask(缺省的文件保护掩码)的设置不正确。许多程序没有检查 umask(的值,而且经常忘记指定新建文件的保护掩码值。程序创建了一个新文件,却忘记改变其保护模式而使之安全。黑客们经常可以利用这一点,更改可写的文件从而获取特权。
因此,在创建一个新文件之前,一定要先用 Linux 提供的系统调用 umask()设定一个正确的 umask 值。
状态返回值
另一个程序员经常犯的错误是程序不检查每个系统调用的返回值。在程序设计时程序员往往会认为某些系统调用总是正确执行的。但是,如果一个黑客可以控制他的运行环境, 那么他就可以设法使一个在程序中被认为是永远正确的系统调用产生错误。这会使用户的程序产生不可预测的结果。
捕捉信号
一般,程序员编写的程序不捕捉它可以接收的信号,这一点也常常被黑客们所利用。例如,一个黑客将其 umask 设置为一个适当的值,然后向一个没有正确捕捉信号的特
权程序发送 SIGQUIT 信号——该信号导致该程序产生 core 文件。此时,该 core 文件的所有者是执行该程序的 UID,但是它的保护掩码是 umask 设定的,黑客可以读取这个文件。黑客就可以进一步利用 gdb 等工具来读这个core 文件,从而可能获取系统上的重要信息。
队列边界检查
这个漏洞与前面讲述的“缓冲区溢出”问题是密切相关的。
典型的情况是,程序中使用了固定长度的数组变量,而在执行时却不检查其中的数据是否超过数组边界,从而导致程序出现不可预测的结果。
2.特洛伊木马程序
特洛伊木马程序与一般用户想要执行的程序从外观上(如文件名)看很相似,例如编辑器、登录程序或者游戏程序。这种程序与一般用户想要执行的程序表面上很相似,但是却完成其他的操作,例如删除文件、窃取密码和格式化磁盘等。等到用户发现,却为时已晚。
特洛伊木马可以出现在很多地方。它们可以出现在被编译过的程序中,也可以出现在又系统管理员执行的系统命令文件中。有的特洛伊木马程序还可作为消息(例如电子邮件或发给终端的消息)的一部分发送。一些邮件头(mail headers)允许用户退到外壳(shell) 并执行命令,该特性能在邮件被阅读的时候激活。给终端发送特定的消息能在终端上存储一个命令序列,然后该命令序列被执行,就好像在终端上直接从键盘输入一样。编辑器初始化文件(如 vi 对应的.exrc 文件)也是经常出现特洛伊木马的地方。
特洛伊木马程序非常普遍。黑客们经常以多种方式改变系统,以便在最初的攻击活动被发现后,还可以进入系统。这也使一个被攻破的系统很难恢复。因此为了找出特洛伊木马,有必要搜索整个系统。
3.网络监听及数据截取
计算机网络安全中的一个重大问题是计算机之间传输的数据可以很容易的被截取。在过去大型主机的时代,这不成为威胁,因为在那种系统上数据的传输处于系统的控制之下。但由于异种机的互联,敏感数据的传输会处于系统的控制之外,有许多现成的软件可以监视网络上传输的数据。尤其脆弱的是总线型网络(例如以太网),这种网络上发送给每个特定机器的数据都可以被网络上的任何机器截取到。
这意味着任何数据都可以被截取并用于不同的目的,不仅仅包括敏感数据,还有信息交换(例如登录顺序,包括口令)。数据截取并不一定要从网络本身截取。通过在网络软件上或应用程序上安装特洛伊木马,就能截取数据并保存到磁盘上以备后用。
4.软件之间的相互作用和设置
计算机安全受到威胁的根本原因是计算机系统的运行的软件日益增长的复杂性。任何一个人都不可能编写整个系统,因此也无法预测系统那每个部分之间的相互作用。一个例子是/bin/login 的一个问题,它接收其他一些程序的非法参数,从而可以使普通用户成为超级用户。
5.研究源代码的漏洞
许多入侵者是通过研究一些程序的源代码而成功的攻击系统的。通常,这种源代码可以免费下载得到,这使得许多人可以研究它,并找出里面的潜在漏洞。过去这种攻击方法还很少见,而如今却非常普遍。从某种意义上讲,这也是一种好事。因为它可以促进程序员改正软件错误,也使人们了解一些软件编程的方法。