2015-02-10 19 views
0

我目前做一个基于JVM的编程语言。我没有使用运算符,而是选择将符号作为方法名称,并为原始数据类型创建编译器引用类。这些注释是以Bytecode指令作为参数的所谓的@Intrinsic注释。编译器使用这些来在每次调用时生成字节码,而不是INVOKE指令。固有/字节码注解安全

我现在想知道这个(公开)注释是否可以用来做任何事情在JVM上的恶意,如果它应该由编译器的限制,例如通过静态分析。

(语言本身也支持字节码表达式)

回答

1

JVM将在使用前验证字节码,并且字节码的历史与此过程无关。最后,如果有一定的无效,可能是恶意的,字节码模式验证者不承认,它的危险性并不取决于这个字节码模式是否是用你的编译器和注释创建或手工创建。

这就是首先验证概念的原因。 JVM并不认为编译器总是没有错误。

但是,让编译器执行合理性检查,静态分析甚至执行自己验证创建的字节码仍然是一个好主意。这不是安全的,正如所说,如果一个JVM的安全将依赖于你的编译器做的一切权利将它无论如何打破。但它是关于可用性的,大多数用户喜欢立即获得错误响应,而不需要实际上运行的代码来了解它是无效的。

0

一般来说,如果你可以在JVM上执行你所选择的代码,你已经可以做的一切恶意。 JVM很难正确使用沙箱。

真正的问题是你的威胁模型是什么。一般来说,如果你在计算机上运行一个编译的可执行文件,它的假设是能够做任何事情你可以做的当前用户。即使JVM在台式机上也遵循这种模式。 (还有一个Java浏览器插件,它试图在从web上加载的小程序上强制执行一个Java级别的沙箱,但不幸很少成功)