Report this

What is the reason for this report?

How to Protect Your Server Against the Shellshock Bash Vulnerability

Published on September 26, 2014
How to Protect Your Server Against the Shellshock Bash Vulnerability

Introduction

On September 24, 2014, a GNU Bash vulnerability, referred to as Shellshock or the “Bash Bug”, was disclosed. In short, the vulnerability allows remote attackers to execute arbitrary code given certain conditions, by passing strings of code following environment variable assignments. Because of Bash’s ubiquitous status amongst Linux, BSD, and Mac OS X distributions, many computers are vulnerable to Shellshock; all unpatched Bash versions between 1.14 through 4.3 (i.e. all releases until now) are at risk.

The Shellshock vulnerability can be exploited on systems that are running Services or applications that allow unauthorized remote users to assign Bash environment variables. Examples of exploitable systems include the following:

  • Apache HTTP Servers that use CGI scripts (via mod_cgi and mod_cgid) that are written in Bash or launch to Bash subshells
  • Certain DHCP clients
  • OpenSSH servers that use the ForceCommand capability
  • Various network-exposed services that use Bash

A detailed description of the bug can be found at CVE-2014-6271, CVE-2014-7169, CVE-2014-7186, and CVE-2014-7187.

Because the Shellshock vulnerability is very widespread–even more so than the OpenSSL Heartbleed bug–and particularly easy to exploit, it is highly recommended that affected systems are properly updated to fix or mitigate the vulnerability as soon as possible. We will show you how to test if your machines are vulnerable and, if they are, how to update Bash to remove the vulnerability.

Check System Vulnerability

On each of your systems that run Bash, you may check for Shellshock vulnerability by running the following command at the bash prompt:

env 'VAR=() { :;}; echo Bash is vulnerable!' 'FUNCTION()=() { :;}; echo Bash is vulnerable!' bash -c "echo Bash Test"

The highlighted echo Bash is vulnerable! portion of the command represents where a remote attacker could inject malicious code; arbitrary code following a function definition within an environment variable assignment. Therefore, if you see the following output, your version of Bash is vulnerable and should be updated:

Bash is vulnerable!
Bash Test

If your output does not include the simulated attacker’s payload, i.e. “Bash is vulnerable” is not printed as output, you are protected against at least the first vulnerability (CVE-2014-6271), but you may be vulnerable to the other CVEs that were discovered later. If there are any bash warnings or errors in the output, you should update Bash to its latest version; this process is described in the next section.

If the only thing that is output from the test command is the following, your Bash is safe from Shellshock:

Bash Test

Test Remote Sites

If you simply want to test if websites or specific CGI scripts are vulnerable, use this link: ‘ShellShock’ Bash Vulnerability CVE-2014-6271 Test Tool.

Simply enter the URL of the website or CGI script you want to test in the appropriate form and submit.

Fix Vulnerability: Update Bash

The easiest way to fix the vulnerability is to use your default package manager to update the version of Bash. The following subsections cover updating Bash on various Linux distributions, including Ubuntu, Debian, CentOS, Red Hat, and Fedora.

APT-GET: Ubuntu / Debian

For currently supported versions of Ubuntu or Debian, update Bash to the latest version available via apt-get:

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

Now check your system vulnerability again by running the command in the previous section (Check System Vulnerability).

End of Life Ubuntu / Debian Releases

If you are running a release of Ubuntu / Debian that is considered end of life status, you will have to upgrade to a supported to use the package manager to update Bash. The following command can be used to upgrade to a new release (it is recommended that you back up your server and important data first, in case you run into any issues):

sudo do-release-upgrade

After the upgrade is complete, ensure that you update Bash.

YUM: CentOS / Red Hat / Fedora

Update Bash to the latest version available via yum:

sudo yum update bash

Now check your system vulnerability again by running the command in the previous section (Check System Vulnerability).

End of Life CentOS / Red Hat / Fedora Releases

If you are running a release of CentOS / Red Hat / Fedora that is considered end of life status, you will have to upgrade to a supported to use the package manager to update Bash. The following command can be used to upgrade to a new release (it is recommended that you back up your server and important data first, in case you run into any issues):

sudo yum update

After the upgrade is complete, ensure that you update Bash.

Conclusion

Be sure to update all of your affected servers to the latest version of Bash! Also, be sure to keep your servers up to date with the latest security updates!

Thanks for learning with the DigitalOcean Community. Check out our offerings for compute, storage, networking, and managed databases.

Learn more about our products

About the author

Mitchell Anicas
Mitchell Anicas
Author
See author profile

Software Engineer @ DigitalOcean. Former Señor Technical Writer (I no longer update articles or respond to comments). Expertise in areas including Ubuntu, PostgreSQL, MySQL, and more.

Category:

Still looking for an answer?

Was this helpful?
Leave a comment...

This textbox defaults to using Markdown to format your answer.

You can type !ref in this text area to quickly search our full set of tutorials, documentation & marketplace offerings and insert the link!

