[OWASP] A5 — Security Misconfiguration
애플리케이션 설정 오류로 인해 생기는 보안 취약점에 대해 알아보기
--
안녕하세요. 휴먼스케이프 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는 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를 열어주세요.
그리고 한 번 앱을 둘러보시기 바랍니다. 계정은 두 개 있습니다.
- 아이디: hw0k, 비밀번호: 1234
- 아이디: admin, 비밀번호: 12345
음식 리스트를 권한에 따라 조회 혹은 관리할 수 있는 간단한 웹앱입니다. 어드민 권한을 가지고 있으면, 음식 리스트를 변경할 수 있습니다. 그러나, 이 앱은 Redux DevTools의 설정이 미흡해 일반 계정도 어드민이 될 수 있습니다!
방법은 아주 간단합니다. 로그인을 몇 번 해보면, 로그인 시 어떤 액션이 디스패치되는지 알아보고 난 후 해당 액션의 Payload를 변조하여 DevTools로 디스패치하면 됩니다.
로그인을 마치면, 액션 객체가 고스란히 나오게 됩니다.
{
type: "user/SET_USER",
payload: {
id: "hw0k",
name: "남현욱",
age: 20,
isAdmin: false, // 이 값만 바꾸면 어드민이 될 것 같아요!
}
}
그럼, 이 액션 객체에서 isAdmin만 true로 바꿔 디스패치하도록 하겠습니다. 하단에 있는 Dispatch 버튼(빨간 동그라미 부분)을 눌러서, 변조한 액션 객체로 디스패치를 진행해보세요.
디스패치를 진행하면, 남현욱 유저는 관리자가 되었습니다. 이제 모아온 음식 정보를 모두 날려버릴 수 있습니다.
그럼 이 위험한 유틸리티는 대체 어떻게 사용하면 될까요? 여러 방법이 있지만, 제일 권장하는 방법은 production 모드가 아닐 때만 디버깅 유틸리티를 활성화하는 방법입니다.
이후 배포된 앱을 보면, Redux DevTools를 사용할 수 없는 모습이 보입니다.
참고: 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