애플리케이션 설정 오류로 인해 생기는 보안 취약점에 대해 알아보기
안녕하세요. 휴먼스케이프 Frontend Software Engineer 남현욱입니다.
이번 포스트에서는 휴먼스케이프 개발팀의 교양과목: 웹 해킹과 시큐어코딩 중 A5-Security Misconfiguration에 대해 알아보겠습니다.
개요
이 취약점은, Security Misconfiguration이라는 단어의 정의에 알맞게 설정 오류/미비로 인해 발생되는 웹 취약점입니다.
때문에 네트워크 서비스, 플랫폼, 웹 서버, 애플리케이션 서버, DB, 프레임워크, 사용자의 코드, 그 뿐만 아니라 Pre-installed VM, 컨테이너, 저장소 등 Application Stack 내 모든 범위에서 발생될 여지가 있는 취약점입니다.
이 취약점을 이용해서 공격자들이 시스템 데이터/기능에 접근할 수도 있고, 시스템 결함을 일으킬 수도 있습니다.
아래는 설정 오류/미비 항목들 중 대표적인 것들입니다.
클라우드 서비스(GCP, AWS 등) 접근 권한 설정이 올바르지 않음.
필요하지 않거나 감춰야 할 서비스/기능을 설치했거나 활성화함. (서버 포트 외 다른 포트 개방, 불필요한 슈퍼계정/권한, 불필요한 HTTP Method, Debug 모드 등등)
애플리케이션 서버(Tomcat, Apache)/프레임워크(Spring, ASP.Net)의 보안 설정을 세팅하지 않음.
Application Stack 내에서 오래되거나 취약점이 있는 버전을 사용함. (npm audit이란?)
유저들에게 서버의 디렉토리 구조를 모두 혹은 일부 노출시킴.
웹 서버의 프로그램 혹은 버전을 노출시킴.
기타 등등
이번 포스트에서는 위 항목 중 볼드체로 되어있는 두 항목을 예시와 함께 알아보겠습니다.
우리 서버의 디렉토리 구조는 소중해요
서버 디렉토리 안에는 수많은 페이지들, 그 페이지들 속에 중요한 정보들도 들어있습니다. 만약 이 정보들을 일반 유저들에게 그대로 노출시켜 열람이 가능하다면 당장이라도 큰 일이 날 것만 같습니다.
서버의 디렉토리 구조를 본다고 해서 어떤 일이 발생할까요? nginx를 활용하여 이 상황을 가정해보겠습니다.
우선 nginx로 서버를 열고, autoindex 기능(Directory Listing)을 활성화합니다.
server { listen 8080; server_name localhost; charset utf-8; ...
location / { # 아래 줄을 넣습니다. autoindex on; }
...
}
그 후, 간단한 페이지들과 파일을 만들어줍니다.
이후 http://localhost:8080/welcome.html을 브라우저에 입력하여 접속해보면, 아래와 같이 잘 나타납니다.
헨리는 정말 멋져요.
페이지를 띄우는 것은 성공했으나, 보안적 이슈가 생겼습니다. 저만 볼 수 있었던 걸로만 알았던 파일들을 모든 유저가 다 볼 수 있습니다!
http://localhost:8080에 접속해봅시다.
오잉?
이처럼 Directory listing은 되게 유용한 기능일지는 몰라도, 보안에 굉장한 독이 되어 여러분들에게 돌아올 수 있습니다.
해결 방법은, 앞서 설명드렸던 Directory listing 기능을 끄는 것입니다. nginx 기준으로는 저 autoindex 구문을 지우면 되겠군요 :)
참고: http://nginx.org/en/docs/http/ngx_http_autoindex_module.html
디버깅은 꼭 개발할 때만!
디버깅 유틸리티는 개발할 때 여러모로 저희를 편리하게 해줍니다. 일례로 Redux를 이용해 개발을 할 때 Redux DevTools라는 디버깅 유틸리티가 있습니다.
Redux DevTools 스크린샷
Redux DevTools는 State와 Action 조회, Action 취소, Action 디스패치, 에러 탐지, Action 전후의 State Diff 확인 등 엄청 많은 기능을 담고 있습니다. Redux를 사용하신다면 대부분 세팅해놓았을 유틸리티일 겁니다.
그러나 이와 같은 만능 디버깅 유틸리티를 활성화한 채 배포하면 어떻게 될까요? 이번에는 React/Redux 웹앱 + Redux DevTools를 예시로 들어보겠습니다.
우선 Chrome에서 Redux DevTools 익스텐션을 설치해주세요.
https://chrome.google.com/webstore/detail/redux-devtools/lmhkpmbekcpmknklioeibfkpmmfibljd
설치가 완료되면 아래 페이지에 접속하시고 Redux DevTools를 열어주세요.
React App Web site created using create-react-appredux-security-misconfiguration-lmvt1wmfj.now.sh
이렇게 나오면 성공!
그리고 한 번 앱을 둘러보시기 바랍니다. 계정은 두 개 있습니다.
아이디: hw0k, 비밀번호: 1234
아이디: admin, 비밀번호: 12345
음식 리스트를 권한에 따라 조회 혹은 관리할 수 있는 간단한 웹앱입니다. 어드민 권한을 가지고 있으면, 음식 리스트를 변경할 수 있습니다. 그러나, 이 앱은 Redux DevTools의 설정이 미흡해 일반 계정도 어드민이 될 수 있습니다!
방법은 아주 간단합니다. 로그인을 몇 번 해보면, 로그인 시 어떤 액션이 디스패치되는지 알아보고 난 후 해당 액션의 Payload를 변조하여 DevTools로 디스패치하면 됩니다.
로그인을 마치면, 액션 객체가 고스란히 나오게 됩니다.
{ type: 'user/SET_USER', payload: { id: 'hw0k', name: '남현욱', age: 20, isAdmin: false, // 이 값만 바꾸면 어드민이 될 것 같아요! } }
그럼, 이 액션 객체에서 isAdmin만 true로 바꿔 디스패치하도록 하겠습니다. 하단에 있는 Dispatch 버튼(빨간 동그라미 부분)을 눌러서, 변조한 액션 객체로 디스패치를 진행해보세요.
디스패치를 진행하면, 남현욱 유저는 관리자가 되었습니다. 이제 모아온 음식 정보를 모두 날려버릴 수 있습니다.
저는 오늘부터 어드민이에요.
그럼 이 위험한 유틸리티는 대체 어떻게 사용하면 될까요? 여러 방법이 있지만, 제일 권장하는 방법은 production 모드가 아닐 때만 디버깅 유틸리티를 활성화하는 방법입니다.
production이 아닐 때만 Redux DevTools 활성화
이후 배포된 앱을 보면, Redux DevTools를 사용할 수 없는 모습이 보입니다.
React App Web site created using create-react-appredux-security-misconfiguration-dr4qfwcnu.now.sh
이제 어드민 행세를 못 하게 됐어요.
참고: https://github.com/zalmoxisus/redux-devtools-extension#14-using-in-production
맺으며
앞서 설명드린 건 전체 Application Stack의 수많은 설정 오류 및 미비 상황 중 딱 두 가지 상황만 (…) 설명드렸습니다. 꼭 이 두 부분 말고도 다뤄야 할 설정은 굉장히 많고, 또 견고하게 설정해주어야 합니다.
개발하시다 시간이 남는다면 한 번씩 config 파일을 점검해보는 건 어떨까요?
출처
OWASP Top Ten 2017: A6-Security Misconfiguration (Top Ten 2017은 A6이나, Top Ten 2013은 A5입니다!)
도서 <웹 해킹과 시큐어코딩 탐지/수정 실습가이드>
Get to know us better! Join our official channels below.
Telegram(EN) : t.me/Humanscape KakaoTalk(KR) : open.kakao.com/o/gqbUQEM Website : humanscape.io Medium : medium.com/humanscape-ico Facebook : www.facebook.com/humanscape Twitter : twitter.com/Humanscape_io Reddit : https://www.reddit.com/r/Humanscape_official Bitcointalk announcement : https://bit.ly/2rVsP4T Email : support@humanscape.io