CVE-2014-6271 bash 취약점 (Shellshock)은 무엇이며 어떻게 해결합니까?


141

최근 Bash의 취약점 인 "CVE-2014-6271"( USN-2362-1 참조)에 관한 뉴스 가 나왔습니다 . 이 영향을 받는지 어떻게 알 수 있으며 어떻게 고칠 수 있으며 왜 신경 써야합니까?

이 취약점의 범위와 심각성으로 인해이 취약점에 대한 정식 답변으로 설계되었습니다.


18
"어떻게 고쳐야합니까?" -> 업그레이드 관리자를 실행하십시오! 실제로 Ubuntu는 보안 업데이트를 발표하며 전담 보안 팀이 있습니다. 소스에서 Bash를 빌드하는 것에 대한 답변을 게시하지 마십시오! ; 미래에 시스템을 유지 관리하는 것은 불필요하게 복잡하고 어렵습니다.
gertvdijk

5
또한 불완전한 수정에 대한 추가 CVE도 있습니다. CVE-2014-7169
gertvdijk

18
제발 소스로부터 빌드에 대한 포스트 답변을. 그들이해야하든 아니든, 일부 사람들은 고대 우분투 서버를 가지고 있으며 소스에서 빌드하는 것이 유일한 옵션 일 수 있습니다.
GaryO

3
죄송합니다. 테스트에 대시 대신 bash를 넣은 것을 깨달았습니다. 괜찮습니다.
Matt H

4
읽기 : oss-sec : Re : CVE-2014-6271 : bash를 통한 원격 코드 실행 . Bash 버그는 여전히 수정되지 않았습니다
blade19899

답변:


126

배쉬 란?

Bash는 우분투의 기본 대화식 쉘입니다. 터미널 에뮬레이터를 통해, tty 또는 ssh를 통해 터미널과 인터페이스 할 때 일반적으로 bash읽고 실행할 명령을 입력합니다 . 터미널을 전혀 사용하지 않더라도 여전히 Bash가 있습니다.

우분투에서는 /bin/shbash가 아닙니다 (대시입니다). bash만이이 취약점의 영향을받습니다.

익스플로잇은 어떤 영향을 줍니까?

Bash와 OS 는 현재 로그온 한 사용자, 하드 디스크에서 프로그램을 찾을 위치 및 기타 해당 기능을 설명하는 환경 변수 세트를 추적 합니다. 특정 구조로 환경 변수를 만들어 공격자는 다음에 Bash를 시작할 때 코드를 실행할 수 있습니다.

공격자는 해당 환경 변수를 여러 가지 방법으로 설정할 수 있습니다.

  • git over ssh와 같은 특정 설정으로 SSH와 같은 서비스에 원격으로 연결하십시오. Mitre가 경고 하듯이 sshd ForceCommand옵션 의 사용은 공격 벡터입니다. 쉘이 bash가 아닌 계정은 영향을받지 않습니다.
  • 환경 변수를 설정하도록 속입니다.
  • 다른 프로그램으로 인해 환경 변수가 해당 값을 갖도록 설정합니다. 예를 들어, 특정 사용자 컨텐츠로 환경 변수를 설정해야하는 웹 서버 및 스크립트가있을 수 있습니다. 해당 스크립트가 자체 스크립트를 작성하고 다른 환경 변수를 건드리지 않아도 충분합니다. 이름과 조작 된 값을 가진 단일 환경 변수만으로도 악용에 성공할 수 있습니다.
  • 내가 여기서 언급하지 않은 다른 방법들.

일단이 변수를 설정하면 다음 bash어떤 이유로 든 공격자의 코드가 실행됩니다. sudo -sbash는 수퍼 유저 ( 컴퓨터 데이터 및 프로그램을 완전히 제어 할 수 있는 관리 사용자 규칙)로 bash를 생성하기 때문에 특히 두려운 일 입니다. 표준 사용자로만 bash를 시작하더라도 해당 사용자의 파일을 삭제할 수 있습니다.

bash를 직접 사용하지 않더라도 많은 프로그램이 작업의 일부로 bash를 자체적으로 생성합니다. 이 경우에도 취약합니다. 그러나 Ubuntu /bin/sh는 bash가 아니므로 bash를 명시 적으로 호출하고 기본 스크립팅 쉘이 아닌 프로그램 만 영향을받습니다.

Mitre에 따르면 :

OpenSSH sshd의 ForceCommand 기능, Apache HTTP Server의 mod_cgi 및 mod_cgid 모듈, 지정되지 않은 DHCP 클라이언트에 의해 실행 된 스크립트 및 환경 설정이 Bash 실행의 권한 경계를 넘어 발생하는 기타 상황.

