Lỗ hổng bash CVE-2014-6271 (Shellshock) là gì và làm cách nào để khắc phục nó?


141

Gần đây, đã có những tin tức xung quanh liên quan đến "CVE-2014-6271" (Xem USN-2362-1 ), đây là một lỗ hổng trong Bash. Làm thế nào để tôi biết nếu tôi bị ảnh hưởng bởi điều này, làm thế nào tôi có thể sửa chữa nó, và tại sao tôi phải quan tâm?

Điều này được thiết kế như một câu trả lời chính tắc cho lỗ hổng này, do phạm vi và mức độ nghiêm trọng của nó.


18
"Làm thế nào để tôi sửa nó?" -> chỉ cần chạy trình quản lý nâng cấp của bạn! Thực sự, Ubuntu phát hành bản cập nhật bảo mật, có một nhóm bảo mật chuyên dụng. Xin đừng đăng câu trả lời về việc xây dựng Bash từ nguồn! ; nó không cần phức tạp và khó hơn để duy trì hệ thống của bạn trong tương lai.
gertvdijk

5
Thêm vào đó, cũng là CVE bổ sung cho sửa chữa không đầy đủ. CVE-2014-7169
gertvdijk

18
Hãy làm bài câu trả lời về việc xây dựng từ nguồn. Cho dù họ có nên hay không, một số người có máy chủ Ubuntu cổ đại và xây dựng từ nguồn có thể là lựa chọn duy nhất của họ.
GaryO

3
Rất tiếc, tôi chỉ nhận ra rằng tôi đã đặt bash thay vì dấu gạch ngang trong bài kiểm tra. Đừng bận tâm nó ổn.
Matt H

4
Đọc: oss-sec: Re: CVE-2014-6271: thực thi mã từ xa thông qua bash . Lỗi Bash vẫn chưa được sửa
blade19899

Câu trả lời:


126

Bash là gì?

Bash là shell tương tác mặc định trong Ubuntu. Khi bạn đang giao tiếp với thiết bị đầu cuối (thông qua trình giả lập thiết bị đầu cuối, qua tty hoặc ssh), bạn thường gõ các lệnh bashsẽ đọc và thực thi. Ngay cả khi bạn hoàn toàn không sử dụng thiết bị đầu cuối, bạn vẫn có Bash.

Trên Ubuntu, /bin/shkhông phải là bash (nó là dấu gạch ngang). Chỉ bash bị ảnh hưởng bởi lỗ hổng này.

Khai thác ảnh hưởng đến tôi như thế nào?

Bash và HĐH theo dõi một tập hợp các biến môi trường mô tả người dùng đã đăng nhập hiện tại, nơi tìm kiếm các chương trình trên đĩa cứng và các chức năng khác như vậy. Bằng cách tạo một biến môi trường với cấu trúc cụ thể, kẻ tấn công có thể thực thi mã vào lần tới khi Bash bắt đầu.

Kẻ tấn công có thể thiết lập biến môi trường đó theo nhiều cách:

  • Kết nối từ xa với một dịch vụ như SSH với một thiết lập cụ thể như git over ssh. Như Mitre cảnh báo, việc sử dụng ForceCommandtùy chọn sshd là một vectơ tấn công. Các tài khoản có vỏ không bị ảnh hưởng sẽ không bị ảnh hưởng.
  • Lừa bạn vào việc thiết lập biến môi trường.
  • Làm cho một chương trình khác đặt biến môi trường để có giá trị được tạo. Ví dụ: bạn có thể có một máy chủ web và tập lệnh cần đặt biến môi trường với nội dung người dùng cụ thể. Ngay cả khi tập lệnh đó tự tạo và không chạm vào các biến môi trường khác, nó vẫn đủ. Một biến môi trường duy nhất với bất kỳ tên nào và giá trị được tạo ra là đủ để khai thác thành công .
  • Những cách khác tôi đã không đề cập ở đây.

Khi họ đặt biến này, lần sau bashsẽ mở vì bất kỳ lý do gì, mã kẻ tấn công của bạn sẽ được chạy. Điều này đặc biệt đáng sợ với sudo -s, vì nó sinh ra bash là siêu người dùng (một quy tắc người dùng quản trị có toàn quyền kiểm soát dữ liệu và chương trình của máy tính của bạn). Ngay cả khi bạn chỉ bắt đầu bash như một người dùng chuẩn, các tệp của người dùng đó có thể bị xóa.

Điều quan trọng cần lưu ý là ngay cả khi bạn không sử dụng bash cho mình, nhiều chương trình sẽ tự sinh ra bash như một phần của hoạt động. Ngay cả trong trường hợp này, bạn dễ bị tổn thương. Tuy nhiên, Ubuntu /bin/shkhông phải là bash, vì vậy chỉ có các chương trình gọi bash rõ ràng và không phải vỏ script mặc định bị ảnh hưởng.

Theo Mitre:

các vectơ liên quan đến tính năng ForceCommand trong OpenSSH sshd, các mô-đun mod_cgi và mod_cgid trong Máy chủ HTTP Apache, các tập lệnh được thực thi bởi các máy khách DHCP không xác định và các tình huống khác trong đó thiết lập môi trường xảy ra trên ranh giới đặc quyền từ thực thi Bash.

Tôi có dễ bị tổn thương không?

Sử dụng dpkg để kiểm tra phiên bản gói đã cài đặt của bạn:

dpkg -s bash | grep Version

Điều này sẽ tìm kiếm thông tin trên bashgói của bạn và lọc đầu ra để chỉ cho bạn phiên bản. Các phiên bản cố định 4.3-7ubuntu1.4, 4.2-2ubuntu2.54.1-2ubuntu3.4.

Ví dụ, tôi thấy:

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

và có thể xác định rằng tôi không dễ bị tổn thương.

Làm cách nào để cập nhật?

Trình quản lý cập nhật tiêu chuẩn sẽ cung cấp cho bạn bản cập nhật này. Đây là một ví dụ điển hình về việc cập nhật bảo mật là quan trọng như thế nào, bất kể bạn sử dụng hệ điều hành nào hay bảo trì tốt như thế nào.

Các USN Bulletin khẳng định rằng phiên bản mới đã được phát hành cho Ubuntu 14.04 Trusty dê núi sừng ngắn, 12.04 tê tê chính xác, và 10.04 Lucid Lynx. Nếu bạn không ở một trong những phiên bản LTS này, nhưng là phiên bản hợp lý gần đây, rất có thể bạn sẽ có thể tìm thấy một gói vá.

Trước tiên, hãy kiểm tra nếu bạn

Nếu bạn dễ bị tổn thương, trước tiên bạn nên lấy danh sách gói mới nhất:

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

Lệnh đầu tiên đảm bảo rằng bạn có danh sách gói mới nhất bao gồm phiên bản cố định và lệnh thứ hai sẽ cài đặt phiên bản bash mới nhất (cố định).

Mặc dù lỗi chỉ xuất hiện khi bash xuất hiện, nhưng vẫn nên khởi động lại ngay lập tức nếu khả thi.


20
Xin lỗi, bạn dễ bị tổn thương . Bản vá gốc không khắc phục được toàn bộ vấn đề. Xem cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2014-7169 AFAIAA, hiện tại không có sửa chữa công khai. Xem ví dụ: people.canonical.com/~ubfox-security/cve/pkg/bash.html
Mormegil

4
@hexafraction Bạn đọc 12.10 ở đâu để nhận được bản cập nhật cho việc này? Tôi không nghĩ vậy, 12.10, 13.04, 13.10 rất nhiều Kết thúc cuộc đời ! Ngoài ra, kho lưu trữ backport không được sử dụng để cập nhật bảo mật .
gertvdijk

2
@hexafraction Không, họ không! Đó là toàn bộ quan điểm của Sự sống cuối đời: không còn sự hỗ trợ nào nữa.
gertvdijk

1
@ MichaelHärtl Nếu bạn đang sử dụng Ubuntu 12.10, bạn có thể tải xuống phiên bản b.04 12.04 từ các gói.ubuntu.com/precise/bash và cài đặt thủ công.
David

2
Sửa lỗi cho CVE-2014-7169 có sẵn trong trình quản lý cập nhật (đối với tôi).
Calmarius

27

Lấy trộm cái này của cft tại Hacker News . Nếu bạn gặp rắc rối với các repos của bạn như tôi (Odroid-XU), thì nó sẽ hoạt động tốt nếu bạn muốn vá / xây dựng từ nguồn.

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

Sau đó chạy:

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

Và nếu bạn nhận được:

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

Vậy thì tất cả đều tốt!


CẢNH BÁO: thực hiện cài đặt sẽ cài đặt bash in /usr/local/bin, do đó /bin/bashkhông được sửa đổi và có thể được gọi từ curl !!


1
Đây là cách xây dựng bash 3.2 với bản vá trên debian lenny: gist.github.com/mattwhite/86de50d30134129e44ef
Matt White

13
-1. Không cần xây dựng từ nguồn. Ubuntu có một bản vá bảo mật trong kho lưu trữ. Nếu bạn gặp "rắc rối với repo của mình", hãy sửa nó đi. Bạn có thể dễ bị tổn thương theo nhiều cách khác nếu bạn không nhận được các bản nâng cấp bảo mật!
gertvdijk

1
@Matt Trắng Cảm ơn bạn! Bạn vừa tiết kiệm cho tôi một vài giờ :)
Florian Fida

5
@FlorianFida Đây là AskUbfox! Mọi người trên trang này dự kiến ​​sẽ đăng câu trả lời trong phạm vi sử dụng Ubuntu.
gertvdijk

6
@ MichaelHärtl 12.10 là Tận thế. Nó không nhận được bất kỳ cập nhật bảo mật nào nữa từ lâu rồi. Nâng cấp !!!
gertvdijk

