この記事では、近年露呈したStruts2の危険度の高い脆弱性を整理し、なぜStruts2が繰り返しセキュリティ上の大きな脆弱性として浮上してきたのかを分析します。
Struts2のコード実行の問題 4年前
Struts2の脆弱性は、ここでは主にJ2EEオープンソースフレームワークstruts2のコマンド実行の脆弱性を指し、害は巨大であり、任意のシステムコマンドのリモート実行につながる可能性があり、その後、システム制御、データベース制御へのアクセス、情報漏洩につながります。struts2フレームワークを使用して開発されたすべてのシステムが影響を受けます。
Struts2のコード実行問題は、2010年にさかのぼり、GoogleのセキュリティチームのMeder Kydyralievが、unicdeエンコーディングを使用することで、パラメータインターセプターの特殊文字 "#"のフィルタリングをバイパスすることが可能であり、その結果、コード実行問題が発生することを発見しました。脆弱性番号はS2-003で、公式のstruts2の脆弱性情報には、図のような文章があります:
公式は、悪用コードを与えたが、この脆弱性の力を無視し、公式はメダーKydyralievによって与えられたコードを見たため、それは単純なバイパスだと思った、この脆弱性の使用は、リモートで任意のコマンドを実行するために使用することができることに気づかなかったので、恣意的にフィルタリングルールを変更し、急いでケースを閉じます。当時、apacheの公式パッチはこの方法で、彼らはすべての要求がフィルタリングされた"◆u0023 "を含む正規の意志を使用しています。この修正は、配信処理で"˶‾᷄‾᷅"が"˶‾᷅"としてエスケープされてしまい、正規表現がマッチしなかったため、うまくいきませんでしたが、この問題に気づかなかったことが悲劇でした。
ognlはjavaのスタティックメソッドを呼び出すことができ、struts2自体がコマンド実行の脆弱性を持っているため、いくつかのパラメータを変更して、javaのスタティックメソッドの実行を制限しています。調査の結果、OGNLコンテキストの名前空間プロパティを変更し、#_memberAccess.allowStaticMethodAccessをtrue、#context["xwork.MethodAccessor.denyMethodExecution"]をfalseに設定しても、unicodeによるフィルタリングルールのバイパスという問題は残ります。これで問題ないと思ったのでしょう。
頻発する脆弱性
ユニコードエンコーディングバイパスの問題は常に存在しているので、それはまだS2 - 003バイパス方法ですが、この時だけ彼は、システムコマンドを実行するONGLコールJavaの静的関数の使用を与え、彼のブログで詳細な分析を与えたので、おそらく、Googleのセキュリティチームは、長い間、メダーKydyraliev神ダウン冷たいので、彼は任意のコマンドのリモート実行を構築し、Apacheの公式にコードを提出するために使用することができます怒られるでしょう。今回だけ、彼はシステムコマンドを実行するためにONGL call java static functionの使用を与え、彼のブログで、図に示すように、詳細な分析を与えています:
ブログアドレス:http://...///----.ml
S2-003の修正は失敗し、この脆弱性の番号はS2-005、CVE-2010-1870ですが、公式の修正は非常に大雑把で、彼らはルールを再修正し、Meder Kydyralievのエクスプロイトをブロックしましたが、根本的な問題は解決されませんでした。8進数でエンコードされたOGNL式がまだ実行可能であることに気付かず、例えば、"˶u0023 "を8進数の"˶u43 "に置き換えただけで、また迂闊でした。
今回は、Apacheの公式は、最終的に問題の深刻さを実現し、正規のより厳格な書き換えは、フィルタリングの出現は、@とリクエストの内容の他の文字は、正規表現の公式の変更は、図に示すように
しかし、struts2の問題はまだ存在する、私はどのくらい2011年について、メダーKydyraliev再び怒っているのかわからない、彼はOGNLの呼び出しJavaの静的メソッドを任意のコマンドを実行する設定メソッドのプライベート変数のアクションインスタンスの助けを借りて、アイデアの新しい悪用を提唱。この問題について、実際には、また、Webコンテナの機能の多くが含まれますが、害はまだ巨大な、この脆弱性番号S2 - 009、CVE - 2011 - 3923、および公式はまだ問題を修正するために、通常のフィルタリングを介して、公式の修正下図に示すようにです。
それ以来、またognlの方法を実行するためにstruts2タグを使用してS2-013されているが、これらの脆弱性は比較的鶏肉、大幅に減少の範囲の影響です。
実際にはstruts2フレームワークの基礎となるOGNL式を達成するために、しかし、OGNL式があまりにも強力で、その結果、直接Javaの静的メソッドを呼び出すことができます。しかし、OGNL式で直接Javaの静的メソッドを呼び出さないようにするために、公式には、OGNLコンテキストで、いくつかの名前のオブジェクトを組み込みます。例えば、#_memberAccess["allowStaticMethodAccess"]はデフォルトでfalseに設定され、#context["xwork.MethodAccessor.denyMethodExecution"]はデフォルトでtrueに設定されます。
例えば、上記のプロパティの値は、OGNLの実行を使用して変更することができ、上記の脆弱性の両方が最初にこれらの2つのプロパティを設定し、その後、Javaの静的メソッドを呼び出すことは容易にわかります。
2013年、S2-013が吹っ飛んだ後、#_memberAccess["allowStaticMethodAccess"]属性が変更許可されないようになりました。これで問題は根本的に解決したように見えました。しかし、彼らはjavaのリフレクション・クラスを使ってプライベート・メンバー変数にアクセスするという卑猥な方法を忘れていました。リフレクションクラスでは、ここでちなみに、これにも、例えば、S2-008コマンドの実行が登場したが、これは実際にはStruts2の開発モードの機能であり、厳密に言えば、抜け穴を考えることはできませんが、彼の処理ロジックでは、ユーザーがOGNLの実装を制御することができますが、デフォルトのstruts2の開発モードが閉じているので、この脆弱性は非常にチキンリブです。しかし、それは2014 pwntestingまでの記事の分析は、S2 - 008の使用、奇妙なトリックの2つの属性の前面を変更するには、Javaの反射クラスの実際の使用を与えることを言及する価値があります。
また、もっとドライな別のメソッドがあり、java.lang.ProcessBuilderクラスで、気軽にインスタンスを生成し、start()メソッドを呼び出すと、コマンド実行の目的が達成されます。だからapacheは仕事の無駄がある半日を変更しました。
よりホットなstruts2のコマンド実行脆弱性ですが、昨年7月にS2-016が発生しました。この脆弱性については、実は、DefaultActionMapperクラスは、ナビゲーションやリダイレクトの接頭辞として、"action:", "redirect:", "redirectAction: "をサポートしているのですが、これらの接頭辞は、struts2がこれらの接頭辞のフィルタリングを行っていないために、OGNL式が同時に続く可能性があり、その結果、コマンドが実行されてしまうというものです。が実行されます。
先日のS2-020以降のパッチが回避され、傷だらけのstruts2が再び起動するようになりましたが、今回の問題はognlの実行ではなく、コンテナのclassLoader属性の操作に切り替わっています。ユーザがaa=bbリクエストを送信すると、対応するsetaaメソッドがOGNL経由で実行されるので、ユーザがclass.classLoader...パラメータを送信すると、コンテナのclassLoader属性を操作することが可能です。そのため、ユーザがclass.classLoader...パラメータを送信した場合、コンテナのclassLoader属性を操作することができます。
アパッチ関係者の責任
struts2の攻撃で過去2年間で、携帯電話、通信、ユニコム、主要なインターネット銀行、証券など、主要なポータルをカバーする攻撃面を頻繁に発生するため、struts2は非常に強力なj2eeフレームワーク、特に開発者の大半は、アプリケーションは非常に広いです。だから一度struts2 0dayは、インターネットの大規模な領域に侵入された結果、ライブラリ、情報漏洩やその他のイベントをドラッグされました。この問題については、専門家は、関連する技術スタッフは、struts2フレームワークのバージョンを更新する必要があることを示唆しています。あなたが能力を持っている場合は、独自のアプリケーションフレームワークを開発するのが最善ですが、オープンソースのフレームワークの使用を避けてください。
Struts2脆弱性インベントリ
より影響が大きく、広く悪用されているstruts2の脆弱性:
2010 S2-500
CVE-2010-1870 XWork ParameterInterceptors のバイパスにより OGNLstatement が実行可能
CVE-2012-0392 struts2 DevMod リモートコマンド実行の脆弱性
CVE-2011-3923 Struts<=2.3.1 パラメータインターセプタのコード実行
CVE-2013-1966 Struts2 <= 2.3.14 includeParams プロパティにリモートコマンド実行の脆弱性
CVE-2013-2251 Struts2 <= 2.3.15.1 action, redirect, redirectAction prefix にリモートコマンド実行の脆弱性
Struts2 <= 2.3.16 DoS攻撃とClassLoaderの操作
struts2のサイトで提供されている脆弱性の履歴を参照してください:
https://...////+ns





