![]() ![]() |
|
全面保护你的Java程序安全(上) | |
作者:佚名 文章来源:不详 点击数 更新时间:2008/4/18 16:08:23 文章录入:杜斌 责任编辑:杜斌 | |
|
|
第一部分:Java的安全基础——虚拟机和字节码安全 概论:安全问题对很多数人来说都非常重要。从其历史看,Java安全主要意味着虚拟机和字节码安全。然而这个看法忽略了两个重要方面—应用程序和网络安全。在下面一系列文章中,Todd Sundsted讲解了JAVA虚拟机安全,应用程序安全,网络安全,解释了应该采取什么样的措施来全面巩固你的Java安全。在这第一部分,他向我们解释了Java安全的基础:虚拟机和字节码安全。 ·三种安全问题: 在Java初次露面时,开发者,研究人员,新闻媒体界对其安全问题就反响剧烈。在早前的时候,Java安全就是意味着字节码安全和虚拟机安全。由于Java过去主要是作为下载到本地执行的小应用程序开发语言,下载下来的代码的安全性和执行环境就是异常重要的事情。这种情况下的安全意味着正确安装类装载器和安全管理器以及验证下载的代码。 ·安全基础:虚拟机安全 虚拟机安全,长期以来一直是开发人员注意的焦点,几乎直到现在也还是没有结果。 我最初对讨论虚拟机安全感到有兴趣是在转向应用程序和网络安全之前。我决定给予它同另两个部分同样公平的时间来讨论,这出于两个理由:首先,优秀的编程教材因该包含过去6年来发现过的大量漏洞,第二,很多安全问题跨越了我要讨论的三个方面。为了能透彻理解,你必须要全面熟悉三个方面,包括Java虚拟机安全。 ·未验证代码探秘 在JVM通过网络从服务器上下载类代码时,它并没有办法知道这些字节码是否能安全执行。安全的字节码永不会指示虚拟机执行让Java运行时处于不懈调和无效的状态。 当你写完它并运行,程序将向屏幕打印出字符串“56.78”。这是个在类里分配的一个浮点型变量。我们即将修改一处代码,欺骗虚拟机在整型变量上激活toString()方法而不是浮点型变量(你可以从网址下载并修改源代http://www.javaworld.com/javaworld/jw-06-2001/jw-0615-howto.html#resources)。 再来看看这段经反编译后的代码的输出: Method void main(java.lang.String[]) 0 new #3 3 dup 4 ldc2_w #13 7 invokespecial #8 10 astore_1 11 new #4 14 dup 15 sipush 1234 18 invokespecial #9 21 astore_2 22 getstatic #10 25 aload_1 26 invokevirtual #12 29 invokevirtual #11 32 return 上面的代码包含了main()函数的反编译输出。在这个方法的地址偏移量25处,虚拟机载入于偏移0到10处创建的浮点型变量的一个引用。这就是我们要修改的地方。 下面就是经修改后的反编译代码: Method void main(java.lang.String[]) 0 new #3 3 dup 4 ldc2_w #13 7 invokespecial #8 10 astore_1 11 new #4 14 dup 15 sipush 1234 18 invokespecial #9 21 astore_2 22 getstatic #10 25 aload_2 26 invokevirtual #12 29 invokevirtual #11 32 return 这个类在偏移量25处的字节码是完全相同的,载入一个整型变量的引用。 注意看看,修改后的代码仍然是安全的,这非常重要,这意味着JVM仍然将执行代码而不会崩溃或是将错误代码隔离开。然而校验器仍然能分辨出这些变化。在我的系统里,在我运行这片代码时,出现错误: Exception in thread "main" java.lang.VerifyError: (class: Test1, method: main signature: ([Ljava/lang/String;)V) Incompatible object argument for function call 如果你关掉校验器或是你找到一处虚拟机漏洞并非常规地通过了校验器的检查,那非法代码就要启动了。执行下面的命令,我接收到值:1234—整型变量值。 java -noverify Test1 这个列子并无多大害处,但潜在的危害确是巨大的。以上这样的技术如果同虚拟机漏洞联系起来,造成未被检查的代码得以执行,那么这将造成严重的类型混乱。 ·类型混乱 类型的概念对java编程语言来说是浑然一体的。每个值都同一种类型相关联,JVM就是用值的类型来决定什么样的操作可以作用在什么样的值上。 |
|
![]() ![]() |