9

Lưu ý: Bản vá bảo mật cho CVE-2014-7169 đã được phát hành dưới dạng bản cập nhật bảo mật tiêu chuẩn. Không cần thêm ppa's để nhận bản vá này. Chỉ sau đây là cần thiết.

sudo apt-get update

sudo apt-get upgrade

Để đảm bảo bạn đã vá bash chính xác, hãy chạy lệnh sau

dpkg -s bash | grep Version

Nếu bạn đang ở trên 14.04 LTS, bạn sẽ thấy đầu ra của:

Version: 4.3-7ubuntu1.4

Nếu bạn đang ở trên 12.04 LTS, đầu ra của bạn sẽ là:

 Version: 4.2-2ubuntu2.5

1
Điều này là chính xác, nhưng một bản vá chính thức hiện đã được cung cấp, vì vậy bản cập nhật bảo mật đã được phát hành. Do đó, các bước này không còn cần thiết.
Robie Basak

Chính xác. Tôi sẽ chỉnh sửa bài viết trên. Cảm ơn bạn.
nhánh.lizard

1

Nếu bạn ở vào ngày 11.04: hãy sử dụng các bước dưới đây (nó hoạt động với tôi)

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

Nếu nó không được tải về patche thì hãy cài đặt gói 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

Để xem bản vá đã được áp dụng:

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

0

Tôi đang sử dụng Natty 11.04, đó là EOL (và tôi đã cập nhật /etc/apt/source.list để sử dụng old-release.ub Ubuntu.com), vì vậy tôi phải xây dựng từ nguồn. Tôi muốn xây dựng một .deb, vì vậy ít nhất việc quản lý gói là "nhận biết" phiên bản bash không phải là phiên bản mặc định. Tôi không thành công 100% - tuy nhiên, gói được đăng ký là "mới hơn" và bashnhị phân kết thúc cố định, vì vậy đây là những gì tôi đã làm:

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/

Bây giờ, trong thư mục (phụ) bash-4.2/, có: một tệp bash-4.2.tar.xz, cần được giải nén để đến bashnguồn; và một thư mục con được gọi debian.

Tôi đã thực hiện các thay đổi sau để tránh phụ thuộc vào texlive: in 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

... và trong 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
        ...

Để thay đổi phiên bản, trong bash-4.2/thư mục này , hãy làm:

bash-4.2$ dch --local patchCVE

... và điền vào các ghi chú trong danh sách thay đổi khi được hỏi. Điều này sẽ đảm bảo rằng .deb (và siêu dữ liệu liên quan) được gọi (trong trường hợp của tôi) bash_4.2-0ubuntu3patchCVE1_i386.deb.

Sau đó, bạn có thể thử xây dựng với dpkg-buildpackage -us -uchoặc debuildchỉ huy. Lưu ý - một trong hai thứ này sẽ giải nén lại nguồn từ zip - do đó ghi đè lên bất kỳ bản vá nào bạn có thể có! Tuy nhiên, hãy chạy một trong số này một lần để nguồn được giải nén và xây dựng ( debuildcuối cùng lưu ý vẫn có thể bị lỗi do texlive, nhưng nó sẽ giải nén và xây dựng nguồn).

Sau đó, áp dụng các bản vá; lưu ý bạn nên sử dụng -p1ở đây, vì hiện tại bạn đang ở trong bash-4.2/thư mục:

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

Sau đó xây dựng lại phiên bản vá bằng cách chạy:

bash-4.2$ fakeroot debian/rules build 

Điều này sẽ xây dựng lại thực thi; để kiểm tra nó:

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

Để xây dựng các tệp .deb, hãy chạy:

bash-4.2$ fakeroot debian/rules binary

Điều này sẽ lưu các tệp .deb trong thư mục cha; để liệt kê nội dung của họ:

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

Để cài đặt .deb:

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

Tuy nhiên, vì một số lý do, .deb này chứa một nhị phân chưa được vá (?!), Vì vậy tôi phải thêm vào:

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

... và sau đó, bài kiểm tra bắt đầu chính xác cho tôi:

$ 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

Câu hỏi: Câu hỏi ban đầu nêu 1 vectơ tấn công có thể là "tập lệnh được thực thi bởi các máy khách DHCP không xác định". Điều đó có nghĩa là gì? Điều này có nghĩa là Ubuntu / sbin / dhclient <- dễ bị tấn công?
Cám

Tôi nghĩ có lẽ các máy khách không xác định có nghĩa là Ubuntu có bị nhiễm / sbin / dhclient, sau đó chạy các lệnh dẫn đến tập lệnh bash khởi chạy shellshock. Đó có phải là những gì Khách hàng DHCP dễ bị shellshock? (Hy vọng điều đó có ý nghĩa, xem tin nhắn trên của tôi từ ngày 10 tháng 10)
Bran
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.