GNU Bash에서 환경 변수를 처리하는 과정에서 취약점이 확인되었으며 공격자는 Bash 환경 변수를 이용할 수 있는 대상 서버의 Application을 통해 쉘 명령어를 실행시킬 수 있다. (Bash는 기본적으로 원격의 사용자에게 쉘을 제공해주기 위해 다양한 프로그램들을 제공해주며 CGI Script (Apache, etc) 들을 제공해주거나 제한적 명령어를 사용할 수 있는 프로그램을 제공해준다.)
취약점은 정확하게 환경 변수를 파싱하지 못해서 발생하는 것으로 환경 변수가 "() {" 문자열로 시작할 경우 Bash는 정의된 initialize_shell_variables()를 호출하게 된다. 해당 함수는 환경 변수가 "() {"로 시작함에 따라 함수로 정의하는 것으로 인식하며, 이후 함수로 정의(define)하기 위해 이후의 문자열을 parse_and_execute() 함수로 전달한다.
[그림1. variables.c 중 initialize_shell_variables() 함수 코드]
parse_and_execute() 함수를 살펴보면 취약한 핵심 내용을 확인할 수 있다. 그것은 이 함수가 함수 정의 내용이 끝났음에도 불구하고 함수의 실행을 멈추지 않고, 이후에 있는 문자열의 실행을 하는 것이고, 이 중 명령어가 있을 경우 공격자의 의도된 명령에 따라 명령어가 실행된다.
아래 parse_and_execute() 함수의 일부를 살펴보면 while 반복 문을 통해 환경 변수에 전달된 문자열을 while() 함수를 통해 끝날 때까지 반복하며 수행하도록 되어 있다. 함수일 경우, 해당 함수가 끝나는 부분을 체크하여 반복 문을 멈춰야하지만 이에 대한 조건 (if) 이 존재하지 않아 이후 문자열을 그대로 수행하게 된다.
[그림2. evalstring.c 중 parse_and_execute() 함수 내용, 명령을 파싱하고 실행]
취약한 장비인지 확인하는 명령어는 아래와 같다.
[그림3. 취약 장비 확인]
또한 원격에서 아래와 같이 curl 명령어로 공격을 수행할 수 있다. (단, 사전에 공격 대상 서버의 취약한 cgi가 설치돼있어야 한다.)
이 외에 파이썬으로 작성된 소스, Malzilla와 같은 HTTP Header 조작 Tool 등으로 공격이 가능하다.
이에 대한 공격은 주로 HTTP Header에 포함되어 공격이 시도되나 URI 부분에도 포함되어 공격 수행이 되고 있다.