防止 Java 代理在运行时附加

2022-09-03 16:12:02

按照 security.stackexchange 的建议在此处重新发布此内容

如何防止 Java 代理在运行时附加到正在运行的 Java 应用程序?

我能够通过扫描命令行参数来防止用户在启动时使用javaagent启动我的应用程序:

List<String> args = ManagementFactory.getRuntimeMXBean().getInputArguments();
for(String arg : args)
{
    if(arg.contains("-javaagent"))
    {
        System.out.println("Detected Java Agent: " + arg);
        logIncident(0x01);
        Runtime.getRuntime().exit(0);
    }
}

但是,这并不妨碍人们在运行时附加 visualvm 样式。

我听说您可以使用该标志来禁用此功能,但是当我尝试使用时,我得到了一个异常,告诉我无法在运行时修改此参数。-XX:+DisableAttachMechanismjinfo -flag +DisableAttachMechanism <PID>

我考虑的另一种可能性是修改系统安全管理器以禁止所有附加权限(我相信这需要允许java代理附加),但我不确定从哪里开始。

真的非常感谢关于如何实现我已经提出的想法的任何指导,以及任何新想法的建议。

编辑:我创建了一个自定义安全管理器来拒绝所有附加权限,但它似乎不是在附加到的jar中触发的,而是在代理本身中触发的。现在我希望在运行时启用,但我似乎无法在OpenJDK源代码中找到对此的任何引用?DisableAttachMechanism


答案 1

如果返回 true,则退出:

  private static boolean acceptsJavaAgentsAttachingToThisJvm() {
    HotSpotDiagnosticMXBean vm = ManagementFactory.getPlatformMXBean(HotSpotDiagnosticMXBean.class);
    VMOption opt = vm.getVMOption("DisableAttachMechanism");
    return "false".equals(opt.getValue()) || opt.isWriteable();
  }

这应该可以防止随意的用例。


答案 2