셸쇼크
Shellshock
1. 전쟁으로 인한 장애
별다른 부상이 없음에도 셸쇼크로 정상적인 신체 활동이 어려워진 군인들[1]
전투 중 포격 등의 충격으로 발생한 흥분상태를 가리키는 말. 정상적인 사고나 행동에 장애가 오기도 한다. PTSD로 발전할 수 있다. 참호에 숨어서 포탄이 떨어지는걸 그대로 얻어맞던 제 1차 세계대전부터 화력이 비약적으로 증가한 베트남전 시기에 주로 사용되었으나 현대에 이르러서는 개념의 불명확함 때문에 '''전투 스트레스 반응'''(CSR; combat stress response)이라는 더 잘 정립된 단어로 대체되었다.
신경과학자들과 의학자들은 이러한 스트레스 반응이 심하게는 경미한 외상적 뇌 손상(mild traumatic brain injury)까지 유발할 수 있다고 한다. 의학계에는 포탄 충격으로 인해 발생한 손상을 뇌진탕의 한 종류로 분류하고 있다.
2. 컴퓨터의 보안 취약점
2014년 9월 24일에 밝혀진, 유닉스류 운영체제에서 터미널로 사용하는 Bash shell에 존재하는 보안 취약점.
하트블리드만큼, 아니 그보다 더 심각한 보안버그이다. 하트블리드는 OpenSSL만이 문제였고[2] 그 중에서도 일부 버전(약 2년간 영향을 받음)에만 적용되는데다 이마저도 하트비트 기능을 끄면 안전했다. 하지만 Bash shell은 매우 광범위하게 사용되고 있고[3] 최초로 알려지기 전까지 '''22년'''이라는 굉장히 긴 기간 동안 존재해왔기 때문에 하트블리드보다 심각하다고 할 수 있다.
쉘 쇼크에 취약한 버전들은 취약점을 통해 '''무슨 코드이든 실행''' 할 수 있게 된다.(보통 root 계정을 탈취한다). 실제로 야후!가 해킹 공격을 당했을 때 사람들이 쉘쇼크를 가장 먼저 생각했을 정도로 발표되자 마자 큰 파장을 불러온 보안버그이다.[4] 이처럼 2014년 10월 말 기에 발견된 이 보안버그는 아직도 '''현재진행형'''으로 유닉스 계열의 서버를 사용하는 기업들을 위협하고 있다.
초기 보고 이후로 다양한 쉘 쇼크가 발견되었는데 보통 환경변수를 이용하여 공격한다.
위에 서버가 뚫렸다는 말을 보아 당연한 이야기지만, Shellshock 는 '''원격(!)''' 으로도 가능하다! http의 헤더를 변조, 서버에 직접 명령어를 내리는 해킹 방법이 '''실제로 사용되고 있다.'''
2.1. 취약점 예제
다음 구문은 CVE-2014-6271 최초 보고된 쉘 쇼크 취약점 예제이다.
$ env x='() { :;}; echo vulnerable' bash -c "echo this is a test"
Bash에서 해당 구문을 실행하였을때 다음과 같은 구문이 뜨면 해당 취약점에는 안전한 것이며is a test
이렇게 뜬다면 이미 악의적인 코드가 실행되어 계정이 탈취됐을 수 있으니 빠르게 포맷하도록 하자.
vulnerable
this is a test
http 헤더의 User-Agent 부분을 다음과 같이 변조하면 '''계정 정보를 탈취 가능하다.'''
User-Agent:() { :; }; echo $(
다만 이 경우는 서버가 발신하는 http 헤더에 담겨 있으며, 프록시 툴 없이는 분석이 불가능하다.Apache서버의 경우 http헤더를 환경변수로 처리하는데 User-Agent가
() {:;}; echo $(
로 기록된다. 이 내용을 분석하자면echo - 뒤에 나오는 내용을 그대로 화면에 출력
$(명령) - 괄호안 명령의 실행 결과를 출력
< - 리디렉션으로 /etc/passwd의 내용을 왼쪽으로 입력. 예제에서는 요청자에게 보낼 http헤더에 입력된다.
/etc/passwd - 리눅스에서 사용자 계정 정보들(사용자이름, 그룹, 홈디렉토리 등등)을 저장하는 파일
이 명령어를 조합하면, "/etc/passwd내용을 http헤더에 출력해서 요청자에게 보낸다" 는 뜻으로 서버측 사용자 계정이 고스란히 노출되는 위험한 상황이다.
다만 일반적인 Apache httpd 서버 운영시에 전부 이 취약점에 노출되는 것이 아니다!! 일반적인 상황에서 Apache 웹 서버가 HTTP 헤더 등을 bash 쉘로 처리할 이유가 전혀 없다. 이는 정확히는 mod_cgi 라는 모듈을 사용하면서, 파일 앞에 #!/bin/bash 를 써주어서 bash 를 사용하겠다고 명시한 cgi 파일들에 한정되는 것이다. 그러니 php 나 기타 일반적인 html 페이지에 아무리 공격을 해봐야 아무 의미 없다. 사실 cgi 는 현재는 잘 사용되지 않는 추세이고, 그나마 있는 것도 Perl 이 대부분이지 쉘로 페이지를 작성하는 경우는 흔하진 않다.
2.2. 예제 설명
본격적으로 설명하기에 앞서 Bash의 환경변수에 대해 간략하게 알아보자.
$ hi="안녕!"
$ echo $hi
안녕!
hi라는 변수를 생성, echo 함수를 통해 출력하는 구문이다. $hi를 입력했을 때 Bash shell은 c의 매크로처럼 "안녕!"이라고 변환해준다.$ hi="안녕!"
$ export hi
$ printenv | grep hi
hi="안녕!"
이번엔 변수를 선언하고 export를 통해 환경변수에 등록해보자. printenv로 환경변수 목록을 출력해보면 값이 들어가 있는 것을 확인 할 수 있다.Bash는 위와 같이 변수를 선언해서 환경변수에 넣을 수 있을 뿐만 아니라 함수도 넣을 수 있다.
$ hi() { echo "안녕!"; }
$ hi
안녕!
$ export -f hi
$ printenv | grep hi
hi=() { echo "안녕!"
}
함수를 환경변수에 넣을때는 export에 -f 옵션을 줘서 넣는다. 함수형 환경변수가 저장되는 방식을 유심히 살펴보자.자 이제 본격적으로 CVE-2014-6271 취약점에 대해 알아보자. 해당 취약점은 '''함수가 아닌''' 일반 환경 변수가
() { <함수 body> }; <공격하려는 코드>
이런 모양일 경우 child로 생성된 Bash shell에서 함수로 인식되는 버그이다.마지막으로 위의 예제를 살펴보자$ export hi='() { echo "안녕!"; }; echo "꺼져";' #함수가 아닌 일반 환경변수 hi를 넣는다
$ bash #새 Bash를 생성
"꺼져" #공격하려는 코드가 인식되어 실행된다.
env라는 명령어는 '해당 환경변수를 가지고 명령을 실행해라'는 뜻이다. 즉,$ env x='() { :[5]
;}; echo vulnerable' bash -c "echo this is a test"
x='() { :;}; echo vulnerable'
환경변수를 가지고 -c "echo this is a test" 라는 구문을 실행하게 되는 것.만약 취약점에 노출되었다면 뒤에 있는 echo vulnerable이라는 구문이 실행 될 것이다.
3. 관련 문서
[1] 치료를 받아 일상생활은 가능한 수준으로완화된 사람들도 있다[2] 다른 TLS 프로그램들은 문제가 없다.[3] OS X와 안드로이드도 잠재적으로 이 버그에 취약할 수 있다.[4] 확인 결과 쉘쇼크가 아닌 익스플로잇을 조작해서 우회 공격이었다. 다행히도 야후!는 개인정보가 해킹당하지 않았다고 한다.[5]
:
라는 기호는 Bash shell에서는 true와 동치이다.