제어하지 않는 시스템에서 Java 환경을 실행할 때 Java 환경을 보호하는 방법은 무엇입니까? 누군가 Java 에이전트 또는 원시 JVMTI 에이전트를 만들지 못하도록하고 바이트 코드를 덤프하거나 클래스를 다시 작성하여 라이센스 및/또는 기타 보안 검사를 우회하는 것은 무엇입니까? Java 코드에서 실행중인 에이전트가 있는지 감지 할 수있는 방법이 있습니까? JNI 에서요? JVMTI 에이전트에서?Java 에이전트, JVMTI 등을 감지하는 방법
답변
나는 한때 거의 자동 Java 에이전트를 만들었던 것을 기억합니다. 포트 스캐너 나 그 주위의 것을 더 잘 찾아야 할 것 같습니다.
Java 2 보안, jars 등의 서명은 응용 프로그램에로드되는 내용에 대한 일정 수준의 제어를 제공합니다.
그러나 결국 악의적 인 사람이 컴퓨터에 액세스하여 디스크에 쓸 수있는 경우 Java 해킹을하지 않고도 해를 끼칠 수있는 충분한 가능성이 있습니다.
트로이 목마를 탐지하기 위해 할 수있는 언어는 무엇입니까?
중요한 머신에 대한 신중한 액세스 제어는 중요하지 않지만 필수적입니다. 보안 전문가는 편집증 환자로 보일 수 있지만 실제로는 위험을 실제로 이해하고 있음을 의미합니다.
플랫폼을 제어 할 수없는 경우 소프트웨어를 제어 할 수 없습니다.
나열된 검사 방법을 모두 종료해도 Java는 오픈 소스입니다. 그들은 소스 코드를 가져 와서 필요한 변경 사항을 내장하여 다시 컴파일 할 수 있습니다.
또한 코드가 자신의 컴퓨터라는 것을 기억하십시오. 그들은 코드를 검사하여 자신의 컴퓨터에서 실행하는 것이 예상 한대로 작동하는지 확인하고 바람직하지 않은 "추가"작업을 수행하지 않도록합니다. 예전에는 덜 신뢰할만한 회사가 관련성이없는 파일을 스캔하고 중요한 정보를 홈 서버로 복사했습니다.
나는 그들이 "옳은 것을"전체를 사지 않는다. 적어도 현재의 미국 저작권법에 따르면 아닙니다. 소프트웨어를 사용하기위한 라이센스를 발급하는 경우 Java 플랫폼에서 라이센스를 무시할 수없는 편의성이 필요합니다. –
저작권은 허가받지 않은 사본을 만들 수 없으며 원본을 검사 할 수 없다는 것을 의미합니다. 라이센스는 소프트웨어 사용에 대한 조건을 넣을 수 있으며 리버스 엔지니어링 제한 조항, 라이센스 코드의 우회 조항 등을 포함해야합니다. 그러나 하드웨어 또는 JVM 사용이 아닌 소프트웨어 사용에 대한 라이센스를 취득한 것입니다. 즉, 기술적 인 문제가 아니라 합법적 인 해결책입니다. 엄밀히 말하면 서명 된 BIOS와 암호화 된 하드 디스크가있는 폐쇄 된 하드웨어 솔루션을 제공하지 않으면 XBOX에서 코드를 열 수 있습니다. –
"-agent"매개 변수가있는 경우 명령 줄을보고 확인합니다. 모든 프로파일 러, 디버거 및 기타 코드 수정 자들은 이것을 내성 검사에 사용합니다. 또한 QuickTime과 같은 일부 소프트웨어가 실행중인 모든 Java 응용 프로그램의 bootclasspath에 추가되므로 사용자 정의 JVM을 제공해야한다는 것을 알고 있기 때문에 bootclasspath에서 비정상적인 항아리를 확인할 수도 있습니다. (나는 그것을 보았을 때 내 눈을 믿을 수 없었다 ...)
나는 cmd 라인을 스캔하고 -agent를 찾는다. 에이전트를 동적으로 연결하는 것은 어떻습니까? 네이티브 코드에서 이들을 감지 할 수있는 방법이 있습니까? –
visualvm이 실행중인 JVM에 어떻게 연결되는지 살펴보고 실시간 프로파일 링을 허용합니다. 커맨드 라인 분석은 결코 그것을 잡지 못할 것입니다. –
JMX를 연결하는 비주얼 VM이 활성화되어 있어야합니다. 그는 그것도 확인할 수있었습니다. – Daniel
환경을 통제하지 않으면, 정말 미안해. 네, 일종의 cmdline 스니핑을 통해 사소한 JVMTI 에이전트를 찾을 수는 있지만 그게 당신의 걱정거리가 아닙니다. java/lang/Classloader.defineClass()가 직접 손상되었다고 생각하십시오. 상자를 소유하고 있으면 쉽게 할 수 있습니다. rt.jar의 .class 파일을 바꿉니다. 실제로 JVMTI가 등장하기 전까지는 프로파일 러 및 모니터링 도구가 Java 코드를 구현하는 일반적인 방법이었습니다.
"후기 연결"기능을 사용하면 JVMTI 에이전트를 즉시로드 할 수 있습니다. 처음으로 스캔 할 때 그런 일은 없었을 것입니다.
결론 - 누군가가 디스크의 JRE 바이트를 변경할 수 있으면 원하는 모든 작업을 수행 할 수 있습니다. 그것은 윤리적인가, 그렇지 않은가? 잡힐 수 있습니까? 아마 전쟁에서 이기지 못할 것입니다.
ClassLoader.defineClass()를 사용하지 않으므로 취약하지 않습니다. 나는 바이트 코드를 JNI를 통해 기본 java.dll에 직접 주입하고있다. –
이유가 표시되지 않습니다. 어떤 마법이 java.dll을 통해 가고 있다고 생각하십니까? 나는 java.dll이 돌아 서서 자바를 통해 이것을 호출 할 것이라고 상상할 것이다. 그래서 나는 당신이 생각하는만큼 깨끗한 jvm.dll (JVM이 실제로있는 곳)에 대한 당신의 경로를 의심한다. 그러나 신뢰할 수없는 주변의 요점은 남아 있습니다. java.dll 자체는 사용자가 소유하지 않아 손상 될 수 있습니다. 또는 jvm.dll. 둘 중 하나는 "man in the middle"DLL로 대체 될 수 있습니다. DLL은이를 통해 모든 호출을 모니터/조작합니다. –
기본적으로 이것은 느슨한 전투입니다.
Sun JDK에서의 visualvm의 작동 방식과 실행중인 프로세스에 연결하는 방법을 살펴보고 원하는대로 다시 정의하십시오.휴대용 방식으로이를 감지하는 것은 극히 어렵습니다. 그렇게 할 수 없으면이 방법을 포기할 수도 있습니다.
질문은 무엇입니까?
-XX : + DisableAttachMechanism은 동적 연결을 방지 할 수있는 것처럼 보입니다. –
사용자 지정 JNI 기본 코드 내부에서 여러 검사를 조합하여 사용할 수있는 것처럼 보입니다.
1) 1. cmd 라인을 스니핑하여 상담원을 검색합니다. 2.) cmd-line 매개 변수 -XX : + DisableAttachMechanism이 있는지 확인하십시오. (이는 사람들이 내 VM을 실행하는 것을 막을 것입니다.)
@Andrew Westberg : 사람들이 코드를 검사하지 않게하려면 코드 서버 기반으로 만드십시오. 서버 측에서 계산이 이루어 지도록하십시오. 아무도 서버 측에서 발생하는 GMail의 서버 측 코드를 리버스 엔지니어링합니다. 실용적이지는 않겠지 만 내 회사에게는 확실합니다.) – SyntaxT3rr0r
결론 : 컴퓨터를 제어하지 않으면 실제 제어가 없습니다. 주위를 둘러 볼 방법이 없습니다. 그 일을하려고하는 사람들에게 장애물을 던질 수는 있습니다. 그러나 나는 당신의 노력에 가치가있을 것이라고 확신하지 못합니다. –