2013-06-06 2 views
5

현재 샌드 박스에서 신뢰할 수없는 코드를 가장 잘 수행하는 방법을 이해하기 위해 Java의 보안 메커니즘을 많이 실험하고 있습니다. 보호하고 싶은 것 중 하나는 무한 루프로, 신뢰할 수없는 코드를 자체 스레드에서 실행하는 것이 이상적입니다. 물론 악의적 인 코드는 예를 들어 처리량이 많아 걸려있는 스레드가 될 수 있습니다. 이 스레드를 근본적으로 제거하는 유일한 방법은 Java의 사용되지 않는 Thread.stop() 메커니즘을 사용하는 것입니다. 이것이 문제가되는 가장 큰 이유는 스레드가 보유한 모든 잠금이 해제되어 객체가 손상 될 수 있기 때문입니다.Java : 잠금 획득 모니터링

질문 : Java의 SecurityManager 및 사용자 정의 클래스 로더를 사용하면 어떤 클래스를로드 할 수 있고 어떤 시스템 리소스에 액세스 할 수 있는지 추적 할 수 있습니다. 현재 스레드가 동기화 된 블록에 들어가기 전에 알려주는 콜백을 정의하는 등의 방법으로 코드가 잠금을 획득하는 것을 알리고 잠재적으로이를 금지하는 방법이 있습니까?

답변

4

이미 사용자 정의 클래스 로더를 사용하고 있다면 클래스를로드하기 전에 각 클래스의 바이트 코드를 검사하고 잠금 (monitreterter)을 가져 오는 명령어가 포함되어 있으면이를 감지 할 수 있습니다.

stop()으로 릴리스 된 잠금은 다른 코드가 잠길 수있는 공유 오브젝트에서 획득 한 경우에만 문제가된다는 점도 고려해야합니다. 이러한 객체가 "악의적 인"스레드에서 액세스 할 수 없게되면 안전합니다.

+0

사실, 나는 잠재적으로 잠금을 획득하기 때문에 클래스를 삭제하고 싶지는 않지만 이상적입니다. 물론 자바에서 모든 클래스에 대해 작동하지 않는다는 점을 제외하고는 콜백을로드하고 삽입하는 동안 바이트 코드를 변경할 수 있습니다. *. monitorenter는 VM에게 잠금 장치를 가져 오도록 지시하는 유일한 바이트 코드 명령어입니까? –

+0

그러나 동기화 된 블록을 컴파일 할 때 monitreter는 발생하지만 동기화 된 메서드를 호출하면 잠금 획득이 암시 적입니다. 따라서 스레드가 동기화 된 메서드로 공유 객체에 액세스 할 수 없게해야합니다. 코드가 java. *에 있다면 악의가 없다고 가정해야합니다. –

+0

java. *의 코드는 악의가 아닙니다. 그러나 java. *의 객체가 java.concurrent의 대기열과 같이 공유되는 경우 객체가 외부에서 사용 되더라도 java. *에서 잠금을 가져옵니다. –