2012-05-23 6 views
2

Java 응용 프로그램에서 계측 라이브러리를 비활성화하거나 현재 실행중인 응용 프로그램이 있는지 확인할 수 있습니까?계측 라이브러리 사용 안 함

내 목표는 보안상의 이유로 사용자가 응용 프로그램에서 계측 구현을 실행하지 못하도록하는 것입니다.

java.class.path 시스템 등록 정보가 경로 분리 문자 다음에 -javaagent VM 인수 jar 파일의 경로로 끝나는 것을 발견 한 몇 가지 실험 후에 독자적으로 이론적 인 해결책을 제시했습니다. 이 속성에서 클래스 경로 속성 중 하나가 내 프로그램 자체에서 지정하지 않은 외부 jar인지 확인한 다음 외계 항아리가 감지되면 응용 프로그램을 종료 할 수 있습니다.

그러나 위의 방법은 나에게 다소 해로운 것처럼 보일 수 있지만 -javaagent 인수를 직접 차단하는 방법이나 계측 에이전트 라이브러리를 찾는 간단한 방법을 찾을 수 없었습니다. 이러한 더 깨끗한 대안 중 하나가 가능합니까?

+1

내가 대답을 잘 모릅니다하지만 java.lang.Instrumentation 권한을 거부 시도? – mprabhat

+0

모르겠지만 아무도 신경 쓰지 않으면 RuntimeMXBean을 사용하여 VM 인수를 얻은 다음 -javaagent : 인수를 확인합니다. RuntimeMXBean RuntimemxBean = ManagementFactory.getRuntimeMXBean(); 리스트 args = RuntimemxBean.getInputArguments(); – Vulcan

+0

결과를 게시 해 주셔서 감사합니다. 답글로이 덧글을 추가하고 올바른 것으로 표시하여 나중에 검색하는 사람들을 도울 수 있습니다. – mprabhat

답변

2

더 많은 연구를 한 후, 나는 임시 변통 클래스 패스 분석기를 작성한 후 며칠 전에 견고한 해결책을 찾았습니다.

저는 RuntimeMXBean을 사용하여 VM 인수를 얻은 다음 -javaagent : 인수를 확인합니다.

RuntimeMXBean RuntimemxBean = ManagementFactory.getRuntimeMXBean(); 
List<String> args = RuntimemxBean.getInputArguments(); 
for (String arg : args) { 
    if (arg.contains("-javaagent:")) { 
     // block application from running 
    } 
} 
+0

파티가 좀 늦었지만 자신의 응용 프로그램을 "-XX : + DisableAttachMechanism" 이 매개 변수가 시작시 존재하지 않으면 매개 변수. 물론 사용자는 바이트 코드를 조작하여이 문제를 해결할 수 있습니다. 런타임에 에이전트를 연결하면 솔루션이 작동하지 않습니다. – Frunk

2

자바 에이전트는 런타임에로드 할 수 있습니다 :

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")); 
+0

좋은 캐치, 고마워. 그러나 이것은 문제에 대한 해결책을 제공하지 않기 때문에 실제로 답이 아닙니다. 대신, 그것은 받아 들여진 대답에 대한 논평이되어야하는 것처럼 보입니다. – Vulcan