如何检测Java代理、JVMTI等。

4

当在不受控制的计算机上运行Java环境时,如何确保安全性?有什么方法可以防止某人创建Java代理或本地JVMTI代理并转储字节码或重写类以绕过许可证和/或其他安全检查?是否有任何方法可以从Java代码中检测是否运行了任何代理?从JNI?从JVMTI代理?


@Andrew Westberg:如果您不希望人们检查您的代码,请将您的代码制作成基于服务器的形式。使计算在服务器端进行:没有人会反向工程GMail服务器端的代码,因为它正在服务器端执行。这对您可能不实用,但对我的公司来说肯定是实用的;) - SyntaxT3rr0r
2
底线是:如果你不能控制机器,那么你就没有真正的控制。这是无法避免的事实。你可以给那些试图这样做的人设置一些障碍..但我不确定这是否值得你的努力。 - Sami Koivu
7个回答

2
如果你无法控制环境,那么很抱歉 - 你真的陷入了困境。是的,你可以通过某种命令行嗅探来寻找琐碎的JVMTI代理,但这只是你的小问题。想想java/lang/Classloader.defineClass()被直接攻击的情况。如果你拥有这台机器,那就很容易做到 - 只需替换rt.jar中的.class文件即可。事实上,在JVMTI出现之前,这是分析器和监控工具对Java代码进行插桩的典型方式。
回到JVMTI - "Late attach"功能还允许在运行时加载JVMTI代理。第一次扫描时可能没有发生这种情况。
最重要的是 - 如果有人可以更改磁盘上JRE的字节,他们可以做任何他们想做的事情。这是否道德,不是。他们能被抓住吗?可能,但你永远赢不了这场战争。

我不使用ClassLoader.defineClass(),因此在那里我不会受到漏洞的影响。我是通过JNI直接将字节码注入到本地的java.dll中。 - Andrew Westberg - BCSH
我不明白为什么。你认为通过java.dll进行操作有什么特殊魔力吗?我觉得java.dll会通过Java再回调来完成这个操作,所以我怀疑你到jvm.dll(实际JVM所在地)的路径并不像你想象的那么干净。但是不能信任的问题依然存在:因为你并不拥有它们,所以java.dll本身可能被篡改,或者jvm.dll也可能被替换成“中间人”DLL,用于监视/操纵所有通过它们的调用。 - Trent Gray-Donald

1

看起来我可以使用一些自定义JNI本地代码的组合来进行检查。

1.) 命令行嗅探以搜索代理。 2.) 确保命令行参数-XX:+ DisableAttachMechanism存在。(这将防止人们附加到我的运行VM)


0

我记得我曾经制作过一个几乎无声的Java代理程序。我想你最好寻找端口扫描器或类似的东西。


0

Java 2安全性、jar文件签名等,可以在一定程度上控制应用程序中加载的内容。

然而,最终如果恶意人士能够访问机器并写入磁盘,那么很可能他们有足够的能力进行危害,而不需要使用巧妙的Java黑客技术。

换个角度思考,在任何语言中,你可以做些什么来检测木马?

对于你关心的机器进行谨慎的访问控制是非常重要的,但这并不容易。如果你认真对待这些问题,安全专家可能看起来有点过于多疑,但这通常意味着他们真正理解风险。


0

如果你无法控制平台,就无法控制其上的软件。

即使你可以关闭你列出的所有检查方法,Java 是开源的。他们可以拿走源代码并重新编译它以内置必要的更改。

此外,请记住,尽管这是您的代码,但这是他们的机器。他们有权检查您的代码,以验证在他们的机器上运行代码是否符合他们的期望,并且不执行可能会产生不良后果的“额外”操作。过去不太可信的公司曾经扫描非相关文件,将敏感信息复制回其主服务器等。


我不完全相信“他们有权利”的说法。至少按照当前的美国版权法来看不是这样。如果我向他们授权使用我的软件,我需要有一定的保障,确保他们不能仅仅在Java平台上绕过我的许可证。 - Andrew Westberg - BCSH
版权意味着他们不能制作未经授权的副本,而不是他们不能检查原件。许可证可能会对软件使用设置条款,并且可能应包括限制反向工程、规避许可代码等条款。但是,您正在许可使用您的软件,而不是使用他们的硬件或JVM。也就是说,这是一种法律解决方案,而不是技术解决方案。从技术上讲,除非您提供带有签名BIOS和加密硬盘的封闭硬件解决方案,否则无法完成,即使如此(XBOX),您的一点小错误也可能打开代码。 - Edwin Buck

0
我会查看命令行,看看是否有任何“-agent”参数。所有分析器、调试器和其他代码修改器都使用这个参数进行内省。您还可以检查引导类路径上的不寻常的JAR文件,因为这些可能也会构成威胁(但请注意,您还必须提供自定义JVM,因为某些软件如Quicktime会将自己添加到运行的所有Java应用程序的引导类路径中...(当我看到这个时,我简直不敢相信我的眼睛...))。

我喜欢扫描cmd行并查找-agent的想法。动态附加代理怎么样?有没有办法从本地代码中检测到它们? - Andrew Westberg - BCSH
看一下VisualVM如何连接到正在运行的JVM并允许实时分析。命令行分析永远无法捕捉到这一点。 - Thorbjørn Ravn Andersen
为了让Visual VM附加JMX,必须启用JMX。他也可以检查一下这个。 - Daniel
1
什么是命令行?在Java中,你无法访问传递给虚拟机的参数。 - maaartinus
@ThorbjørnRavnAndersen:这可能是今天的情况。我的帖子已经8年了 ;) - Daniel
显示剩余3条评论

0
基本上这是一场失败的战斗。
看看Sun JDK中的visualvm如何工作,以及它如何连接到正在运行的进程并重新定义它所想要的任何内容。以可移植的方式极其难以检测到它,除非你能够这样做,否则你最好放弃这种方法。
问题是,你想要避免什么?

1
-XX:+DisableAttachMechanism 看起来可以防止动态附加。 - Andrew Westberg - BCSH
@AndrewWestberg 在Java应用程序启动后,是否有一种通过JMX在程序内部以编程方式禁用附加机制的方法? - opeongo
@opeongo 这个问题已经8年了,所以我已经有一段时间没有在这个环境中工作了。我不知道除了使用命令行之外是否有其他禁用附件的方法。 - Andrew Westberg - BCSH

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接