3

Java アプリケーションでインストルメンテーション ライブラリを無効にしたり、現在実行中のライブラリがあるかどうかを確認したりすることはできますか?

私の目標は、セキュリティ上の理由から、ユーザーがアプリケーション上でインストルメンテーションの実装を実行できないようにすることです。

いくつかの実験の後、自分で理論的な解決策を思いつきました。その中で、java.class.pathシステム プロパティがパス区切り文字の後に -javaagent VM 引数 jar ファイルのパスで終わることがわかりました。このプロパティから、クラスパス属性の 1 つがプログラム自体で指定されていない外部 jar であるかどうかを確認し、エイリアン jar が検出された場合はアプリケーションを終了できます。

ただし、上記のアプローチはややハッキリしているように思えますが、-javaagent 引数を直接ブロックする方法や、インストルメンテーション エージェント ライブラリを検出する簡単な方法を見つけることができませんでした。これらのよりクリーンな代替手段のいずれかは可能ですか?

4

2 に答える 2

4

Java エージェントも実行時にロードできます。

vm = com.sun.tools.attach.VirtualMachine.attach(pid);
agent = new File("agent.jar");
vm.loadAgent(agent.toString());
vm.detach();

この場合、あなたのコードは機能しないと思います。
次のようにアタッチが許可されているかどうかを確認できます。

SecurityManager sm = System.getSecurityManager();
if (sm != null)
    sm.checkPermission(new AttachPermission("attachVirtualMachine"));
于 2014-08-07T06:51:52.150 に答える
2

さらに調査を行った後、数日前にその場しのぎのクラスパス プロパティ アナライザーを作成した後、確実な解決策を見つけました。

VM 引数を取得するために RuntimeMXBean を使用してから、-javaagent: 引数を確認します。

RuntimeMXBean RuntimemxBean = ManagementFactory.getRuntimeMXBean();
List<String> args = RuntimemxBean.getInputArguments();
for (String arg : args) {
    if (arg.contains("-javaagent:")) {
        // block application from running
    }
}
于 2012-06-01T04:52:58.430 に答える