ช่องโหว่ bash CVE-2014-6271 คืออะไร (Shellshock) และฉันจะแก้ไขได้อย่างไร


141

เมื่อเร็ว ๆ นี้มีข่าวว่า "CVE-2014-6271" (ดูUSN-2362-1 ) ซึ่งเป็นช่องโหว่ใน Bash ฉันจะรู้ได้อย่างไรว่าฉันได้รับผลกระทบจากสิ่งนี้ฉันจะแก้ไขได้อย่างไรและทำไมฉันถึงต้องแคร์?

สิ่งนี้ได้รับการออกแบบเป็นคำตอบที่ยอมรับได้สำหรับช่องโหว่นี้เนื่องจากขอบเขตและความรุนแรง


18
"ฉันจะแก้ไขได้อย่างไร" -> เพียงแค่เรียกใช้ตัวจัดการอัปเกรดของคุณ! จริง ๆ แล้ว Ubuntu เผยแพร่การปรับปรุงด้านความปลอดภัยมีทีมรักษาความปลอดภัยโดยเฉพาะ โปรดอย่าโพสต์คำตอบเกี่ยวกับการสร้าง Bash จากแหล่งที่มา! ; มันไม่มีความซับซ้อนและยากกว่าที่จะรักษาระบบของคุณในอนาคต
gertvdijk

5
นอกจากนี้ยังเป็น CVE เพิ่มเติมสำหรับการแก้ไขที่ไม่สมบูรณ์ CVE-2014-7169
gertvdijk

18
โปรดทำคำตอบโพสต์เกี่ยวกับการสร้างจากแหล่ง ไม่ว่าจะควรหรือไม่ก็ตามบางคนมีเซิร์ฟเวอร์ Ubuntu โบราณและการสร้างจากแหล่งอาจเป็นตัวเลือกเดียวของพวกเขา
GaryO

3
โอ๊ะขอโทษฉันเพิ่งรู้ว่าฉันใส่ทุบตีแทนรีบในการทดสอบ ไม่เป็นไรหรอก
Matt H

4
อ่าน: OSS วินาที: Re: CVE-2014-6271: โค้ดจากระยะไกลผ่านทุบตี ข้อผิดพลาดของ Bash ยังไม่ได้รับการแก้ไข
blade19899

คำตอบ:


126

Bash คืออะไร

Bash เป็นเชลล์แบบโต้ตอบเริ่มต้นใน Ubuntu เมื่อคุณเชื่อมต่อกับเทอร์มินัล (ผ่านเทอร์มินัลอีมูเลเตอร์, ผ่าน tty หรือ ssh) คุณมักจะพิมพ์คำสั่งที่bashจะอ่านและดำเนินการ แม้ว่าคุณจะไม่ได้ใช้เครื่อง แต่คุณก็ยังมี Bash อยู่

บน Ubuntu /bin/shจะไม่ทุบตี (เป็นเส้นประ) bash เท่านั้นที่ได้รับผลกระทบจากช่องโหว่นี้

การหาประโยชน์มีผลกับฉันอย่างไร

Bash และระบบปฏิบัติการติดตามชุดของตัวแปรสภาพแวดล้อมที่อธิบายผู้ใช้ที่เข้าสู่ระบบในปัจจุบันที่จะมองหาโปรแกรมบนฮาร์ดดิสก์และฟังก์ชั่นอื่น ๆ โดยการกำหนดตัวแปรสภาพแวดล้อมด้วยโครงสร้างที่เฉพาะเจาะจงผู้โจมตีอาจสามารถเรียกใช้โค้ดในครั้งถัดไปที่ Bash เริ่มทำงาน

ผู้โจมตีสามารถตั้งค่าตัวแปรสภาพแวดล้อมนั้นได้หลายวิธี:

  • เชื่อมต่อกับบริการจากระยะไกลเช่น SSH ด้วยการตั้งค่าเฉพาะเช่น git over ssh ดังที่ Mitre เตือนการใช้ForceCommandตัวเลือกsshd คือเวกเตอร์การโจมตี บัญชีที่เชลล์ไม่ได้ถูกทุบจะไม่ได้รับผลกระทบ
  • หลอกให้คุณเข้าไปตั้งค่าตัวแปรสภาพแวดล้อม
  • ทำให้โปรแกรมอื่นตั้งค่าตัวแปรสภาพแวดล้อมให้มีค่าที่สร้างขึ้นมา ตัวอย่างเช่นคุณอาจมีเว็บเซิร์ฟเวอร์และสคริปต์ที่ต้องการตั้งค่าตัวแปรสภาพแวดล้อมด้วยเนื้อหาของผู้ใช้ที่เฉพาะเจาะจง แม้ว่าสคริปต์นั้นจะสร้างขึ้นมาเองและไม่ได้สัมผัสตัวแปรสภาพแวดล้อมอื่น ๆ แต่ก็เพียงพอแล้ว ตัวแปรสภาพแวดล้อมเดียวที่มีชื่อใด ๆ และค่าที่สร้างขึ้นก็เพียงพอสำหรับการใช้ประโยชน์จากการประสบความสำเร็จ
  • วิธีอื่น ๆ ที่ฉันไม่ได้กล่าวถึงที่นี่

