There are lots of scary headlines on the Internet today about a bug in the GNU Project’s Bourne Again Shell (aka Bash).
Apparently, Bash allows subshells to inherit exported function definitions, which it implements by passing environment variables with those functions’ names through to subshells, with the value of the variable containing the function definition. For instance
outer$ function hello {
> echo "Hello World"
> }
outer$ export -f hello
outer$ PS1="inner$ " /bin/bash
inner$ hello
Hello World
inner$ exit
outer$ export -nf hello
In this case, the outer shell has exported the function hello
to the inner
shell, by setting an environment variable hello
to the string () { echo
"Hello World"; }
. We can test this:
outer$ export hello='() { echo "Hello World"; }'
outer$ PS1="inner$ " /bin/bash
inner$ hello
Hello World
inner$ exit
outer$ export -n hello
On its own, this feature is only harmful if a user can specify the name and content of an environment variable, and only then if some program is foolishly trying to run commands without specifying their full path. For example:
outer$ ls='() { echo "No way, Jose"; }' PS1="inner$ " /bin/bash
inner$ ls
No way, Jose
inner$ /bin/ls
foo.txt bar.txt
inner$ exit
However, current versions of Bash contain a bug that causes Bash to execute trailing statements on environment variables of this form, so for example
outer$ naughty='() { :;}; echo "Oh dear, oh dear"' PS1="inner$ " /bin/bash
Oh dear, oh dear
inner$ exit
In the above example, the inner shell runs the echo
command. It shouldn’t.
Now, this is potentially a major security hole, but only in certain circumstances, namely:
-
If a user can set the value of an environment variable, and
-
Where a program passes control to a Bash shell and passes that value through.
The two most common cases that you might find that allow remote exploitation
of this bug are CGI scripts (the old fashioned kind, not FastCGI, and not
anything run via Apache’s mod_php, mod_perl or mod_python) and OpenSSH if you
were relying on the ForceCommand
feature to provide restricted SSH
access. sudo
, fortunately, already strips out Bash exported functions (and
has done since 2004), so is not affected.
Put another way, unless you have very old code running on your web servers, and unless you are doing something like running a public SSH server that allows restricted log-ins (e.g. to run Git or Subversion via SSH, but nothing else), the chances are that you aren’t vulnerable to remote exploits based on this. You should check, but you should not panic.