防止 java 代理在运行时附加

Posted

技术标签:

【中文标题】防止 java 代理在运行时附加【英文标题】:Preventing java agents from attaching at runtime 【发布时间】:2020-04-05 21:30:08 【问题描述】:

根据 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:+DisableAttachMechanism 标志来禁用此功能,但是当我尝试使用jinfo -flag +DisableAttachMechanism &lt;PID&gt; 时,我收到一个异常,告诉我无法在运行时修改此参数。

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

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

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

【问题讨论】:

【参考方案1】:

如果返回 true,则退出:

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

应该防止偶然的用例。

【讨论】:

以上是关于防止 java 代理在运行时附加的主要内容,如果未能解决你的问题,请参考以下文章

带有 socks v5 代理的 java 运行时 6 - 可能吗?

深入理解Java虚拟机——运行时栈帧结构(方法返回地址和附加信息)

防止在页面加载时将后缀添加到资源中

Java类型信息与应用--动态代理

spring-反射动态代理

一个 java 进程能否获取在同一主机上运行的其他 java 进程的 id? [关闭]