Ubuntu now has the latest version of Bash sent out to their repositories. More info here:

http://people.canonical.com/~ubuntu-security/cve/2014/CVE-2014-7169.html

Thanks for this. Fixed it on my home computer and remote server. Awesome!

After update, is there any need to restart anything ??

I am with CentOS 6.5 x32

Hey Guys,

I just checked & updated the path on one of our production server.

After doing a “yum update bash”, rechecked:

env VAR=‘() { :;}; echo Bash is vulnerable!’ bash -c “echo Bash Test”

It simply gave below output:

Bash Test

Is this still vulnerable or patches updated? Please suggest.

Cheers, Vasu

Here’s Puppet code to patch it on CentOS:

exec { 'patch_shellshock_security_hole':
  command => "/usr/bin/yes | /usr/bin/yum update bash; touch /root/shellshock_bug_has_been_patched",
  creates => '/root/shellshock_bug_has_been_patched',
}

I have just tested this code and it worked fine on CentOS 6.4.

Ross

Same for Ubuntu 13.10?

i have 4.5.1(1) on 2 Ubuntu Servers. Does that mean not vulnerable? Test says otherwise. You state 4.3 is the latest.

I think, even if it’s not vulnerable, it’s a good idea to update bash to lastest version

I have Ubuntu 12.10 that is not more supported… what the best way to upgrade?

I hadn’t touched my droplet in quite a while - turns out I’m on 12.04 which has been EOL’ed and can’t seem to be updated. Any suggestions on how to handle this?

The CentOS yum repository has the fix. I just installed it on my CentOS 6.5 droplets.

Not so fast! Give it a try, still vulnerable!

env -i X=' () { }; echo hello' bash -c 'date'

https://shellshocker.net/

Thank you Digital Ocean, I am very happy with your hosting company :)

if you have some old / EOL release, this code may help you.

it requires you to have a compiler, patch & make, as such you may need to install these packages

for Ubuntu you can do

for CentOS/variants

(you may uninstall them afterwards if you no longer need)

after that, you can install bash from scratch, follow these commands (taken from the internet somewhere)

can first “cd /tmp” or start in any directory of your choice; must be executed as root [updated 2014-09-27 0900 EST [GMT-0500] now 26 patches instead of 25] [updated 2014-09-28 0900 EST [GMT-0500] now 27] [updated 2014-10-01 1400 EST [GMT-0500] now 28] [updated 2014-10-02 2300 EST [GMT-0500] now 29]

mkdir src
cd src
wget http://ftp.gnu.org/gnu/bash/bash-4.3.tar.gz
#download all patches
for i in $(seq -f "%03g" 0 30); do wget     http://ftp.gnu.org/gnu/bash/bash-4.3-patches/bash43-$i; done
tar zxvf bash-4.3.tar.gz 
cd bash-4.3
#apply all patches
for i in $(seq -f "%03g" 0 30);do patch -p0 < ../bash43-$i; done
#build and install
./configure && make && make install
cd .. 
cd ..
rm -r src

after this you should have the newest bash installed on your system

run the test again to check yourself

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

you should be good to go now!

To update from an older version of ubuntu (e.g. saucy), run this first:

sudo sed -i 's/saucy/trusty/g' /etc/apt/sources.list

That will update your sources to the newer ones. It might cause some incompatibility eventually, but it let me fix this problem for now.

I did the update and now can no longer SSH into my droplet. Anyone have any thoughts?

For people using ServerPilot to manage servers running PHP and WordPress sites, your servers are already patched. More info here:

https://www.serverpilot.io/blog/2014/09/25/bash-shellshock-security-updates.html

Ubuntu here… 4 droplets. Worked for versions 12.04 and 14.04 but not working in version 13.10

after running the apt-get command

… bash is already the newest version. 0 upgraded, 0 newly installed, 0 to remove and 84 not upgraded.

but vulnerability still there based in the test for version 13.10 as i said.

Thanks for making it easy. Just two commands, one to see that I need a fix and one to fix it. All done! I’m no linux guru, I just want to run a wordpress server!

I have some droplets with:

Distributor ID: Ubuntu Description: Ubuntu 12.10 Release: 12.10 Codename: quantal

And they don’t update. What i need to do so?

i mean, threre wont be a patch for this (others) version?

Replying to 03ff5913b0517be4231fee8f421f26

Iam not linux/admin guru, just a developer (your ad’s works) but, why do you offer ubuntu images (12.10) in droplets that wont be supported for updates like this.

Seriously?

Replying to 03ff5913b0517be4231fee8f421f26

@Mauricio We do not offer Ubuntu 12.10, nor have we since it reached “end of life.” We currently offer Ubuntu 10.04, 12.04, and 14.04 which are all “Long Term Support” releases. When Ubuntu 14.10 is released next month, we will provide images for that as well even though it is not an LTS. Many users wish to have the latest packages available. LTS releases provide security fixes, but not new major versions in order to remain stable. These releases are now (starting with 13.10) supported for 9 months at a time. 12.10 was supported for 18 months. The LTS releases are supported for 5 years. In order to upgrade to a more current release, you can run do-release-upgrade

