최근 Bash의 취약점 인 "CVE-2014-6271"( USN-2362-1 참조)에 관한 뉴스 가 나왔습니다 . 이 영향을 받는지 어떻게 알 수 있으며 어떻게 고칠 수 있으며 왜 신경 써야합니까?
이 취약점의 범위와 심각성으로 인해이 취약점에 대한 정식 답변으로 설계되었습니다.
최근 Bash의 취약점 인 "CVE-2014-6271"( USN-2362-1 참조)에 관한 뉴스 가 나왔습니다 . 이 영향을 받는지 어떻게 알 수 있으며 어떻게 고칠 수 있으며 왜 신경 써야합니까?
이 취약점의 범위와 심각성으로 인해이 취약점에 대한 정식 답변으로 설계되었습니다.
답변:
Bash는 우분투의 기본 대화식 쉘입니다. 터미널 에뮬레이터를 통해, tty 또는 ssh를 통해 터미널과 인터페이스 할 때 일반적으로 bash
읽고 실행할 명령을 입력합니다 . 터미널을 전혀 사용하지 않더라도 여전히 Bash가 있습니다.
우분투에서는 /bin/sh
bash가 아닙니다 (대시입니다). bash만이이 취약점의 영향을받습니다.
Bash와 OS 는 현재 로그온 한 사용자, 하드 디스크에서 프로그램을 찾을 위치 및 기타 해당 기능을 설명하는 환경 변수 세트를 추적 합니다. 특정 구조로 환경 변수를 만들어 공격자는 다음에 Bash를 시작할 때 코드를 실행할 수 있습니다.
공격자는 해당 환경 변수를 여러 가지 방법으로 설정할 수 있습니다.
ForceCommand
옵션 의 사용은 공격 벡터입니다. 쉘이 bash가 아닌 계정은 영향을받지 않습니다.일단이 변수를 설정하면 다음 bash
에 어떤 이유로 든 공격자의 코드가 실행됩니다. sudo -s
bash는 수퍼 유저 ( 컴퓨터 데이터 및 프로그램을 완전히 제어 할 수 있는 관리 사용자 규칙)로 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가 생성 될 때만 버그가 발생하는 것처럼 보이지만 가능한 경우 즉시 재부팅하는 것이 좋습니다.
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에서 호출 할 수 있습니다!
참고 : 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
당신이 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"
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에서 소스를 다시 압축 해제하므로 패치가 무시 될 수 있습니다! 그래도 소스 중 하나를 풀고 빌드하도록 소스 중 하나를 한 번 실행하십시오 ( debuild
texlive로 인해 결국에는 실패 할 수 있지만 소스를 언팩하고 빌드해야합니다).
그런 다음 패치를 적용하십시오. -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