Bash ShellShock Patch

몇달전 OpenSSL HeartBleed 보안이슈에 이어 최근 Bash ShellShock로 인해 다시한번 떠들썩 하다.

아마도 저번처럼 이번 보안기사 실기시험에 이와관련된 문제가 나올듯하다 ㅋ

그럼 패치하기에 앞서 이번 이슈에대해서 간략하게 알아보자.

Bash Shell은 유닉스, 리눅스 계열 OS에서 명령어를 구동 시킬 수 있는 쉘 중 하나인데 이 Bash Shell 에서 OpenSSL HeartBleed 보다 더 위협적인 취약점이 최근 발견됨.

취약점의 내용을 간략히 말하자면 Bash Shell의 함수 선언을 방식을 이용하여 명령어가 실행 가능하도록 처리를 시킴. 웬만한 분들이 아시는 SQL Injection 공격과 유사한 공격 방식임.  
Root 명령어 권한이 없는 일반계정에서도 Root권한 계정만이 실행할 수 있는 명령어 수행 가능…

취약 버전 : Bash 4.3 이하 버전을 사용하는 모든 시스템 (현재 GNU Bash의 최신버전이 4.3이기 때문에
               Bash Shell을 사용하면 무조건 패치적용 해야한다고 보면됨;;;;)

더 자세한 내용을 알고 싶으면 아래 한국인터넷진흥원 보안공지 참고 바라며 보안공지에 Bash 취약점 대응 방안 권고 파일이 첨부되어있으니 꼭 다운받아 읽어 보길 바람.

음….. 알고 싶으면이 아니라 아주 중요한 보안이슈이니 필수로 보길 바람;;;;;

 

한국인터넷진흥원 보안공지 :
Bourne Agin Shell (Bash) 임의코드 실행 취약점 보안 업데이트 권고 (2차)

그럼 이번 이슈를 잠재우러 Bash 업그레이드 하는 방법을 알아보자.
이번 포스팅에 다룰 패치방법 : yum을 이용한 업데이트, Source 컴파일을 통한 업데이트

보이지요? Source 컴파일을 통한 업데이트…

이말은 뭐??? 유지보수 계약체결하지 못하여 업그레이드 어떻게 해야하나 하는 RedHat에도 버그 픽스가 가능하고 또한 sunfreeware.com이 더이상 후원을 받지 못하여 무료로 제공받던 패키지 파일이 UNIXpackage.com에서 유료로 제공함에 따라 이거 하나 받을려고 돈들여야하나 하는 SunOS Solaris에도 적용가능하다는 말~~~

당연히 오래된 Linux OS버전을 사용중에 있어서 yum등 자동 업데이트 프로그램으로 버그픽스를 할 수 없는 리눅스에도 적용가능하다는 말~~~

그냥 웬만한 시스템이면 OS종류 버전따위 안가리고 대부분 적용가능 함.

본인도 Source 컴파일 업그레이드 방법으로 오래된 무료 리눅스 부터, 유료 버전인 레드햇,  그리고 Solaris 업그레이드를 모두 완료 하였음. 

 

그럼 본격적인 포스팅에 앞서 HP-UX에서 Bash 업데이트 방법을 간략하게 이야기 한다.

HP-UX 같은경우 발빠르게 패치를 제공하였다.

HP-UX를 운영 관리하시는 분들은 운영 시스템의 OS버전, Architcture를 확인하여 아래경로에서 해당 하는 Depot파일을 받은 후 gzip으로 해당파일을 풀어주고 swinstall을 이용하여 설치한다.

#> gzip -d “다운받은bash Depot파일”

#> swinstall -s “압축풀린 Bash Depot파일 절대경로”

swinstall 실행 후 bash 파일 목록이 나타나면 키보드 스페이스 바 버튼으로 선택후 탭 키를 이용하여 상단메뉴로 이동 상단메뉴의 Actions – Install 로 이동하여 설치를 시작한다 설치가 완료되면 OK 또는 Done 버튼이 활성화 되므로 설치가 되지 않는가 싶어 Cancle 버튼을 누르는 오류를 범하지 말자.

설치가 정상적으로 완료되면 탭 키를 이용하여 다시 상단메뉴로 이동 File – Exit로 빠져나오면 된다.

     
■  꼭 swinstall은 설치할 Depot 파일경로를 절대경로로 적어주어야만 제대로 인식이된다.

     HP-UX Bash Patch : http://hpux.connect.org.uk/hppd/hpux/Shells/bash-4.3.030/

자 이제 본격적으로  본 포스팅 속으로 고고씽~~~

 

☞ 본 포스팅은 가장 널리 사용되고 있는 리눅스 기반으로 포스팅되었으니 각자 사용하고 있는 Linux, Unix계열 종류 OS에 맞게 변형하여 적용하면 된다.

▣ Bash 버전확인 방법
   #> bash –version