Replying to 03ff5913b0517be4231fee8f421f26

@petethechop Hi Pete! I’m not sure what you are proposing. The list of available operating systems when creating a new droplet is quite clear (http://i.imgur.com/Gvd46ss.png). We still provide kernels for older Ubuntu releases, as many customers launched droplets with those releases when they were supported. If we were to pull the kernels out from under them, it would make the droplets unusable.

Replying to 03ff5913b0517be4231fee8f421f26

@asb that select list will allow me to change my kernel to Ubuntu 12.10 from my current version, so I consider it an overstatement to say with emphasis that you do not offer that version. ‘sall I’m sayin’

This comment has been deleted

For older versions of Ubuntu you can follow the steps here:

http://cloudgames.com/blog/fix-bash-exploit-old-new-releases-ubuntu-apt-get/

You can update the respository to get the latest bash version and then can always set the repository back to the original after updating bash.

Here is what I did for my Ubuntu droplet…

apt-get update && apt-get -y upgrade apt-get install -y bash

seems to have worked

I do an apt-get update and even an apt-get upgrade on my Debian(6) squeeze and it says all packages are up to date so sudo apt-get update && sudo apt-get install --only-upgrade bash does not do anything. Bash is latest version and still not fixed, any other way i can update it?

Great article, well written and easy to follow. Thanks!

Thanks this really useful, i have fixed my bash!!!

If the test on http://shellshock.brandonpotter.com/ is showing no vulnerabilities, but the bash test command does show vulnerabilities, do you think we are safe to wait until the full fix is released?

Thank you,

Hello -

Is it really fixed? :

Still more vulnerabilities in bash? Shellshock becomes whack-a-mole http://arstechnica.com/security/2014/09/still-more-vulnerabilities-in-bash-shellshock-becomes-whack-a-mole/

From the above article I think it is not fixed.

cfg83

Hello -

On my 14.x Ubuntu droplet I am patched up to bash 4.3.11(1)-release

I went here :

https://twitter.com/taviso/status/514887394294652929

And tried this test :

env X='() { (a)=>\' bash -c "echo echo vuln"; [[ "$(cat echo)" == "vuln" ]] && echo "still vulnerable :("

And got this output :

bash: X: line 1: syntax error near unexpected token `='
bash: X: line 1: `'
bash: error importing function definition for `X'
echo vuln
still vulnerable :(

Question: Is the above test legitimate?

cfg83

Thanks a lot, just fixed it on my holaunblocker.com droplet.

This comment has been deleted

For older versions of Ubuntu you can follow the steps here:

http://cloudgames.com/blog/fix-bash-exploit-old-new-releases-ubuntu-apt-get/

You can update the respository to get the latest bash version and then can always set the repository back to the original after updating bash.

Here is what I did for my Ubuntu droplet…

apt-get update && apt-get -y upgrade apt-get install -y bash

seems to have worked

I do an apt-get update and even an apt-get upgrade on my Debian(6) squeeze and it says all packages are up to date so sudo apt-get update && sudo apt-get install --only-upgrade bash does not do anything. Bash is latest version and still not fixed, any other way i can update it?

Great article, well written and easy to follow. Thanks!

Thanks this really useful, i have fixed my bash!!!

If the test on http://shellshock.brandonpotter.com/ is showing no vulnerabilities, but the bash test command does show vulnerabilities, do you think we are safe to wait until the full fix is released?

Thank you,

Hello -

Is it really fixed? :

Still more vulnerabilities in bash? Shellshock becomes whack-a-mole http://arstechnica.com/security/2014/09/still-more-vulnerabilities-in-bash-shellshock-becomes-whack-a-mole/

From the above article I think it is not fixed.

cfg83

Hello -

On my 14.x Ubuntu droplet I am patched up to bash 4.3.11(1)-release

I went here :

https://twitter.com/taviso/status/514887394294652929

And tried this test :

env X='() { (a)=>\' bash -c "echo echo vuln"; [[ "$(cat echo)" == "vuln" ]] && echo "still vulnerable :("

And got this output :

bash: X: line 1: syntax error near unexpected token `='
bash: X: line 1: `'
bash: error importing function definition for `X'
echo vuln
still vulnerable :(

Question: Is the above test legitimate?

cfg83

Thanks a lot, just fixed it on my holaunblocker.com droplet.

Creative CommonsThis work is licensed under a Creative Commons Attribution-NonCommercial- ShareAlike 4.0 International License.
Join the Tech Talk
Success! Thank you! Please check your email for further details.

Please complete your information!

The developer cloud

Scale up as you grow — whether you're running one virtual machine or ten thousand.

Get started for free

Sign up and get $200 in credit for your first 60 days with DigitalOcean.*

*This promotional offer applies to new accounts only.