Log4j Shell 에서 뭐 원격지의 코드는 받아오는데 그래서 뭐 어케 실행되는거임?
하는 궁금증이 생겨서 메모겸 블로그 글을 작성한다
## JNDI ?
JNDI는 Java Naming and Directory Interface로 디렉터리 서비스(LDAP, DNS, NIS, 파일 시스템)를 발견하고 Lookup을 통해 디렉터리 Object를 Naming 해주는 Java API이다. Naming을 사용할 때 ${protocol:value} 이런식으로 Binding 되기 때문에 이번 공격의 페이로드가 ${ldap:127.0.0.0/a} 이런모양이다.
라고 이전 Log4j 게시물에 작성을 했다.
## 핵심
log4j 의 로깅하는 부분에서 JNDI 구문이 실행 가능하다. ---> 요게 log4j의 핵심이고
JNDI를 통해 LDAP을 통해서 원격지의 Java class를 가져와서 실행한다 . ------> 요게 JNDI Injection 이다.
## 참고자료
JNDI Injection에 관해서는 Blackhat 에서 이미 예전에 발표가 되었다.
영어로 써있기는 하지만 사진이 많아서 충분히 이해가 가능하니 자세한건 여기를 살펴보자
## Java Serialize(자바 직렬화) ??
우선 JNDI Injection을 이해하기 위해서는 Java Serialization에 대한 이해가 필요하다.
자바는 java virtual machine 위에서 실행된다. 그곳에서 사용되는 Data, Object 같은 데이터를 외부에서도 사용이 가능하도록 Byte 형태로 변환하는 기술을 직렬화라고 한다.
## Java Deserialize(자바 역직렬화) ??
위와 반대로 byte 형태로 변환된걸 다시 Data, Object 같은 형태로 변환하는것을 말한다.
그렇게 변환된 데이터는 jvm 메모리에 올라가게 된다.
## 결론
사용자의 뭐 어떠한 공격을 통해서 JNDI 를 통해 원격지의 Java class 를 가져온다고 치자. 우선 해당 class를 가져오면
JNDI가 해당 데이터를 역직렬화 하게되고 그러면 해당 클래스가 Java virtual machine에 올라가게 되서 실행된다고 아주 간결하게 얘기할 수 있다.
뭐 사실 JNDI가 어떻게 Naming Reference를 만들고 JNDI 에서 Remote Code를 가져올 때 정확하게 어떤방식으로 동작하는지 설명하면 굉장히 좋겠으나.... 귀찮으니 생략한다....
그래도 해당 내용에 대해서 알 수 있는 자료는 아래 링크를 통해 확인이 가능하다.
대충 6~8p를 보면 해당 내용이 나온다.
'Technical Docs > Web Application' 카테고리의 다른 글
DOM Invader (Burp Suite) (0) | 2022.06.23 |
---|---|
CVE-2022-26134 Confluence 취약점 (내용추가) (0) | 2022.06.03 |
Source Map 이 뭘까요~ (0) | 2022.06.01 |
CVE-2022-22978 Authorization Bypass in RegexRequestMatcher (0) | 2022.05.31 |
Log4j 취약점 CVE-2021-44228 (Remote Code Injection) (0) | 2021.12.20 |