내가 취약한가?

dpkg를 사용하여 설치된 패키지 버전을 확인하십시오.

dpkg -s bash | grep Version

bash패키지 에 대한 정보를 찾고 버전 만 표시하도록 출력을 필터링합니다. 고정 된 버전은 4.3-7ubuntu1.4, 4.2-2ubuntu2.5하고 4.1-2ubuntu3.4.

예를 들어 다음과 같습니다.

wlan1-loopback% dpkg -s bash | grep Version
Version: 4.3-7ubuntu1.4

내가 취약하지 않다고 판단 할 수 있습니다.

업데이트는 어떻게합니까?

표준 업데이트 관리자가이 업데이트를 제공합니다. 이것은 어떤 OS를 사용하는지 또는 얼마나 잘 관리했는지에 관계없이 보안 업데이트가 어떻게 중요한지에 대한 주요 예입니다.

USN 게시판은 새 버전이 우분투 14.04 트러스티 Tahr, 12.04 정확한 천산갑, 및 10.04 루시드 살쾡이를 위해 출시 된 상태. 이러한 LTS 버전 중 하나가 아니지만 합리적으로 최신 버전 인 경우 패치 된 패키지를 찾을 수 있습니다.

먼저, 당신이 있는지 확인

취약한 경우 먼저 최신 패키지 목록을 가져와야합니다.

sudo apt-get update && sudo apt-get install bash

첫 번째 명령은 수정 된 버전을 포함하는 최신 패키지 목록이 있는지 확인하고 두 번째 명령은 최신 (고정) 버전의 bash를 설치합니다.

bash가 생성 될 때만 버그가 발생하는 것처럼 보이지만 가능한 경우 즉시 재부팅하는 것이 좋습니다.


20
죄송합니다, 당신은 취약하다 . 원래 패치로 전체 문제가 해결되지는 않습니다. cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2014-7169 AFAIAA를 참조하십시오 . 현재 공개적으로 사용할 수있는 수정 프로그램이 없습니다 . 예 : people.canonical.com/~ubuntu-security/cve/pkg/bash.html
Mormegil

4
@hexafraction 12.10이 이것에 대한 업데이트를 받는다는 것을 어디서 읽습니까? 나는 그렇게 생각하지 않습니다. 12.10, 13.04, 13.10은 매우 끝났습니다 ! 또한 백 포트 리포지토리는 보안 업데이트에 사용되지 않습니다 .
gertvdijk

2
@hexafraction 아니, 그들은하지 않습니다! 그것이 삶의 끝이라는 요점입니다. 더 이상 지원하지 않습니다.
gertvdijk

1
@ MichaelHärtl Ubuntu 12.10을 사용하는 경우 packages.ubuntu.com/precise/bash 에서 12.04 버전의 bash를 다운로드하여 수동으로 설치할 수 있습니다.
David

2
CVE-2014-7169에 대한 픽스는 업데이트 관리자에서 제공됩니다 (나를 위해).
Calmarius

27

Hacker News에서 이걸 훔쳐 보았다 . 나 (Odroid-XU)와 같은 저장소에 문제가있는 경우 소스에서 패치 / 빌드하려는 경우 잘 작동합니다.

TMPDIR=/tmp/bash-src
mkdir $TMPDIR
cd $TMPDIR
#download bash
wget http://ftp.gnu.org/gnu/bash/bash-4.3.tar.gz
#download all patches
for i in $(seq -f "%03g" 1 999); do 
  wget http://ftp.gnu.org/gnu/bash/bash-4.3-patches/bash43-$i
  if [[ $? -ne "0" ]]; then
    MAX=$(expr $i - 1)
    break;
  fi
done
tar zxf bash-4.3.tar.gz 
cd bash-4.3
#apply all patches
for i in $(seq -f "%03g" 1 $MAX);do
  echo apply patch bash43-$i
  patch -p0 < ../bash43-$i
done
#build and install
./configure && make
sudo make install
cd ../..
rm -r $TMPDIR

그런 다음 다음을 실행하십시오.

env x='() { :;}; echo vulnerable' bash -c "echo this is a test"

그리고 당신이 얻는다면 :

