728x90

현재 Java 21에서는 실행 중인 JVM에 에이전트를 동적으로 로드할 때 경고를 발생시키도록 변경되었다. 이는 향후 릴리스에서 기본적으로 동적 에이전트 로딩을 금지하기 위한 준비 단계로, 애플리케이션의 무결성과 보안을 강화하기 위한 조치를 한 것이라고 한다.

 

여기서 에이전트 (Agent) 란?

Java 에이전트 (Agent)는 JVM (Java Virtual Machine)에서 프로그램의 실행 중간에 개입해 동작을 변경하거나 분석할 수 있는 특별한 모듈임. 주로 성능 모니터링, 디버깅, 트래픽 분석, 보안 검사 등을 위해 사용된다.


 

그러면 어플리케이션이 로딩 되면서 에이전트가 무엇을 하길래 금지를 시킬까?

 


에이전트의 주요 역할

1. 바이트코드 조작 (Bytecode Manipulation)
   - 실행 중인 클래스의 바이트코드를 변경하거나 주입할 수 있다.
   - 예를 들어, 메서드 호출 전에 로그를 남기거나, 특정 메서드의 실행 시간을 측정할 수 있다.
2. 프로파일링 (Profiling)
   - CPU 사용량, 메모리 사용량, 메서드 호출 빈도 등을 측정해 성능 분석을 한다.
3. 보안 검사 (Security Monitoring)
   - 악의적인 코드 실행을 방지하고 보안 정책을 강제할 수 있다.
4. 트랜잭션 관리
   - 분산 환경에서 트랜잭션 추적로그 수집에 사용됩니다.
   - 예: APM (Application Performance Monitoring) 툴


에이전트를 동적 로딩을 금지하면서 취할 수 있는 이득은?

동적 에이전트 로딩실행 중인 JVM에 외부 에이전트를 주입해 코드의 동작을 변경하거나 모니터링할 수 있다. 이 과정에서 심각한 보안 이슈가 발생할 수 있습니다. 아래는 그 이유이다.

1. 임의의 코드 실행
동적 에이전트를 통해 JVM 내부에서 임의의 바이트코드를 주입할 수 있다. 예를 들어, 악성 에이전트가 System.exit() 호출을 우회하거나, 데이터베이스 접근 코드를 삽입해 기밀 정보를 유출할 수 있다.

더나아가 루트 권한으로 실행되는 JVM의 경우, 시스템 전체를 장악하는 심각한 보안 위험을 가져올 수 있다.

2. 무결성 침해
동적 에이전트는 JVM 실행 중에 클래스의 바이트코드를 변경할 수 있다. 예를 들어, 권한 검사를 우회하거나, 보안 검사 코드를 비활성화시킬 수 있다.

이로 인해 암호화 모듈이 변조되어 평문 데이터를 유출할 수 있어 API 요청 검증 로직을 무력화 될 것이다.

3. 메모리 및 자원 침해
에이전트를 통해 JVM의 메모리와 리소스를 모니터링하고 제어할 수 있다. 예를 들어, 자바 힙 메모리의 데이터를 읽어 세션 토큰이나 비밀번호를 유출할 수 있을 것이다.

Heap Dump 를 통해서 서버 민감 정보를 획득할 수 있을 것이고, GC 설정을 조작 해서 서비스가 마비될 수도 있을 것 같다.


결론

그래서 Java 21에서 동적 로딩 금지의 목적은 

- 무결성 강화: JVM 실행 중 클래스 변조 방지.
- 보안성 향상: 악성 에이전트 주입을 통한 취약점 방어.
- 안정성 확보: 실행 중 JVM의 예측 불가능한 동작 방지.

으로 정리 될 수 있겠네요.


 

그럼에도 불구하고 동적 로딩을 허용하고 싶다면 다음 설정으로 동적 로딩 허용은 가능하다

-XX:+EnableDynamicAgentLoading: 동적 에이전트 로딩을 명시적으로 허용
-javaagent 또는 -agentlib: JVM 시작 시 에이전트를 로드

+ Recent posts