在不重新启动 jvm 的情况下阻止 java 个代理

Block java agents without restarting jvm

我需要阻止 java 代理修改或读取 JVM。这样做的原因是我有一个安全的启动器系统,可以远程下载应用程序的敏感部分。不幸的是,有人使用某种 class 转储程序来下载安全的 classes。我做了一些搜索,发现 -XX:+DisableAttachMechanism 应该禁用它们连接。问题是我无法重新启动 jvm,或修改起始参数。如果有帮助的话,我确实可以访问 JNI(不过仍然需要 windows、mac 和 linux 兼容性)。

在运行时禁用 HotSpot 动态附加机制很容易 - 您只需删除附加套接字 /tmp/.java_pidPID(其中 PID 是目标进程 ID)。如果没有这个文件,先通过运行 jcmd PID VM.version.

激活attach机制

虽然这不太可能有助于倾销 类。

如果有人可以访问运行 JVM 的系统,他可能可以在 JVM 不知道的情况下访问进程的内存。例如,Serviceability Agent 能够读取 JVM 内存,而无需 JVM 的任何合作。有关详细信息,请参阅 this and 个问题。

使可服务性代理的使用变得困难,但它仍然不是万无一失的,只要用户有权访问 OS 级别的进程。

如果您真的想保护您的 JVM 进程,您必须使用 OS 安全功能来做到这一点,包括用户帐户、ACL、功能、cgroup 等。