bash: warning: x: ignoring function definition attempt
bash: error importing function definition for `x'
this is a test

그럼 당신은 모두 좋다!


경고 : make install은 bash를 설치 /usr/local/bin하므로 /bin/bash수정되지 않으며 curl에서 호출 할 수 있습니다!


1
다음은 데비안 lenny에서 패치로 bash 3.2를 빌드하는 방법입니다 : gist.github.com/mattwhite/86de50d30134129e44ef
Matt White

13
-1. 소스에서 빌드 할 필요가 없습니다. 우분투에는 리포지토리에 보안 패치가 있습니다. "리포지토리 문제"가있는 경우이를 수정하십시오. 보안 업그레이드를받지 않으면 더 많은 방법으로 취약해질 것입니다!
gertvdijk

1
@ 매트 화이트 감사합니다! 당신은 저에게 몇 시간을 절약했습니다 :)
Florian Fida

5
@FlorianFida 이것은 AskUbuntu입니다! 이 사이트의 모든 사람은 Ubuntu 사용 범위에 대한 답변을 게시해야합니다.
gertvdijk

6
@ MichaelHärtl 12.10은 수명 종료입니다. 이미 오래 전에 보안 업데이트를 더 이상받지 않습니다. 업그레이드!!!
gertvdijk

9

참고 : CVE-2014-7169 용 보안 패치는 표준 보안 업데이트로 릴리스되었습니다. 이 패치를 받기 위해 ppa를 추가 할 필요는 없습니다. 다음 만 필요합니다.

sudo apt-get update

sudo apt-get upgrade

bash를 올바르게 패치했는지 확인하려면 다음 명령을 실행하십시오.

dpkg -s bash | grep Version

14.04 LTS를 사용중인 경우 다음과 같은 출력이 표시됩니다.

Version: 4.3-7ubuntu1.4

12.04 LTS를 사용하는 경우 출력은 다음과 같아야합니다.

 Version: 4.2-2ubuntu2.5

1
이것은 정확하지만 공식 패치가 제공되었으므로 보안 업데이트가 릴리스되었습니다. 결과적으로이 단계는 더 이상 필요하지 않습니다.
Robie Basak

맞습니다. 위의 게시물을 편집하겠습니다. 감사합니다.
branch.lizard

1

당신이 11.04에 있다면 : 아래 단계를 사용하십시오 (그것은 나를 위해 일했습니다)

cd ~/
mkdir bash
wget https://ftp.gnu.org/gnu/bash/bash-4.3.tar.gz
for i in $(seq -f "%03g" 0 25); do wget https://ftp.gnu.org/gnu/bash/bash-4.3-patches/bash43-$i; done

필요한 패치가 다운로드되지 않은 경우 ftp 패키지를 설치하십시오.

apt-get install ftp
for i in $(seq -f "%03g" 0 25); do wget https://ftp.gnu.org/gnu/bash/bash-4.3-patches/bash43-$i; done
tar zxvf bash-4.3.tar.gz
cd bash-4.3
for i in $(seq -f "%03g" 0 25);do patch -p0 < ../bash43-$i; done
./configure && make && make install
apt-get install build-essential
./configure && make && make install

패치가 적용되었는지 확인하려면 :

env x='() { :;}; echo vulnerable' bash -c "echo this is a test"

0

EOL 인 Natty 11.04를 사용하고 있으며 (old-releases.ubuntu.com을 사용하도록 /etc/apt/sources.list를 업데이트했습니다) 소스에서 빌드해야합니다. 저는 .deb를 만들고 싶었습니다. 최소한 패키지 관리는 "인식"입니다. bash 버전은 기본 버전이 아닙니다. 100 % 성공하지는 못했지만 패키지는 "최신"으로 등록되고 bash바이너리는 고정되어 있으므로 여기에 내가 한 일이 있습니다.

apt-get source bash
wget https://gist.githubusercontent.com/drj11/e85ca2d7503f28ebfde8/raw/31bd53ed2e47b220d3c728f5440758e0f76769de/gistfile1.c -O bash_CVE-2014-6271.patch
wget https://gist.githubusercontent.com/drj11/239e04c686f0886253fa/raw/046e697da6d4491c3b733b0207811c55ceb9d927/gistfile1.c -O bash_CVE-2014-6271_plus.patch
cd bash-4.2/

이제 (sub) 디렉토리 bash-4.2/에 다음이 있습니다 : 파일 : 소스 bash-4.2.tar.xz로 가져 오기 위해 압축을 풀어야합니다 bash. 그리고라는 하위 디렉토리 debian.

에 대한 종속성을 피하기 위해 다음과 같이 변경 texlive했습니다 bash-4.2/debian/control.

Source: bash
...
Build-Depends: autoconf, autotools-dev, patch, bison, libncurses5-dev,
# texinfo, debhelper (>= 5), texi2html, locales, gettext, sharutils, time, xz-ut
ils
 debhelper (>= 5), locales, gettext, sharutils, time, xz-utils
# Build-Depends-Indep: texlive-latex-base, ghostscript
Build-Depends-Indep: ghostscript

...에서 bash-4.2/debian/rules:

binary-doc: bash-install #bash-doc-build
        dh_testdir
        dh_testroot
        mkdir -p $(d_doc)/usr/share/doc/$(p)
        dh_installdocs -p$(p_doc) 
ifeq ($(with_gfdl),yes)
        #cp -p build-bash/doc/bashref.pdf $(d_doc)/usr/share/doc/$(p)/.
        #dh_link -p$(p_doc) \
        #    /usr/share/doc/$(p)/bashref.pdf /usr/share/doc/$(p_doc)/bashref.pdf
else
        rm -f $(d_doc)/usr/share/doc-base/bashref
endif
        rm -f $(d_doc)/usr/share/info/dir*
        #cp -p build-bash/doc/bash.html build-bash/doc/bash.pdf \
        #    $(d_doc)/usr/share/doc/$(p)/
        #dh_link -p$(p_doc) \
        #    /usr/share/doc/$(p)/bash.html /usr/share/doc/$(p_doc)/bash.html \
        #    /usr/share/doc/$(p)/bash.pdf /usr/share/doc/$(p_doc)/bash.pdf
        dh_installchangelogs -p$(p_doc) bash/CWRU/changelog
        ...

bash-4.2/디렉토리 에서 버전을 변경하려면 다음을 수행하십시오.

bash-4.2$ dch --local patchCVE

... 요청 될 때 변경 로그에 메모를 작성하십시오. 이렇게하면 .deb (및 관련 메타 데이터)가 (제 경우에는) 호출 bash_4.2-0ubuntu3patchCVE1_i386.deb됩니다.

그런 다음 dpkg-buildpackage -us -uc또는 debuild명령으로 빌드를 시도 할 수 있습니다 . 참고-이 중 하나는 zip에서 소스를 다시 압축 해제하므로 패치가 무시 될 수 있습니다! 그래도 소스 중 하나를 풀고 빌드하도록 소스 중 하나를 한 번 실행하십시오 ( debuildtexlive로 인해 결국에는 실패 할 수 있지만 소스를 언팩하고 빌드해야합니다).

그런 다음 패치를 적용하십시오. -p1현재 bash-4.2/디렉토리 에 있기 때문에 여기에서 사용해야 합니다 .

bash-4.2$ patch -p1 < ../bash_CVE-2014-6271.patch 
bash-4.2$ patch -p1 < ../bash_CVE-2014-6271_plus.patch 

그런 다음 다음을 실행하여 패치 버전을 다시 빌드하십시오.

bash-4.2$ fakeroot debian/rules build 

실행 파일을 다시 빌드합니다. 그것을 테스트하려면 :

bash-4.2$ env VAR='() { :;}; echo Bash is vulnerable!' ./build-bash/bash -c "echo Bash Test"

.deb 파일을 빌드하려면 다음을 실행하십시오.

bash-4.2$ fakeroot debian/rules binary

그러면 .deb 파일이 상위 디렉토리에 저장됩니다. 내용을 나열하려면 :

bash-4.2$ dpkg -c ../bash_4.2-0ubuntu3patchCVE1_i386.deb

.deb를 설치하려면

bash-4.2$ sudo dpkg -i ../bash_4.2-0ubuntu3patchCVE1_i386.deb

그러나 어떤 이유로이 .deb에는 패치되지 않은 바이너리 (?!)가 포함되어 있으므로 추가로 수행해야했습니다.

bash-4.2$ sudo cp bash-4.2/build-bash/bash /bin/

... 그리고 그 후, 시험은 나를 위해 올바르게 통과하기 시작했습니다.

$ env VAR='() { :;}; echo Bash is!' bash -c "echo Bash Test"
bash: warning: VAR: ignoring function definition attempt
bash: error importing function definition for `VAR'
Bash Test

질문 : 원래 질문은 1 개의 가능한 공격 경로를 "지정되지 않은 DHCP 클라이언트가 실행 한 스크립트"로 나타냅니다. 이것은 무엇을 의미 하는가? 이것이 우분투의 / sbin / dhclient <-가 취약하다는 것을 의미합니까?
Bran

아마도 지정되지 않은 클라이언트는 우분투에 감염된 / sbin / dhclient가 있고 bash 스크립트가 shellshock을 실행시키는 명령을 실행한다는 것을 의미합니다. 이것이 DHCP 클라이언트가 쉘 쇼크에 취약한 것입니까? (이치가
Bran
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.