内在/字节码注释安全

Intrinsic / Bytecode Annotations Security

我目前正在制作一种基于 JVM 的编程语言。我没有使用运算符,而是选择允许符号作为方法名称,并为原始数据类型创建编译器引用 类。这些用所谓的@Intrinsic 注释进行注释,这些注释将字节码指令作为它们的参数。编译器在每次调用时使用这些指令而不是 INVOKE 指令来生成字节码。

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

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

一般来说,如果您可以在 JVM 上执行您选择的代码,那么您就已经可以做任何恶意的事情了。 JVM 很难正确沙箱化。

真正的问题是您的威胁模型是什么。通常,如果您 运行 在您的计算机上编译了一个可执行文件,则假定它能够以当前用户身份执行您可以执行的任何操作。甚至 JVM 在桌面上也遵循这种模型。 (还有 Java 浏览器插件,它试图对从网络加载的小程序执行 Java 级沙箱,不幸的是收效甚微)

JVM 会在使用前验证字节码,字节码的历史与此过程无关。最后,如果存在验证者无法识别的某种无效的、可能是恶意的字节码模式,那么它的危险性并不取决于此字节码模式是使用您的编译器和注释创建的还是手动创建的。

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

但是,让编译器执行合理性检查、静态分析甚至对创建的字节代码执行自己的验证仍然是一个好主意。如前所述,这与安全性无关,如果 JVM 的安全性依赖于您的编译器正确执行所有操作,那么它无论如何都会被破坏。但这是关于可用性的,大多数用户喜欢立即得到错误的响应,而不需要实际 运行 代码来了解它是无效的。