▣ 취약점 확인 방법

   ◈ 취약점 1(CVE-2014-6271)   
    #> env x='() { :;}; echo VULNERABLE’ bash -c :
    vulerable
    this is a test

▷ “vulnerable” 문구가 나오면 업데이트 필요

 

   ◈ 취약점 2(CVE-2014-7169)

     #> cd /tmp; rm -f /tmp/echo; env ‘x=() { (a)=>\’ bash -c “echo date”; cat /tmp/echo
     bash: x: line 2: syntax error near unexpected token `=’
     bash: x: line 2: `’
     bash: error importing function definition for `x’
     bash: /root/.bashrc: line 1: syntax error near unexpected token `newline’
     bash: /root/.bashrc: line 1: `# .bashrc’
     date
     cat: /tmp/echo: No such file or directory

      ▷ “bash:” 관련 문구가 나오면 업데이트 필요

 

   ◈ 취약점 3(?)

    #> env -i X=’ () { }; echo hello’ bash -c ‘date’
     hello

      ▷ “hello” 문구가 나오면 업데이트 필요

 

   ◈ 취약점 4(CVE-2014-7186)

    #> bash -c ‘true <<EOF <<EOF <<EOF <<EOF <<EOF <<EOF <<EOF <<EOF <<EOF <<EOF <<EOF <<EOF <<EOF <<EOF’ || echo “CVE-2014-7186 vulnerable, redir_stack”

     CVE-2014-7186 vulnerable, redir_stack

      ▷ “CVE-2014-7186 vulnerable, redir_stack” 문구가 나오면 업데이트 필요

 

   ◈ 취약점 5(CVE-2014-7187)

    #> (for x in {1..200} ; do echo “for x$x in ; do :”; done; for x in {1..200} ; do echo done ; done) | bash || echo “CVE-2014-7187 vulnerable, word_lineno”

     CVE-2014-7187 vulnerable, word_lineno

      ▷ “CVE-2014-7187 vulnerable, word_lineno” 문구가 나오면 업데이트 필요

 

▣ 네트워크를 통한 자동 업데이트 방법

   ◈ CentOS
     #> yum clean all && yum update bash

   ◈ Redhat
     #> yum clean all && yum update bash

   ◈ Ubuntu
     #> sudo apt-get update
     #> sudo apt-get install only-upgrade bash

      위명령어 오류시 다음 명령어 실행

     #> sudo apt-get install dist-upgrade bash

   ◈ Suse
     #> zypper update bash

   ◈ Fedora

       ▷fedora 19
           #> su -c “yum -y install koji”
           #> koji download-build –arch=$(uname -m) bash-4.2.48-2.fc19
           #> su -c “yum localinstall bash-4.2.48-2.fc19.$(uname -m).rpm”

       ▷fedora 20

           #> su -c “yum -y install koji”
           #> koji download-build –arch=$(uname -m) bash-4.2.48-2.fc20
           #> su -c “yum localinstall bash-4.2.48-2.fc20.$(uname -m).rpm”

       ▷fedora 21 알파

           #> su -c “yum -y install koji”
           #> koji download-build –arch=$(uname -m) bash-4.3.25-2.fc21
           #> su -c “yum localinstall bash-4.3.25-2.fc21.$(uname ?m).rpm”

   ◈ Oracle Linux

           #> yum list-security | grep bash

◈ FreeBSD

          #> pkg info bash
          #> pkg upgrade bash

 

▣ Source 파일을 컴파일하여 패치하는 방법

리눅스 버전이 너무 오래되었을경우 yum config를 수정하여 yum update를 활성화 시킬 수 있으나 현재 이슈되고 있는 Bash Shellshock가 Bug fix된 패치는 다운받을 수 없다.

또한 RedHat Linux를 사용하고 있을경우 유지보수를 체결해야만 rpm 파일 제공 또는 yum을 이용 할 수 있다.

이와같은 경우 무료 리눅스 버전일 경우 최신버전으로 새로 설치하거나 RedHat 경우 돈들여서 유지보수 계약 체결을 해야 하는데 서버가 한두대면 모를까 버전이 낮은 리눅스 서버를 많이 관리하고 있을때에 그서버들 모두 한꺼번에 최신버전으로 설치하기에는 현실적으로 불가능하다.

그래서 bash Source 파일을 이용하여 업그레이드 하는방법을 알아보자.

1. bash 기존파일 백업

   #> which bash
   /bin/bash

   #> cp /bin/bash /bin/bash.old


2. bash 버전 확인

   #> bash –version
   GNU bash, version 4.0.1(1)-release (i686-redhat-linux-gnu)

     ▶ minor 버전까지 필수 확인(꼭 기억하도록 하자)


3. 패치작업할 폴더 생성 및 이동

    #> mkdir /usr/local/src/bashfix
    #> cd /usr/local/src/bashfix


4. 컴파일에 필요한 의존성 패키지 설치

    #> yum install patch byacc textinfo bison autoconf gettext ncurses-devel

      ■ 웬만하면 이건 기본적으로 다설치되어있음;;; 혹시설치 안되어있으면 설치…..


5. bash 다운로드 및 압축해제 후 이동

    #> wget https://ftp.gnu.org/pub/gnu/bash/bash-4.0.tar.gz

      ▶ 다운받을 bash 파일은 현재 설치되어있는 위에서 버전확인 방법으로 확인된 bash의 minor버전
          까지 동일한 버전으로 다운받는것을 권장한다.
         
          단, 모든과정 수행 후 에도 취약점 해결이 되지 않는다면 한단계 상위버전으로 업그레이드 한다.

          예:) 현재 버전 2.05b 일 경우 한단계 윗 버전인 3.0 버전으로 업그레이드

    #> tar zxvf bash-4.0.tar.gz
    #> cd bash-4.0


6. Source 파일에 취약점이 해결된 패치파일 다운 테스트

    #> curl -k https://ftp.gnu.org/pub/gnu/bash/bash-4.0-patches/bash40-001 | patch -p0

      ▶ 아래 처럼 나와야 정상

% Total    % Received % Xferd  Average Speed          Time             Curr.
                                           Dload  Upload Total    Current  Left    Speed
100  5156  100  5156    0     0   6002      0  0:00:00  0:00:00  0:00:00 5035k


7. 패치파일 갯수 확인

   ▶ 패치파일은 적개는 20개에서 많게는 40개가 넘는다, 이모든 패치를 받아야하기때문에 해당버전의
       패치 갯수 많큼 6번과정에서 패치번호를 바꿔가며 반복해서 받아야한다.
       이러한 수고스러움을 해결하기 위해 간단한 스크립트로 다운받자.

   ▶ 우선 웹브라우져를 실행시켜 아래 경로로 이동한 해당 패치갯수가 몇개인지 확인 하도록 하자.
       아래경로로 들어가보면 2014년 10월 08일 현재 bash40-001 ~ bash40-044까지 있는것을 확인 할
       수 있다. 필자가 포스팅 완료 후 추후에 패치가 더나온다면 패치갯수는 더많아질 것이다.

https://ftp.gnu.org/pub/gnu/bash/bash-4.0-patches/

      ■ 위 주소로 무조건 이동을 하는게 아니라 자기가 받아야할 버전의 패치경로로 이동해야 한다.

예:) 본인이 다운받은 bash 버전이 2.05b일 경우 https://ftp.gnu.org/pub/gnu/bash/bash-2.05b-patches/


8. 패치파일을 자동으로 받을 수 있는 스크립트 생성 및 수정

     #> vi bash-multipatch.sh

   ▶ 아래 점선안의 내용을 복사하여 vi 에디터로 생성한 파일 bash-multipatch.sh에 붙여넣기 후 저장.

———————————————————————————

#!/bin/sh

version=“4.0”
nodotversion=“40”
lastpatch=“44”
for i in `seq 1 $lastpatch`;
do
number=$(printf %02d $i)
file=“https://ftp.gnu.org/pub/gnu/bash/bash-${version}-patches/bash${nodotversion}-0$number”

echo $file
curl -k $file | patch -N -p0
done

———————————————————————————

   ▶ vi에디터로 방금 저장한 bash-multipatch.sh 파일을 열어 version, nodotversion, lastpatch를
       자신이 다운받은 bash 버전과 그 버전의 패치갯수로 수정하자.

       예:) 다운받은 bash 버전이 2.05b 이고 버그픽스된 패치파일이 13개일경우

         version=“2.05b”
         nodotversion=“205b”
         lastpatch=“13”

   ▶ 스크립트 파일 권한 변경.

     #> chmod 755 bash-multipatch.sh


9. 스크립트를 통한 패치파일 다운

   #> ./bash-multipatch.sh


10. 패치파일이 Source파일에 제대로 적용되었는지 확인

   #> grep “#define PATCHLEVEL” patchlevel.h | tail -1
   #define PATCHLEVEL 44

     ■ #define PATCHLEVEL의 뒤 번호가 패치갯수만큼의 숫자로 카운터되어있는지 확인

11. 컴파일 및 설치

   #> ./configure
   #> make
   #> make test


12. 설치된 bash파일 확인 및 권한 설정

   #> ls -la bash
   -rwxr-xr-x    1 root     root      1460182 Oct  8 15:33 bash

     ■ 추 후에 bash 사용에 있어 권한 문제가 발생하면 bash 파일을 775로 권한변경을 해준다.


13. 새로 설치된 bash 파일 복사

   #> cp -f bash /bin/bash


14. 픽스된 bash 버전 확인

   #> /bin/bash
   #> bash –version
   GNU bash, version 4.0.44(1)-release (i686-pc-linux-gnu)


15. 패치하기전 메모리상에서 bash를 물고있는 프로세서 재시작

   #> lsof | grep bash

     ■ 위 명령어로 확인후 해당 프로그램 재시작

 

[참고 사이트] : SteveJenkins.com

Thank you for your help, Steve