brunch

You can make anything
by writing

C.S.Lewis

by 글쓰는개미핥기 Jan 11. 2022

� log4j 취약점, 이게 뭔데?

#log4j #java #log #컴퓨터 #log4jsheel

� 한 줄 요약

- log4j야 유저의 말을 신뢰하지 마!


✅ log4j 취약점(log4shell) 

✔️우리의 노마드코더, 니꼴라스가 log4j에 대해 아주 쉽고, 이해하기 편하게 설명을 해줬습니다. 니꼴라스의 말을 따라 요약하자면 'log4j'가 유저의 텍스트를 신뢰(명령어로써)함으로써, 발생하는 아주 큰 문제입니다. 즉, 데이터베이스에 저장된 데이터 접근 권한이 '누구나'에게 열려버린 것이죠.


✔️ 이번 사태는 12월 9일 알리바바 보안팀에 의해 처음 공식화됐습니다. 하지만 더 큰 문제는 클라우드플레어에 따르면 12월 1일부터 이미 해킹에 사용됐다고 합니다. 여기서 중요한 문제는 '아무도 몰랐다'는 겁니다. (조금 더 자료를 찾아보니 11월 24일에 알리바바 그룹에서 보고됐다는 뉴스가 있네요. (https://www.npr.org/2021/12/10/1063278227/minecraft-software-flaw)


✔️ 이 취약점은 RCE(Remote Code Execution), 즉 '원격 코드 실행'으로 해커가 명령어를 통해 데이터가 들어있는 서버를 자유자재로 이용할 수 있었습니다. 전 세계 수많은 기업이 log4j를 사용하는 중이고, 그들 또한 해킹의 대상이었죠. 여러분들이 아는 기업 테슬라, 아마존, 애플 등등 말입니다.


✅ 아니 왜 이렇게 많이 사용하는데?

✔️ log4j 시스템이 JAVA와 연관이 있기 때문입니다. log4j는 JAVA의 시스템 패키지 중 하나로, Oracle(오라클)에 따르면 2015년 130'억'개 기기에서 구동 중이라고 합니다. 지금은 더 늘지 않았을까요? 아차, 여기서 Javascript랑 JAVA는 엄연히 다른 코드니까 혼동하면 안 됩니다.


✔️ 다시 돌아오면 아주 유명한 프로그래밍 언어(JAVA) + 아주 많이 사용하는 패키지(log4j)가 결합한 프로그램 안에서, 결함이 발견되면서 거대한 위험이 발생하게 된 것입니다.


✅ log4j가 뭔데, 그렇게 많이 써?

✔️로그란 '일이 발생한 것을 기록한 데이터'입니다. 여러분이 어떠한 활동을 했을 때, 그것을 기록하도록 돕는 것이 바로 log4j입니다. 이름에서부터 무엇을 위한 것인지 나타내죠. log4j는 '자바를 위한 로그 라이브러리'라는 뜻을 가지고 있습니다. 약자를 풀면 다음과 같아요.


'log + for + JAVA' 


✅ log4j 취약점은 신뢰와 관련 있다.

✔️ 보통 유저가 텍스트를 입력했을 때, 이는 코드로 인식되지 않습니다. 즉, 신뢰할 수 없는 사용자로 등록되어 있는 유저들은 텍스트를 입력했을 때, 내용 그대로 출력됩니다. 텍스트 필드 창에 2+2를 입력했을 때, '2+2'라는 내용이 출력되는 거죠.


✔️ 하지만, 유저가 신뢰를 얻었을 때, 이 '2+2'가 코드로서 읽힙니다. 그 결과 텍스트 필드 창에는 '2+2=4'라는 공식에 따라 '4'가 출력됩니다. 모든 부분에서 그런 것은 아니고 저도 자세히 설명하긴 어렵습니다. log4j에는 Lookup 플러그인이 있습니다. 


✔️ 여기서 Lookup 플러그인에 jndi를 추가했고, 추가한 jndi에서 취약점이 발생하게 된 것입니다. Lookup 기능은 유저를 어느 정도 '살짝 신뢰'합니다. 유저를 살짝 신뢰하는 jndi에 명령어를 입력하면 서버가 반응하여 그 유저에게 서버 정보에 내장된 명령어를 실행하게 됩니다. 


✔️ 그렇게 되면 그 유저는 해당 서버를 마음대로 활용할 수 있게 됩니다. 니꼴라스는 여타 유저들이 애플, 테슬라, 마인크래프트에서 해당 내용을 실행했고, 그에 따라 반응한다는 사실을 스크린샷을 통해 보여줍니다. 


✅ 이제부터는 내 말로 요약한다.

✔️ 비전공자 여러분덜, 이해하기 어려웠죠? 저도 지금 이해하기 어려워요. 그래서 제가 그냥 쉽게 설명해보기로 할게요. 틀릴 수도 있으니, '살짝 신뢰'하고 들으세요.


'log4j lookup 기능 → 유저를 살짝 신뢰 → 유저 명령어 입력 → 백엔드 서버에 요청'


✔️ 즉, 서버 접근 권한이 있는 사람이 아님에도, 그 서버에 명령을 내릴 수 있는 상황이 '됐다는 거 같습'니다. 1급 보안 문서를 권한이 없는 사람이 요청했는데, 내주는 개념 아닐까요? 어렵지만, 그렇게 저는 생각하기로 했습니다.


✔️ 이 문제 때문에 클라우드를 운영하는 곳곳에서 난리가 났었어요. 저는 NHN 클라우드를 사용했던 적이 있는데, 대응 방안에 대해서 문자가 계속 오더라고요. 일반인들은 알지 못했지만, 보안 사항에서는 아주 큰 문제였던 것으로 보입니다. 주변분들에게 물어봐도 전혀 모르긴 하더라고요. 물어보면 다음과 같아요.


'아 그래?' 


✔️ 저도 이러한 정보를 수집하거나 관심이 1도 없었다면 이게 무슨 문제였는지, 왜 큰일이 발생한 건지 등 전혀 몰랐겠더라고요. 또한, 이번 문제를 누구에게 호소할 수도 없는 게, log4j를 만드는 사람들은 '무료로 배포'하고 있기 때문이에요.


✔️ 니꼴라스의 말처럼 앞으로 이런 문제가 발생하지 않도록 후원을 통해 강화하는 방향이 우선되어야 하지 않을까 합니다. 과거 WOW(월드오브워크래프트) 정보(?)였나, 혼자서 열심히 재능기부로 제공하던 분이 생활고에 시달렸었던 이야기가 떠오르네요. 그분도 후에 후원계좌로 조금 나아진 것으로 알고 있습니다. 현재는 어떤지 잘 모르겠지만요.�


✔️ 여튼, 없는 머리 쥐어짜 내서 log4j에 대해서 정리해봤습니다. 여전히 이해가 잘 안 가지만 큰 흐름 상, 맥랑 상 아주 엄청 위험한 상황이었다는 사실을 알게 됐습니다. 제대로 알지 못하니 좀 답답한 측면에서 프로그래밍을 좀 제대로 배워볼까라는 위험한 생각도 했습니다만, 곧바로 접기로 결정했습니다.� 저는 단지 이 글을 통해, 이 글을 읽는 분들이 이해하는데 '살짝'이라도 도움이 됐기를 바라는 마음입니다.


https://www.youtube.com/watch?v=kwS3twdVsko&t=16s

브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari