셸쇼크

 


1. 전쟁으로 인한 장애
2. 컴퓨터의 보안 취약점
2.1. 취약점 예제
2.2. 예제 설명
3. 관련 문서

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 x='() { :[5]

;}; echo vulnerable' bash -c "echo this is a test"

env라는 명령어는 '해당 환경변수를 가지고 명령을 실행해라'는 뜻이다. 즉,
x='() { :;}; echo vulnerable'
환경변수를 가지고 -c "echo this is a test" 라는 구문을 실행하게 되는 것.
만약 취약점에 노출되었다면 뒤에 있는 echo vulnerable이라는 구문이 실행 될 것이다.

3. 관련 문서



[1] 치료를 받아 일상생활은 가능한 수준으로완화된 사람들도 있다[2] 다른 TLS 프로그램들은 문제가 없다.[3] OS X안드로이드도 잠재적으로 이 버그에 취약할 수 있다.[4] 확인 결과 쉘쇼크가 아닌 익스플로잇을 조작해서 우회 공격이었다. 다행히도 야후!는 개인정보가 해킹당하지 않았다고 한다.[5]
:
라는 기호는 Bash shell에서는 true와 동치이다.

크리에이티브 커먼즈 라이선스

이 저작물은 CC BY-NC-SA 2.0 KR 에 따라 이용할 수 있습니다. (라이선스가 별도로 명시된 경우 제외)
기여하신 문서의 저작권은 각 기여자에게 있으며, 각 기여자는 기여하신 부분의 저작권을 갖습니다.