在传统的应用开发中开发人员常常为了将为一种机器平台开发的程序移植到其它的平台上而感到头痛Java的出现大大减轻了开发人员的这种负担它的一次编成到处运行(Write OnceRun Anywhere)的功能使开发人员能够开发出跨系统跨平台运行的应用程序现在各种Java应用中都大量使用了Java applet它是一种特殊的Java小程序这些applet能够给人们带来更为活泼更具吸引力的Web页面各种具有Java功能的浏览器如Netscape NavigatorMicrosoft Internet Explorer(MSIE)等会自动下载并执行内嵌在Web页面中的 Java applet
然而Applet在给人们带来好处的同时也带来了潜在的安全隐患它使applet的设计者有机会入侵他人的机器实事求是的讲这个世界上没有一个电脑系统是百分之百安全的 但由于现在Internet和Java在全球应用得越来越普及因此人们在浏览Web页面的同时也会同时下载大量的Java applet就使得Web用户的机器面临的安全威胁比以往任何时候都要大
上述问题到目前为止还没有一种完全的解决方法好在现在Java 的设计者已注意到了这一点并尽其所能加以限制 例如在 JDK 版中就采用逐渐流行的数字签名技术以减少applet可能造成的危险 尽管如此目前Web用户的机器还是很容易受到applet的攻击而且现在用户能够采取的对策并不多在Java applet 四处充斥的今天人们使用具有 Java功能的浏览程序之时对于浏览的网页的地点就不能不多加留意
Web页面中的执行文件到底会带来什么样的潜在危险呢?大致上可分为四类∶更改系统侵犯隐私权非法入侵攫取资源与使用者敌对
恶意之∶更改系统
像 Java 这样功能强大的程序语言不管是在电脑的硬盘上还是在文件系统中都具有修改数据的能力 Java 中包含有许多预先定义好的类(class)其中的方法(method) 可以删除或修改文件更改使用中的磁盘内容杀掉执行程序或其执行线程 (thread) 这些功能很有可能会被applet的设计者滥用更改系统可能是所有潜在危险中最严重的一种Java 的设计者对于限制此类危险已花费了很大的心思相反的ActiveX 则对其引发的可能结果尚未加以限制
所谓的更改系统包括入侵系统在不安全的使用 Java时可能会被applet发现攻击的路径 由于黑客 (hacker) 们总是想方设法利用各种手段入侵他人的电脑系统 ( 取得进入系统与使用权限 )而我们用户能做的不过是小心使用Java而已因此保证Java运行环境的安全最主要的还是Java设计者的责任Java设计得必须保证在用户下载applet时没有其他进入系统的安全漏洞产生
由于Java 可在多种操作平台上运行因此恶意的applet只要在其中一种操作系统(例如Solaris) 上攻击成功 在攻击其它作业系统 ( 例如 Windows NT) 时也能得逞因此Java在带来应用程序跨平台执行的同时也带来了恶意applet的这种跨平台攻击的可能性
利用 Java 来入侵电脑系统并非不可能的事情曾发现许多目前已知的 Java安全漏洞的美国普林斯顿大学安全Internet编程小组(Safe Internet Programming Team)就在实验室中展示了这种攻击型的 applet虽然目前针对已发现的一些安全漏洞已经提供了一些补丁(patch)程序 但其它更为复杂的攻击仍可能潜藏着而未被人们发现
在如今各种重要的电脑系统中这种更改系统型的 applet 攻击对数据造成的破坏是非常严重的如它可能会破坏一些表面上看来很安全的数据库中的财务记录导致公司财务损失而破产或者是窜改医院中病人的病情数据导致医疗不当甚至因此导致病人死亡所以在目前未能打到解决方案的情况下对Java applet的使用要非常小心不要让重要的数据系统暴露在这种新型的攻击危险中
Internet这种全球最开放的系统几乎可以称得上是电脑黑客们的乐园这从Internet上层出不穷的入侵事件便不难看出因此如何使 Java 不致于成为为他们的破坏工具不管是对开发员来讲还是对用户来讲都是一个重要的课题
恶意之∶侵犯隐私权
第二种类型的攻击就是暴露他人电脑主机的秘密数据例如在 Unix 系统中如能访问/etc/passwd( 记录系统中所有使用者的姓名与密码 )这个文件就有可能入侵整个系统
另外电脑系统也可能会造成一些敏感性资料的洩露例如必术不正的公司可以利用商业间谍偷取对手公司的业务计划个人用户对于其私人的电子邮件或财务记录是否可以公开也要慎重考虑任何可藉由电子邮件传送或经由网络传递的秘密资料都有可能受到入侵
利用 Java 的功能会产生双重伪造的可能性典型的电子邮件伪造(mailforging )的情况会更加严重Applet 先使用系统送出假信息以欺骗真的邮件 最后目前许多系统中盛行的声音功能也可能会导致窃听如果攻击者能掌握系统的麦克风就有可能进行窃听的行为 更隐秘的窃听是访问监视进程表(process table )和相关的文件网页式的窃听还可能包括追蹤某一特定使用者所经过的网路连结
Java 对于某些形式的网络攻击可以成功的进行防卫例如文件系统的输入输出操作就受到严格的控制不过这又与 applet 常需要一条通道以便传回数据的要求相违背因为applet 总是必须与原来的服务器一直相连电子邮件的伪造防卫起来则比较困难由于缺乏对客户端连接接口的限制功能电子邮件的伪造不太可能杜绝
恶意之∶拒绝系统服务
拒绝系统服务式的攻击会让系统资源无法正常使用通常的做法是利用一个执行程序吸取超过正常系统所分配的资源甚至是霸占整个系统这类攻击还可分为几个小的类型例如填满文件系统或用光所有可用的文件资源调用所有系统的内存产生数以千计的窗口以便有效的阻止屏幕输出或找开新的窗口产生许多高优先权的执行线程以耗光 CPU的执行周期 虽然这一类危险的破坏作用也很大但它们似乎并未引起Java 的设计者的重视
人们对防止这种攻击的重要性还有些争议在大部分情况下拒绝系统服务式的攻击比较接近与使用者敌对的攻击因为从此类攻击中使系统恢复正常一般比较容易只需要重新启动系统即可不过即使如此在一些重要的系统中也可能会造成严重的后果人们当然谁也不希望在与重要的系统连结时重新启动系统吧例如在处理股票交易的机器上蓄意拒绝系统服务其造成的损失将难以想像的
拒绝系统服务式的攻击是 Java 常见的安全问题之一 现在Internet上有一个专门介绍此类问题的站点这就是Mark La Due的Hostile Applet主页(~maladue/) 中不兴趣的读者不妨一看在这里面介绍了许多实际的例子要制造这种类型的攻击实际上并不难不过由于目前 Java 的安全模型并没有提供很好的解决办法因此对它的防范却比较困难