你可以不必找一个黑客或者解密高手来测试你程序的安全性,也不需要购买一大堆昂贵的黑客工具。但是,你必须有一套处理过程来发现潜在的问题。如果遵从我下面详细介绍的五个处理步骤,你就可以轻松发现一般的开发缺陷。而且一旦发现了这些缺陷,就可以减轻或消除他们。
步骤一:端口扫描
你需要做的第一件事是在客户端和服务器端进行一次端口扫描,找出那些打开但并不需要的通讯端口。各种服务如FTP、NetBIOS、echo、gotd等使用的端口是引起安全问题的典型因素。对于TCP和UDP端口来说,根据经验通常的做法是:关掉任何程序运行所不需要的服务或监听器。
端口扫描被用来检测目标系统上哪些TCP和UDP端口正在监听,即等待连接。大多数的计算机默认地打开了许多这样的端口,黑客和破解者经常花很多时间对它们的目标进行端口扫描来定位监听器,这是他们开始攻击的前奏。一旦这些端口都被鉴别出来,要使用它们也就不困难了。
端口扫描工具,通常叫端口扫描器,很容易在Internet上找到。其中很多是基于Linux的。例如Namp、Strobe、Netcat是比较好的一类。我最喜欢的基于Linux的端口扫描器是Nump。也有许多基于Microsoft Windows的端口扫描器,其中我最喜欢的是Ipswitch的WS Ping ProPack。WS Ping ProPack是一个低开销、多用途的网络问题定位工具,它将许多功能包装成简单易用的形式。
有了端口扫描器后,对全部TCP和UDP端口进行一次完整的检查来确定哪些端口是打开的。将监测到的打开的端口与系统运行所需要用到的端口进行比较,关闭所有没有用到的端口。在Microsoft操作系统中关闭端口经常需要重新配置操作系统的服务或者修改注册表设置。UNIX和Linux系统就简单一些:通常只是将配置文件中的某一行注释掉。
步骤二:检查用户帐户
接下来,需要将目光转移,看看操作系统、任何数据库以及程序自身,特别注意guest用户帐户、默认账户或者简单密码账户以及不需要的用户ID。之所以需要这样做是因为大多数的默认设置留下了许多漏洞,创建了多余的账户,它们可能会被用来危及系统的安全。这种情况在使用数据库系统如Oracle或Web服务器如Microsoft Internet Information Services (IIS)时特别突出。
我曾经通过使用本不该存在或应被禁止的用户ID和密码登陆进入过许多路由其、数据库和应用程序中。例如,若干年前,在测试一个简单的Web应用程序时,我尝试用Guest 账户ID和空密码登陆进系统。很出乎我的意料,程序很爽快地将Guest作为合法用户并允许我登陆。然后我又试了几个其它的账户,如输入用户ID和密码为空/空或管理员/管理员,结果都成功了。
有了这次经验,我总是在软件安装手册的每一章寻找默认的账号和密码。我建立了一份这些默认账号和密码的列表,以确保能够把找到过的都试试。对于程序本身我也这样做,建立一份由程序员创建的测试用户帐户,也把它们试试。
测试这些东西能够帮助发现危害系统的途径,禁用和删除不必须的账户是一种消除找到的缺陷的一种方法。对于通讯端口也有一个相似的方法:禁用任何系统运行所不需要的用户ID。如果某个用户ID不能被禁用,那么至少改变它的默认密码,使其不易被破解。
你会问,怎样才算一个好的密码?它地长度至少为六到八个字符,并含有一个特殊字符。密码必须足够长,以使其不易被破解,但是必须能够容易记住——这是难以两全的。我喜欢使用缩写词或者容易记忆的设备。千万别用任何易猜的单词或习语,这是一个常见的密码失误。同样的,不要使用字典中的单个词语。我记忆最深刻的差密码之一是ROLLTIDE,这是我在阿拉巴马州大学一台被丢弃的机器上发现的(这所大学运动队的昵称是Crimson Tide)。
步骤三:检查目录许可
在关闭了无用端口并禁用了多余的账号后,仔细检查一下程序所用到的数据库和服务器目录的权限设置。很多攻击利用了配置失误的权限,这种方法经常被用来攻击Web服务器。
例如,使用CGI脚本的Web站点有时允许写访问。通过它,一个恶意的供给者可以很简单地在CGI二进制目录下放置一个文件。然后他就能够调用这个脚本文件,Web服务器会运行它,典型地在管理员权限下。能够写并执行脚本是非常危险的,要开放这些权限应该格外小心。
另一个例子,几年前,我给一个安全实验室里的一个非常重要的系统作测试。通过配置失误的权限,我可以在很短的时间内破坏整个实验室以及所有17个被认为是安全的机器。在端口扫描之后,我发现每个服务器都运行了一个FTP监听器,而且每个都允许匿名访问,使得我可以访问每个服务器系统。
FTP监听器给了我对每台机器上真正存放密码文件的访问权限,真是一个巨大的配置失误。由于权限如此设置,我不仅可以下载存放密码的文件,而且可以通过把密码文件中的密码修改后再上传给服务器覆盖源文件而使这些用户“中毒”。当然我将自己授予了root访问权,从而取得了机器的管理员权限。
如果正确地设置了目录权限,我就不能访问被指定给匿名用户使用的FTP目录以外的任何东西。因此,我本不能够得到真正存放密码的文件,更别提将其替换了。当然,如果他们曾经做过任何自己的端口扫描,就像我在步骤一里提到的,那么用这种方法我将哪里也到不了。
步骤四:对数据库也进行和上面同样的设置
文件系统不是唯一因权限设置不当而会受到攻击的对象。大多数的数据库系统有很多安全漏洞。它们的默认权限设置通常不正确,如打开了不必要的端口、创建了很多演示用户。一个著名的例子是Oracle的演示用户Scott,密码为Tiger。加强数据库安全的措施与操作系统一样:关闭任何不需要的端口、删除或禁用多余的用户,并只给一个用户完成其任务所必需的权限。
步骤五:关上后门
你对必须经过几个步骤来测试被应用程序包装得很深的功能感到厌倦了吗?能够建立一个直观的快捷方式吗?其实大家都这么想。问题在于这些快捷方式——也被叫做后门,经常被忽略或遗忘,而有时它们又会不经意地连同应用程序一起被发布。任何严格的安全测试程序都因该包括检查程序代码中不经意留下的后门。
另一个真实的因后门而引发安全问题的例子是Solaris操作系统的早期版本的[Ctrl]K错误。上世纪90年代早期的Solaris用户只需以一般用户身份登陆并按两次[Ctrl]K就可以获得root权限。