metatron-discovery security review speed run

서론

7월 26일 슬랙에 특성 회사 Github 저장소에 스타를 누를경우 선착순으로 경품을 준다는 메시지가 올라왔다. “처음엔 뭔 이런 이벤트가 다있지?” 하는 마음에 넘어갔지만 며칠 뒤 아래 게시글을 통해 사건의 발단되었다.

ㅋㅋㅋㅋ 그냥 웃고 넘어가려고 했는데 회사 슬랙에 @wooeong이 메시지를 보냈다.

링크를 눌러보니 이 프로젝트의 코드 퀄리티를 대충이나마 짐작할 수 있었다.

와!!!!!!!!!! (Command Injection?)

몇 개월동안 블로그를 방치해두기도 했고 빠르게 작성할 수 있을 것 같아 저녁시간을 이용해서 @wooeong과 함께 speed-run을 진행하고 그 결과를 쉐어해기로 했다. speed-run은 매년 Power Of Community라는 infosec conference에서 우리 회사가 진행하는 해킹 이벤트다. 주어진 짧은 시간(보통 10분~15분)에 해킹 문제를 풀면된다. 해킹이 생소하신 개발자분들은 해커톤 느낌으로다가 생각해주시면 될 것 같다.

우선 저장소에 나와있는 순서대로 빌드부터 해보기로 했다.

빌드가 되긴 한다…

국산 오픈소스 프로젝트의 국룰을 어기고 빌드가 성공적으로 진행된다. 다만 아래 사진처럼 철지난 npm 패키지들을 무수히 사용해 48개의 취약점이 발견되었다. 확인 해보지는 않았지만 regex DoS라던지 XSS 던지 하는 것들이 있을 것 같다.

실행하고 싶어요..

conf에 대한 예제가 있는데 이걸 어떻게 인자로 넣어야 하는지에 대한 설명은 readme 어느 곳에도 없었다. 깔끔하게 손절하려고 하던 순간, https://metatron.app/download/guide_vm/ vm image로 제공해준다.

[metatron@localhost ~]$ cat how_to_get_latest_binaries 
wget https://sktmetatronkrsouthshared.blob.core.windows.net/metatron-public/discovery-dist/latest/druid-0.9.1-latest-hadoop-2.7.3-bin.tar.gz

wget https://sktmetatronkrsouthshared.blob.core.windows.net/metatron-public/discovery-dist/latest/metatron-discovery-latest-bin.tar.gz
[metatron@localhost ~]$ 

홈 디렉토리에 저런 파일이 있다. get하는 방법만 알려주고 run하는 방법은 어디에도 나와있지 않기 때문에 실제 데모페이지가 돌아가고 있는 3.2.6 버전으로 audit을 하기로 했다. 블랙/화이트 박스 테스팅을 모두 진행하였고 전체의 아키텍쳐를 이해하지 않은 상태에서 간단한 스트링서치로만 audit을 진행했다. 한 버그클래스에 여러 버그 케이스가 존재하는 경우는 대표적인 것 하나만 작성했다. 아래는 speed-run을 통해 발견된 취약점들이다.

취약점

IDOR (Insecure Direct Object Reference)

대부분의 엔드포인트에서 권한 분리가 제대로 적용되어있지 않다. 펜딩 멤버와 같이 어드민만 볼 수 있는 API를 호출하는 것이 가능하다. 어드민 덧글을 게스트 유저가 수정해보겠다. 참고로 게스트는 다른 덧글을 수정할 수 있는 권한이 없다. (많은 엔드포인트에서 비슷한 취약점이 발생한다.)

Guest Token
Admin이 작성한 덧글 수정 요청
수정 완료

Arbitrary File Read + Path traversal

확장자 체크없이 인풋 받은 path를 그대로 읽어 출력해준다. 이쯤되면 “기능인가?” 의심해볼 필요가 있다.

SSRF

Host / Port 그리고 GET Parameter 조작이 가능하다.

Default username/password

metatron에서 호스팅해주는 데모 서버에 VM이미지를 받았을 때 존재하는 계정 정보로 로그인이 가능하다. (원래는 pending state를 거쳐야 함) — https://discovery.metatron.app/(polaris / polaris)

결론

전체적으로 코드가 많이 난잡하다. (지금 졸려서 내 글도 난잡한 것 같다.) 잠재적인 취약점이 많이 보이는데 회사일도 아니고 시간 도 없어서 말을 줄이겠다. 빅데이터 관련된 지식에 문외한이라 뭘 하는 프로그램인지는 모르겠지만 뭔가 좋은 것 같다. 이것저것 눌러보니 비주얼라이징이 이쁘게 된다. (한국) 기업치고 자사 프로덕트를 오픈소스하기 까지 쉽지 않았을텐데 코드 퀄리티를 떠나서 이 점은 칭찬하고 싶다. 다만 Github Star를 돈으로 산 행위는 이해할 수 없다. ㅋ.ㅋ

https://github.com/metatron-app/metatron-discovery/blob/f019b72a69e1713e38b5e958daf2b0919b7a5d77/discovery-server/src/main/java/app/metatron/discovery/domain/dataprep/PrepDatasetStagingDbService.java#L248-L249

오픈소스를 마음 먹었으면 이런 주석정도는 지울 수 있지 않나..

업데이트

[13:35 30-Jul-19] Github issue를 통해 오픈소스 메인테이너에게 리포트 ( https://github.com/metatron-app/metatron-discovery/issues/2406 )

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google photo

You are commenting using your Google account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s

This site uses Akismet to reduce spam. Learn how your comment data is processed.