java - 防止 Java 代理在运行时附加

标签 java security reverse-engineering

按照 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 <PID> 时我收到一个异常,告诉我无法在运行时修改此参数。

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

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

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

最佳答案

如果返回 true,则退出:

  private static boolean acceptsJavaAgentsAttachingToThisJvm() {
    HotSpotDiagnosticMXBean vm = ManagementFactory.getPlatformMXBean(HotSpotDiagnosticMXBean.class);
    VMOption opt = vm.getVMOption("DisableAttachMechanism");
    return "false".equals(opt.getValue()) || opt.isWriteable();
  }
这应该防止偶然用例。

关于java - 防止 Java 代理在运行时附加,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59305451/

相关文章:

javascript - 检查输入并将其转换为适当的类型以防止 XSS

c++ - 英特尔引脚 : how to detect realloc size

c++ - 混淆 C++ 中的变量和函数名称以防止基本逆向工程

java - 关于JAVA和Linux的一些基本概念 : PATH variable in LINUX and class location by JVM

javascript - 即时解析 Markdown

java - 由 : java. lang.IllegalArgumentException : org. hibernate.QueryException 引起:无法解析属性:

windows - 语言中立的文件系统访问规则

ios - SourceDNA 如何跟踪应用程序使用的 SDK

java - 如何在没有 ChromeDriver.exe 的情况下从 Selenium Remote Webdriver 启动 Google Chrome

java - XML 序列化真的与 XML 数据绑定(bind)不同吗?如果不同,又有何不同?