【问题标题】:Block java agents without restarting jvm在不重新启动 jvm 的情况下阻止 java 代理
【发布时间】:2020-04-08 19:21:43
【问题描述】:

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

【问题讨论】:

    标签: java jvm java-native-interface javaagents


    【解决方案1】:

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

    不过,这不太可能有助于转储课程。

    如果有人可以访问运行 JVM 的系统,他可能会在 JVM 不知道的情况下访问进程的内存。例如,Serviceability Agent 能够在完全不与 JVM 合作的情况下读取 JVM 内存。有关详细信息,请参阅thisthis 问题。

    There is a trick 使 Serviceability Agent 的使用变得困难,但它仍然不是万无一失的,只要用户有权访问操作系统级别的进程。

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

    【讨论】:

    • 关于删除文件,我在 windows 和 mac 上哪里可以找到它?另外我将如何获得当前的 PID?
    • 既然 OP 说他们无法重新启动 jvm,我想知道他们是否甚至可以阻止代理已经在运行......
    • @I-C 在 macOS 上相同,只是它有一个私有临时目录 $TMPDIR 而不是 /tmp。 Windows 更棘手。在那里你需要覆盖JVM_EnqueueOperation 函数。
    • @Holger 好点。一种可能的解决方案是替换指向所有 JVM TI 函数的指针(这很容易做到)。没有 JVM TI,大多数代理都束手无策。但这当然不是最终的解决方案,因为当恶意代码已经在目标进程中运行时,还有其他方法可以访问加载的类。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-04
    • 2011-09-07
    • 2013-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-23
    相关资源
    最近更新 更多