Roblox의 FPS 게임 중 하나인 ShellShock에 대한 내용은 Shellshock 문서 참고하십시오.
Roblox의 제1차 세계 대전을 배경으로 하는 게임 중 하나인 Shell Shock에 대한 내용은 Shell Shock 문서 참고하십시오.
1. 전쟁으로 인한 장애
Shellshock펠렐리우 전투 참전자를 묘사한 그림 "That Two-Thousand Yard Stare"[1] | 베르됭 전투 이후 별다른 부상이 없음에도 셸쇼크로 정상적인 신체 활동이 어려워진 군인들[2] |
전투 중 포격, 폭격 등에서 야기된 폭발과 충격, 굉음으로 흥분상태가 된 걸 가리키는 말. 정상적인 사고나 행동에 장애가 오기도 한다. PTSD로 발전할 수 있다. 참호에 숨어 포격을 그대로 얻어맞던 제1차 세계 대전부터 화력이 비약적으로 증가한 베트남 전쟁 시기에 주로 사용되었으나 현대에 이르러서는 개념의 불명확함 때문에 전투 스트레스 반응(CSR; combat stress response)이라는 더 잘 정립된 단어로 대체되었다.
신경과학자들과 의학자들은 이러한 스트레스 반응이 심하게는 경미한 외상적 뇌 손상(mild traumatic brain injury)까지 유발할 수 있다고 한다. 의학계에는 포탄 충격으로 인해 발생한 손상을 뇌진탕의 한 종류로 분류하고 있다.
다만 해당 증상이 막 나타난 제1차 세계 대전 시절에는 눈에 보이는 부상이 없었기 때문에 이들이 전장으로 돌아가기 싫어 꾀병을 부린다고 생각했다. 상관이 다그치는데도 계속 해당 증상을 보이자 이들은 괘씸죄까지 적용받아야 했고 결국 영국에서는 이 증상을 보인 3,000여 명이 넘는 인원에게 직무유기와 비겁함, 합법적인 명령에 대한 불복종이라는 죄목으로 사형 판결을 내리기까지 한 흑역사도 존재한다. 모두를 처형한 건 아니지만 셸쇼크 증상을 보이던 266명을 포함한 346명을 처형했다. 하지만 증상을 보인 이들을 처형했음에도 이어지는 솜 전투에서 이러한 증상을 보이는 이들이 6만 명 가까이 나타나자 그제서야 질병으로 인정받을 수 있었고 관련 연구가 시작되었다.[3]
참고로 맞는 사람이 아니라 발사하는 사람도 셸쇼크에 걸릴 수 있다. 유료기사 과학자들은 충격파가 뇌신경에 영향을 끼치는 것으로 생각하고 있다.
2. 컴퓨터의 보안 취약점
2014년 9월 24일에 밝혀진 유닉스류 운영체제에서 터미널로 사용하는 Bash shell에 존재하는 보안 취약점.하트블리드만큼, 아니 그보다 더 심각한 보안버그이다. 하트블리드는 OpenSSL만이 문제였고[4] 그 중에서도 일부 버전(약 2년간 영향을 받음)에만 적용되는 데다 이마저도 하트비트 기능을 끄면 안전했다. 하지만 Bash shell은 매우 광범위하게 사용되고 있고[5] 최초로 알려지기 전까지 22년이라는 굉장히 긴 기간 동안 존재해 왔기 때문에 하트블리드보다 심각하다고 할 수 있다.
셸 쇼크에 취약한 버전들은 취약점을 통해 무슨 코드이든 실행할 수 있게 되는데 보통 root 계정을 탈취한다. 실제로 야후!가 해킹 공격을 당했을 때 사람들이 셸 쇼크를 가장 먼저 생각했을 정도로 발표되자마자 큰 파장을 불러온 보안버그이다.[6] 이처럼 2014년 10월 말에 발견된 이 보안버그는 아직도 현재진행형으로 유닉스 계열의 서버를 사용하는 기업들을 위협하고 있다.
초기 보고 이후로 다양한 셸 쇼크가 발견되었는데 보통 환경변수를 이용하여 공격한다.
위에 서버가 뚫렸다는 말을 보아 당연한 이야기지만 Shellshock 는 원격(!) 으로도 가능하다! http의 헤더를 변조해 서버에 직접 명령어를 내리는 해킹 방법이 실제로 사용되고 있다.
2.1. 취약점 예제
다음 구문은CVE-2014-6271
에서 최초 보고된 셸 쇼크 취약점 예제이다.#!syntax sh
$ env x='() { :;}; echo vulnerable' bash -c "echo this is a test"
Bash에서 해당 구문을 실행하였을때 다음과 같은 구문이 뜨면 해당 취약점에는 안전한 것이며
is a test
이렇게 뜬다면 이미 악의적인 코드가 실행되어 계정이 탈취됐을 수 있으니 빠르게 포맷하도록 하자.
vulnerable
this is a test
HTTP 헤더의 User-Agent 부분을 다음과 같이 변조하면 계정 정보를 탈취 가능하다.[7]
#!syntax sh
User-Agent:() { :; }; echo $(</etc/passwd)
다만 이 경우는 서버가 발신하는 http 헤더에 담겨 있으며, 프록시 툴 없이는 분석이 불가능하다.
Apache서버의 경우 http헤더를 환경변수로 처리하는데 User-Agent가
#!syntax sh
() {:;}; echo $(</etc/passwd)
로 기록된다. 이 내용을 분석하자면
-
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의 환경변수에 대해 간략하게 알아보자.#!syntax sh
$ hi="안녕!"
$ echo $hi
안녕!
hi라는 변수를 생성, echo 함수를 통해 출력하는 구문이다. $hi를 입력했을 때 Bash shell은 c의 매크로처럼 "안녕!"이라고 변환해준다.#!syntax sh
$ hi="안녕!"
$ export hi
$ printenv | grep hi
hi="안녕!"
이번엔 변수를 선언하고 export를 통해 환경변수에 등록해보자. printenv로 환경변수 목록을 출력해보면 값이 들어가 있는 것을 확인 할 수 있다.Bash는 위와 같이 변수를 선언해서 환경변수에 넣을 수 있을 뿐만 아니라 함수도 넣을 수 있다.
#!syntax sh
$ 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를 생성
"꺼져" #공격하려는 코드가 인식되어 실행된다.
$ bash #새 Bash를 생성
"꺼져" #공격하려는 코드가 인식되어 실행된다.
마지막으로 위의 예제를 살펴보자.
$ env x='() { :[8];}; echo vulnerable' bash -c "echo this is a test"
env라는 명령어는 '해당 환경변수를 가지고 명령을 실행해라'는 뜻이다. 즉, x='() { :;}; echo vulnerable'
환경변수를 가지고 -c "echo this is a test" 라는 구문을 실행하게 되는 것.만약 취약점에 노출되었다면 뒤에 있는 echo vulnerable이라는 구문이 실행 될 것이다.
3. 관련 문서
[1]
작가는 화가이자 미군의 2차대전 특파원이었던 Thomas C. Lea III. 작품명은 먼 곳을 보는 듯 멍하니 초점이 맞지 않는 것을 의미한다.
[2]
치료를 받아 일상생활은 가능한 수준으로
완화된 사람들도 있다.
[3]
하지만 이러한 연구가 시작된 뒤에도 전장에서는 후방으로 가려고 꾀병을 부리는 병사가 늘어날 것을 우려해 해당 증상을 질병으로 인정하지 않았고 셸쇼크라는 단어의 사용 자체를 금지시켰다. 이러한 경향은 제1차 세계 대전이 종전된 뒤에야 개선되었다.
[4]
다른
TLS 프로그램들은 문제가 없다.
[5]
OS X와
안드로이드도 잠재적으로 이 버그에 취약할 수 있다.
[6]
확인 결과 셸 쇼크가 아닌 익스플로잇을 조작해서 한 우회 공격이었다. 다행히
야후!는 개인정보가 해킹당하지 않았다고 한다.
[7]
다만
/etc/passwd
는 실제 비밀번호가 아닌 단순한 계정 정보, 유저 ID 등등만 저장한다. 실제 비밀번호는 /etc/shadow
에
해싱되어 저장되기에 만약 이런 일이 일어난다고 해도 1차적으로 시간을 벌 수 있다.
[8]
:
라는 기호는 Bash shell에서는 true와 동치이다.