เมื่อพวกเขาตั้งค่าตัวแปรนี้ในครั้งถัดไปจะbashเปิดด้วยเหตุผลใดก็ตามรหัสของผู้โจมตีของคุณจะถูกเรียกใช้ สิ่งนี้น่ากลัวเป็นอย่างยิ่งsudo -sเมื่อวางไข่ทุบตีในฐานะผู้ใช้ขั้นสูง (กฎผู้ใช้ที่เป็นผู้ดูแลระบบซึ่งควบคุมข้อมูลและโปรแกรมคอมพิวเตอร์ของคุณได้อย่างสมบูรณ์ ) แม้ว่าคุณจะเริ่มทุบตีในฐานะผู้ใช้มาตรฐานเท่านั้นไฟล์ของผู้ใช้นั้นสามารถลบได้

เป็นสิ่งสำคัญที่จะต้องทราบว่าแม้ว่าคุณจะไม่ใช้ bash ด้วยตัวเอง แต่หลาย ๆ โปรแกรมจะวางไข่ bash ด้วยตนเองเป็นส่วนหนึ่งของการทำงาน แม้แต่ในกรณีนี้คุณก็ยังอ่อนแออยู่ อย่างไรก็ตามอูบุนตู/bin/shนั้นไม่ใช่ทุบตีดังนั้นเฉพาะโปรแกรมที่เรียกใช้ bash อย่างชัดเจนเท่านั้นและไม่ใช่เชลล์สคริปต์เริ่มต้นที่ได้รับผลกระทบ

อ้างอิงจาก:

เวกเตอร์ที่เกี่ยวข้องกับคุณลักษณะ ForceCommand ใน OpenSSH sshd, โมดูล mod_cgi และ mod_cgid ใน Apache HTTP Server, สคริปต์ที่ดำเนินการโดยไคลเอนต์ DHCP ที่ไม่ได้รับการระบุและสถานการณ์อื่น ๆ

ฉันกำลังเสี่ยงไหม

ใช้ dpkg เพื่อตรวจสอบเวอร์ชั่นแพ็คเกจที่ติดตั้งของคุณ:

dpkg -s bash | grep Version

นี่จะค้นหาข้อมูลเกี่ยวกับbashแพ็คเกจของคุณและกรองผลลัพธ์เพื่อแสดงเฉพาะเวอร์ชันของคุณ รุ่นที่คงที่4.3-7ubuntu1.4, และ4.2-2ubuntu2.54.1-2ubuntu3.4

ตัวอย่างเช่นฉันเห็น:

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

และสามารถระบุได้ว่าฉันไม่เสี่ยง

ฉันจะอัพเดทได้อย่างไร

ผู้จัดการการอัพเดทมาตรฐานจะเสนอการอัพเดทนี้ให้คุณ นี่เป็นตัวอย่างสำคัญของความสำคัญของการอัปเดตความปลอดภัยไม่ว่าคุณจะใช้ระบบปฏิบัติการใดหรือใช้งานได้ดีเพียงใดก็ตาม

USN แถลงการณ์ระบุว่ารุ่นใหม่ได้รับการปล่อยให้อูบุนตู 14.04 Trusty Tahr, 12.04 Pangolin แม่นยำและ 10.04 Lucid Lynx หากคุณไม่ได้อยู่ในหนึ่งในรุ่น LTS เหล่านี้ แต่อยู่ในรุ่นล่าสุดอย่างสมเหตุสมผลคุณจะพบแพ็คเกจที่ได้รับการแก้ไข

ก่อนอื่นตรวจสอบว่าคุณ

หากคุณมีช่องโหว่คุณควรคว้ารายการแพ็คเกจล่าสุด:

sudo apt-get update && sudo apt-get install 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 คุณสามารถดาวน์โหลด bash เวอร์ชั่น 12.04 ได้จากpackages.ubuntu.com/precise/bashและติดตั้งด้วยตนเอง
เดวิด

