본문 바로가기
정보보안/CVE

CVE-2014-6271 (shellshock)

by meanjung 2021. 9. 5.

https://operatingsystems.tistory.com/entry/Shellshock-CVE20146271

 

[Vul] Shellshock (CVE-2014-6271)

우선, 간략하게 CVE-2014-6271 일명 Bash shellshock 취약점에 대하여 설명하고자 한다. 이 취약점은 Akamai Technology의 Stephane Chazelas에 의해 발견되었다. CVE-2014-6271는 대부분의 Linux/Unix System에서..

operatingsystems.tistory.com


- linux/unix system에서 사용되는 shell인 bash shell에 존재하는 취약점

 

- 취약한 버전

GNU Bash 4.3을 포함하여 이전 모두 bash-3.0-27.el4.2

bash-3.2-32.el5_9.2
bash-3.2-32.el5_9.1
bash-3.2-24.el5_6.1
bash-3.2-33.el5_11.1.sjis.1
bash-3.2-33.el5.1
bash-4.1.2-15.el6_4.1
bash-4.1.2-9.el6_2.1
bash-4.1.2-15.el6_5.1.sjis.1
bash-4.1.2-15.el6_5.1
bash-4.2.45-5.el7_0.2

[ 출처 : https://guleum-zone.tistory.com/84 ]


필요한 지식

1. bash shell에서 환경변수 세팅하는 방법

2. bash 동작 구조/순서

3. php cgi가 동작하는 방식


1. bash shell에서 환경변수 세팅하는 방법

- bash shell의 역할

특정 프로그램을 사용자가 실행할 수 있도록 os와 사용자 사이의 interface 역할

 

- 환경변수

프로그램들이 실행되는데 영향을 줄 수 있는 변수들

 

- 환경변수 세팅하는 법(일반 변수)

x=3

export x

 

- 환경변수 세팅하는 법(함수)

foo(){ echo hello; }

export -f foo

 

- 같은 이름의 변수와 함수 모두 환경변수로 등록 가능

foo(){ echo hello; }

export -f foo

foo=4

export foo

 

- foo 지우고 다시 환경변수 세팅

export -nf foo

export foo='(){ echo new func; }'

bash subshell 실행

foo ☞ 결과 : new func

* 여기서 중요한 점은

실행되는 foo가 사실은 변수 foo라는 점이다.

따옴표('')에 넣어서 선언을 했음에도 subshell에서는 변수 foo가 함수로 인식되었다.

 

 

CVE-2014-6271 취약점은 ()로 시작하는 변수가 subshell이 실행되면 { ... } 부분이 함수로 인식되는데, 그 이후에 나오는 명령어가 실행된다는 내용이다.

 

export foo='(){ echo hello; }; pwd; echo vulnerable; ls -al' 을 치고

bash 를 치면 pwd, echo vulnerable, ls -al 모두 실행되는 것을 볼 수 있다.

* 여기서 중요한 점은

bash 명령어로 subshell이 실행되었을 뿐인데 pwd, echo vulnerable, ls -al이 실행된다는 것이다.

 


2. bash 동작 구조/순서

왜 subshell을 실행시키면 바로 저 명령어가 실행되는 것일까?

 

- bash 동작 순서

1. bash 실행

2. bash 환경변수 초기화

3. bash shell prompt 출력

4. 명령어 기다림

5. 명령어를 수행할 경우 명령어를 문자열로 저장해 해당 문자열 파싱 수행

6. 파싱된 구조체를 이용해 명령어 수행

 

- 2번에 주목

bash를 실행한 후 shell prompt를 출력하기 전에 반드시 환경변수를 초기화해준다.

이 과정에서 취약점이 존재하여 pwd, echo vulnerable, ls -al이 실행되는 것이다.

 

- 그렇다면 이 취약점은 이미 쉘을 획득한 환경에서만 가능한게 아닌가?

아니다. bash subshell이 실행될 때 { ... } 이후에 있는 코드가 실행되는 것이다.

따라서 굳이 shell을 통해서가 아니더라도 특정 프로그램이 subshell을 실행한다면 가능한 것이다.

 

- 어떤 프로그램이 shell을 subshell로서 실행시킬 수 있나?

php-cgi가 대표적이다.

 


3. cgi 동작 원리

- cgi란?

웹서버에서 동작하는 프로그램

cgi를 작성한다는 말은 프로그램 하나를 작성한다는 말이므로 언어가 필요한데, 보통 php, perl, python이 많다.

결국 php같은 dynamic page같은 것이라고 보면 된다.

 

- cgi 동작 과정

1. 사용자가 요청을 보낸다.

2. 웹 서버가 사용자의 요청을 확인한다. 사용자의 요청이 cgi 프로그램(executable file)일 경우 해당 cgi를 실행시킨다.

3. cgi가 실행되면 서버는 사용자의 브라우저가 읽을 수 있는 형태의 static html page를 리턴하게 되는데 웹 서버가 그 static html page를 사용자에게 전달해준다.

4. 사용자의 브라우저에서 응답으로 받은 static html page를 읽는다.

 

- 3, 4번에 주목

static html page에 header까지 포함된 데이터가 작성되어야 한다는 뜻이다.

따라서 모든 cgi 프로그램의 첫 부분에는 http 헤더에 대한 정보가 들어가야 한다.

 

- 실습

1. /cgi-bin/test.cgi 를 왼쪽과 같이 입력 후 저장

2. ~~/cgi-bin/test.cgi 로 접속하면 환경변수들을 볼 수 있음

2-1. 환경변수 결과를 확인해보면, http_user_agent, http_host 등 http header 내의 값들이 들어있는 것을 볼 수 있다.

* 오로지 env 명령어를 수행한 결과물을 출력했을 뿐인데, 요청할 때 보낸 http header의 내용이 환경변수에 고스란히 확인된다.

출처 : https://operatingsystems.tistory.com/entry/Shellshock-CVE20146271

 


여기까지 대강 흐름을 이해했고,

실제 bash가 어떤 취약점을 갖고 있는지 디버깅을 통해 bash 소스코드를 확인해보고 싶다면

위의 블로그 링크로 들어가서 보면 되겠다.

'정보보안 > CVE' 카테고리의 다른 글

CVE-2007-2447 정리  (0) 2021.08.16
CVE-2019-0232 테스트 해보기  (0) 2021.07.22

댓글