"셸쇼크"의 두 판 사이의 차이
잔글 (→참고자료) |
잔글 (→같이 보기) |
||
157번째 줄: | 157번째 줄: | ||
* [[셸]] | * [[셸]] | ||
− | {{ | + | {{보안|검토 필요}} |
2019년 7월 28일 (일) 16:16 기준 최신판
셸쇼크(Shell Shock)는 리눅스 계열 운영체제(OS)에서 주로 사용하는 'GNU Bash'에서 공격자가 원격에서 악의적인 시스템 명령을 실행할 수 있는 취약점이다. 쉘쇼크라고도 쓴다.
개요[편집]
셸쇼크는 유닉스류 운영체제에서 터미널로 사용하는 배시 셸(Bash shell)에 존재하는 보안 취약점이다. 2014년 9월 24일에 밝혀졌다.
하트블리드만큼, 아니 그보다 더 심각한 보안버그이다. 하트블리드는 OpenSSL만이 문제였고(다른 TLS 프로그램들은 문제가 없다) 그 중에서도 일부 버전(약 2년간 영향을 받음)에만 적용되는데다 이마저도 하트비트 기능을 끄면 안전했다. 하지만 Bash shell은 매우 광범위하게 사용되고 있고(OS X와 안드로이드도 잠재적으로 이 버그에 취약할 수 있다.) 최초로 알려지기 전까지 22년이라는 굉장히 긴 기간 동안 존재해왔기 때문에 하트블리드보다 심각하다고 할 수 있다.
셸쇼크에 취약한 버전들은 취약점을 통해 무슨 코드이든 실행할 수 있게 된다.(보통 root 계정을 탈취한다). 실제로 야후!가 해킹 공격을 당했을 때 사람들이 쉘쇼크를 가장 먼저 생각했을 정도로 발표되자 마자 큰 파장을 불러온 보안버그이다.(확인 결과 쉘쇼크가 아닌 익스플로잇을 조작해서 우회 공격이었다. 다행히도 야후!는 개인정보가 해킹당하지 않았다고 한다.) 이처럼 2014년 10월 말 기에 발견된 이 보안버그는 아직도 현재진행형으로 유닉스 계열의 서버를 사용하는 기업들을 위협하고 있다.
초기 보고 이후로 다양한 셸쇼크가 발견되었는데 보통 환경변수를 이용하여 공격한다.
위에 서버가 뚫렸다는 말을 보아 당연한 이야기지만, 셸쇼크는 원격으로도 가능하다. http의 헤더를 변조, 서버에 직접 명령어를 내리는 해킹 방법이 실제로 사용되고 있다.[1]
역사[편집]
취약점 최초 발견자는 영국에서 IT매니저로 근무하는 프랑스인인 스테판 챠젤라스. 2014년 9월 12일경 발견했다.
해당 취약점이 존재하는 코드는 1993년도 이전부터 최근에 발견되기 전까지 20년 동안 존재했고 쉘쇼크로 인해 가장 영향을 받는 프로그램은 CGI(Common Gateway Interface)이다. CGI(Common Gateway Interface)란 웹 서버에 요청된 페이지를 응용프로그램에 전달하고 처리하기 위한 인터페이스이다.
그다음으로 취약점 정보와 공격 도구가 공개된 즉시 인터넷 트래픽에서 이를 악용하는 공격들이 급증하고 CGI 웹서버만을 대상으로 하는 공격자의 활동이 점점 NAS 장비등 여러 환경으로 확산됐다.
인터넷을 통해 간단한 명령만으로 시스템을 장악할 수 있는 심각성을 느껴 미국 국립표준기술연구소(NIST)에서 취약점 등급 10점으로 산정했다. 취약점이 발생한 부분은 Bash 쉘이 제공하는 함수 선언 기능이다.
> "0 {"로 시작하는 문자열을 시스템 환경변수에 저장하면 동일한 이름을 가진 함수로 선언된다.
> 하지만 함수 선언문 끝에 임의의 명령어를 추가로 삽입할 경우, Bash가 함수문에서 처리를 멈추지 않고 추가로 삽입한 명령어를 계속 실행 시키기 때문에 문제가 발생한다
>> 환경변수에 합수와 명령어를 함께 새로운 Bash 프로세스에 주입시킬 경우 해당 프로세스가 입력 값을 시스템의 환경변수로 등록하는 과정에서 리눅스명령어까지 자동으로 실행.
-Bash의 소스코드 분석 시, evalstring.c 파일 내에 정의되어 있는 parse_and_execute() 함수에서 Bash에 전달된 명령어를 처리하여 실행.
이때 명령어 문자열을 처리하는 과정에서 반복문(while)을 사용하는데, 함수 선언문 뒤에 명령어가 삽입된 것을 확인하고 반복문을 종료시키는 코드가 없다. 따라서 함수 선언문의 끝까지 처리한 뒤에도 반복문이 계속 실행되어 삽입된 명령어가 실행한다.
그 다음 취약점을 해결한 패치에서는 parse_and_execute() 함수를 호출할 때 특정 플래그 값을 주어 함수 선언문을 처리할 경우 다른 추가적인 명령어를 처리하지 않도록 수정하고
만약 외부로부터 환경변수를 전달받아 Bash 쉘을 통해 명령어를 실행하는 서버가 존재하면, 공격자는 함수 선언문 뒤에 임의의 명령어를 삽압시켜 해당 프로세스의 권한으로 실행 시킬 수 있어서
직접적으로 명령어 주입이 가능한 취약점이기에 ASLR(Address Space Layout Randomization) 등의 OS 보호 매커니즘에 전혀 영향을 받지 않아 공격 성공률이 매우 높다. (ASLR(Address Space Layout Randomization) > 프로그램이 실행 될 때 마다 메모리 주소를 랜덤하게 배치.)
각 OS 개발자에서는 보안 패치를 신속하게 발표 했으나 구글의 보안 연구원인 타비스 오르만디는 자신의 트위트를 통해 해결된 패치를 적용해도 함수 선언문 처리 과정에 여전히 문제점이 있다고 밝혀 재 이슈화됐고 이후 레드햇의 연구원인 토드사빈, 플로리안 웨이머는 Bash가 10개 이상의 리다이렉트 명령문을 처리하거나 특수한 반복문을 처리하는 과정에서 잘못된 메모리 접근을 유발할 수 있다는 추가적인 취약점을 공개했다.
구글의 미첼 잘루스키는 Bash의 함수 처리 부분을 퍼징(Fuzzing)하는 동안 두가지 취약점을 추가적으로 발견을했다. (퍼징 > 소프트웨어에 임의의 데이터를 무작위로 입력하여 보안상의 취약점을 찾아내는 기술.)
그 중 CVE-2014-6277은 할당되지 않은 메모리에 접근하는 취약점. 공격자가 원하는 메모리 주소를 읽거나 그 주소에 데이터를 쓰도록 제어가 가능하다.
추가 발견된 취약점은 첫 번째 취약점과 유사하게 직접적으로 명령어를 삽입 할 수 있는 취약점이다. 그러나 CVE-2014-6271를 해결한 첫 보안 패치를 설치했을 경우만 취약한 제한 사항이 있다. (신속하게 최신 패치로 업데이트 해야함.)
쉘쇼크 취약점은 시스템에 GNU Bash가 설치되어있다고 무조건 공격에 영향을 받는 것은 아니며 환경변수를 통해 Bash를 호출할 수 있는 프로그램 또는 스크립트가 시스템 내에 존재할 경우 취약점에 영향을 받는 특성을 가진다.[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='() { :[8];}; echo vulnerable' bash -c "echo this is a test" env라는 명령어는 '해당 환경변수를 가지고 명령을 실행해라'는 뜻이다. 즉, x='() { :;}; echo vulnerable' 환경변수를 가지고 bash -c "echo this is a test" 라는 구문을 실행하게 되는 것. 만약 취약점에 노출되었다면 뒤에 있는 echo vulnerable이라는 구문이 실행 될 것이다.
활용[편집]
셸쇼크의 특징인 CVE-2014-6271 취약점에 대한 구문이다.
$ env x='() { :;}; echo vulnerable' bash -c "echo this is a test"
Bash에서 해당 구문을 실행하였을때 다음과 같은 구문이 뜨면 해당 취약점에는 안전한 것이며 this is a test
이렇게 뜬다면 취약한 것이니 빠르게 포맷하면 vulnerable this is a test
http 헤더의 User-Agent 부분을 다음과 같이 변조하면 계정 정보를 탈취 가능하다. User-Agent:() { :; }; echo $(</etc/passwd)
다만 이 경우는 서버가 발신하는 http 헤더에 담겨 있으며, 프록시 툴 없이는 분석이 불가능하다.
Apache서버의 경우 http헤더를 환경변수로 처리하는데 User-Agent가 () {:;}; 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 이 대부분이지 쉘로 페이지를 작성하는 경우는 흔하진 않다.[4]
대안[편집]
이것이 문제가 되는 이유는 웹 연결 기기, 웹 서버, 웹 기반 서비스의 상당수가 리눅스 배포판에서 배시 셸(Bash shell)과 함께 실행되기 때문이다. 또한 맥 OS X 매버릭스 또한 이 결함에 영향을 받는다.
표준 보안 조치를 제대로 취한 사용자라면 직접 영향을 받을 가능성은 많지 않으며 영향력은 미미할 것이다. 그럼에도 불구하고 셸쇼크의 뿌리가 깊다는 사실은 앞으로 몇년이 지난 후에도 취약점 패치가 되지 않은 시스템이 발견될 것이라는 것을 의미한다.
사용자들은 보안 업데이트를 주시해야 하며, 특히 OS X에 대해서는 그러하다. 자신이 실행하고 있는 임베디드 소프트웨어에 대해 ISP 또는 기기 제공업체로부터 받을지 모르는 경고에 대해서도 계속 지켜봐야 한다. 이와 관련해 정보를 요구하거나 소프트웨어를 실행하려는 이메일에 대해 조심해야 한다. 이는 사용자들의 두려움을 이용한 피싱 공격일 수도 있다.[5]
사례[편집]
셸쇼크라 불리는, 리눅스 및 유닉스 계열 운영체제(OS)의 '배시(Bash)' 프로그램 버그를 악용한 사례가 처음으로 발견됐다. 피해자는 대형 인터넷서비스업체 야후다.
6일(현지시간) 리드라이트, 포브스 등은 루마니아의 해커가 배시 버그를 이용해 야후 서버를 점거하고 해킹에 악용해온 것으로 드러났다고 보도했다.
보안연구가 조나단 홀은 "루마니아 해커들이 야후 게임 서버 두개를 배시 버그를 이용해 점령했다"며 "야후가 배시의 예전 버전을 사용했기 때문에 보안에 취약했다"고 주장했다.
퓨처사우스테크놀로지스의 유닉스 전문가인 조나단 홀은 야후의 게임 서버가 어떻게 해커에게 점령당했는지 회사 웹사이트를 통해 설명했다. 그는 "야후 게임 서버는 하루 수백만명이 접속해 사용한다"며 "야후 게임에 접속했던 모든 일반사용자가 해커에게 노출됐다"고 강조했다.
배시는 리눅스와 유닉스 OS에서 기본설정으로 사용되는 셸 프로그램이다. 셸은 윈도의 도스창처럼 명령어를 입력해 프로그램 실행과, 핑 테스트, IP주소 확인, 해당 PC 내 파일 검색 및 실행 등을 수행하는데 사용된다. 시스템 관리자에게 익숙한 원격관리 프로그램이다.
배시 취약점인 일명 '셸쇼크(Shellshock)'는 리눅스/유닉스 기반 서버에 원격에서 무단 접속할 수 있게 하는 버그다. 해커가 배시를 통해 서버에 접속하면 시스템과 서버의 통제권을 장악할 수 있다. 해커에게 점령당한 웹서버에 일반사용자가 접속하면 악성코드를 배포하는 게 가능하다.
이 때문에 해외 보안 전문가들은 셸쇼크를 하트블리드보다 심각한 취약점으로 보고 즉각적인 대처에 나설 것을 조언하고 있다.
야후는 조나단 홀의 주장을 인정했다. 해커에게 점령당한 서버들을 격리조치했으며, 시스템에 대한 패치를 실행했다고 밝혔다. [6]
각주[편집]
참고자료[편집]
- 〈쉘쇼크〉, 《나무위키》
- 〈쉘쇼크〉, 《히든위키》
- 박형미 ,〈쉘쇼크의 대처법은??〉, 《IT월드》, 2014-09-26
- 김우용 기자,〈야후, 셸쇼크에 당했다〉, 《지디넷코리아》, 2014-10-07
같이 보기[편집]