2
แก้ไขสำหรับ CVE-2014-7169 มีอยู่ในตัวจัดการอัปเดต (สำหรับฉัน)
Calmarius

27

ขโมยนี้ออกจากCFT มากกว่าที่ข่าว หากคุณมีปัญหากับ repos ของคุณเช่นฉัน (Odroid-XU) นี่จะทำงานได้ดีถ้าคุณต้องการ patch / build จากแหล่งที่มา

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

ถ้าอย่างนั้นคุณก็ทำได้ดี!


คำเตือน:ทำให้การติดตั้งจะติดตั้งทุบตี/usr/local/binดังนั้นจึง/bin/bashไม่ได้รับการแก้ไขและสามารถเรียกใช้จากขด !!


1
ต่อไปนี้เป็นวิธีสร้าง bash 3.2 พร้อมกับแพทช์บนเดเบียนเลนนี่
Matt White

13
-1 ไม่จำเป็นต้องสร้างจากแหล่งที่มา Ubuntu มีแพตช์รักษาความปลอดภัยในที่เก็บ หากคุณมี "ปัญหากับ repo ของคุณ" ให้แก้ไขแทน คุณจะมีความเสี่ยงในหลาย ๆ ทางหากคุณไม่ได้รับการอัพเกรดความปลอดภัย!
gertvdijk

1
@ แมทไวท์ขอขอบคุณ! คุณเพิ่งช่วยฉันสองสามชั่วโมง :)
Florian Fida

5
@FlorianFida นี่คือ AskUbuntu! ทุกคนในไซต์นี้คาดว่าจะโพสต์คำตอบในขอบเขตการใช้ Ubuntu
gertvdijk

6
@ MichaelHärtl 12.10 คือจุดจบของชีวิต ไม่ได้รับการอัปเดตความปลอดภัยอีกต่อไปตั้งแต่เวลานานแล้ว อัพเกรด !!!
gertvdijk

9

หมายเหตุ: แพทช์รักษาความปลอดภัยสำหรับ CVE-2014-7169 ได้รับการเผยแพร่เป็นโปรแกรมปรับปรุงความปลอดภัยมาตรฐาน ไม่จำเป็นต้องเพิ่ม ppa เพิ่มเติมเพื่อรับ patch นี้ จำเป็นเท่านั้นต่อไปนี้

sudo apt-get update

sudo apt-get upgrade

เพื่อให้แน่ใจว่าคุณได้ทำการทุบตีอย่างถูกต้องแล้วให้รันคำสั่งต่อไปนี้

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

หากไม่ได้ดาวน์โหลด patche ที่ต้องการให้ติดตั้งแพ็คเกจ 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

ฉันใช้ Natty 11.04 ซึ่งเป็น EOL (และฉันได้อัปเดต /etc/apt/sources.list เพื่อใช้ old-releases.ubuntu.com) ดังนั้นฉันต้องสร้างจากแหล่งที่มา ฉันต้องการสร้าง. deb ดังนั้นอย่างน้อยแพคเกจการจัดการคือ "ระวัง" เวอร์ชันทุบตีไม่ใช่ค่าเริ่มต้น ฉันไม่ประสบความสำเร็จ 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/

ตอนนี้ในไดเรกทอรี (ย่อย) 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 อีกครั้งดังนั้นจึงมีการแทนที่ patch ที่คุณอาจมี! ยังคงเรียกใช้อย่างใดอย่างหนึ่งเหล่านี้ครั้งเดียวเพื่อให้แหล่งที่มาถูก unpacked และสร้าง (หมายเหตุ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

คำถาม: คำถามเดิมระบุ 1 เวคเตอร์การโจมตีที่เป็นไปได้ว่าเป็น "สคริปต์ที่ดำเนินการโดยไคลเอนต์ DHCP ที่ไม่ระบุ" สิ่งนี้หมายความว่า? นี่หมายความว่า Ubuntu / sbin / dhclient <- มีช่องโหว่หรือไม่
รำข้าว

ฉันคิดว่าบางทีลูกค้าที่ไม่ได้ระบุหมายถึงว่า Ubuntu นั้นติดเชื้อ / sbin / dhclient จากนั้นเรียกใช้คำสั่งที่นำไปสู่สคริปต์ทุบตีเปิดตัว shellshock นั่นคือสิ่งที่ลูกค้า DHCP มีความเสี่ยงต่อการ shellshock? (หวังว่าเหมาะสมดูข้อความข้างต้นของฉันจาก 10 ตุลาคม)
รำ
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.