Hải*_*ong 3 java generics jvm legacy-code
我正在从Oracle http://docs.oracle.com/javase/tutorial/extra/generics/legacy.html阅读本教程
但我无法弄清楚这条线的含义
因此,即使存在未经检查的警告,Java虚拟机的类型安全性和完整性也不会存在风险.
有人可以更清楚地为我解释一下吗?补充:JVM 的" 完整性 " 究竟是什么?" 有风险 "究竟是什么意思?
这意味着JVM永远不会被认为对象是一种它不是的类型.欺骗运行时认为一块数据具有不同的类型是一种强大的攻击向量,特别是如果你可以欺骗运行时允许你为它认为是long或者指定一个值int,但实际上是一个指针.
JVM的基本安全模型依赖于对象是运行时认为它的类型.
我读了一篇引人入胜的论文,详细介绍了对运行Java的机器的攻击,该机器涉及使用加热灯来大幅增加内存错误.然后,他们使用了一个程序,数十亿个对象在内存中策略性地对齐,并等待一个有零星的位翻转.这样做会欺骗JVM认为它正在处理不同类型的对象,并最终允许JVM运行任意代码(对于完整读取,请参阅使用内存错误来攻击虚拟机).
他们使用位翻转的事实与泛型无关.但是,该文章详细介绍了欺骗运行时思考对象的不同类型的能力.总而言之,想象一下你有课程A和B:
class A {
public long data = 0;
}
class B {
}
Run Code Online (Sandbox Code Playgroud)
如果你能以某种方式欺骗JVM允许这样做:
A aButActuallyB = someMagicAssignment(new B());
Run Code Online (Sandbox Code Playgroud)
哪个someMagicAssignment方法可以引用B并以某种方式返回引用对象作为A.后来想想,你会真正发生在你然后做:
aButActuallyB.data = 0x05124202;
Run Code Online (Sandbox Code Playgroud)
您可能正在写入JVM原始内存中的任意数据!例如,该数据可以是方法的位置.将其更改为指向某个字节数组的内容可以让您随后运行任意代码.
所以当Oracle说
即使存在未经检查的警告,Java虚拟机的类型安全性和完整性也不会存在风险.
它的含义是即使你能做到这一点:
public static <T> T someMagicAssignment(B b){
return (T) b; //unchecked cast warning
}
Run Code Online (Sandbox Code Playgroud)
然后调用它:
A a = MyClass.<A>someMagicAssignment(new B());
Run Code Online (Sandbox Code Playgroud)
这仍然会在做一个运行时检查分配到a.
因此,编写该方法someMagicAssignment并不比以前容易.泛型不会以任何方式增加此攻击向量的表面区域,因为JVM在其内部类型系统中忽略了泛型.从来没有JVM允许你给一个方法a List<String>,然后让该方法String对该列表的元素执行操作,而不是在运行时检查元素实际上是Strings.永远不会允许你在没有人工检查B的A情况下将其视为一个.