Struts 2再曝S 2-021パッチ高危険脆弱性s 2-022を修復し、遮断できない安全脆弱性


セキュリティ研究者はこのほど、Apache Struts 2が脆弱性公告S 2-020で、CVE-2014-0094の修復を処理する脆弱性補修案に脆弱性があり、パッチが完全に迂回されたと指摘した.現在、政府はGitHubでこの問題を修正した.この問題が明らかになった後、多くのサイトが被害を受ける見通しだ.
コード修正の詳細:
https://github.com/apache/struts/commit/aaf5a3010e3c11ae14e3d3c966a53ebab67146be#diff-710b29900cea21e85893cae43dd08c92
-  ^class\..*,^dojo\..*,^struts\..*,^session\..*,^request\..*,^application\..*,^servlet(Request|Response)\..*,^parameters\..*,^action:.*,^method:.*
+  (.*\.|^)class\..*,^dojo\..*,^struts\..*,^session\..*,^request\..*,^application\..*,^servlet(Request|Response)\..*,^parameters\..*,^action:.*,^method:.*

github上のコード修正履歴によると、この問題は2014.4.3.31日に修復されたはずで、2014.04.06がコードの主分岐に統合され、Struts 2.3.17バージョンが提供されているが、なぜ公式に更新を通知していないのか分からないし、このコード修正にタイムリーに注目する人もいない.
2014.05.03更新:
http://struts.apache.org/release/2.3.x/docs/s2-022.html
http://struts.apache.org/announce.html#a20140503
推奨2.3.16.3へのアップグレード
2014.04.29更新:
公式修復案:http://struts.apache.org/release/2.3.x/docs/s2-021.html
関連公式声明:http://struts.apache.org/announce.html#a20140424
推奨2.3.16.2へのアップグレード
現在の公式サイト(http://struts.apache.org/release/2.3.x/)ダウンロード可能なstruts 2-coreファイルか、脆弱性のあるファイルか:
struts2-core-2.3.16.1.jar
jarコマンドで解凍するか、Windowsパソコンにダウンロードしてwinrar解凍を使用してstruts-default.xmlファイルを見つけてexcludeParamsを検索し、
一致する結果は複数あります.
    ^class\..*,^dojo\..*,^struts\..*,^session\..*,^request\..*,^application\..*,^servlet(Request|Response)\..*,^parameters\..*,^action:.*,^method:.*

githubでの変更レコードによると、^classは(.*.|^)classに変更する必要があり、明らかに(.*.)classは無視されている.
2014.04.29更新:
公式修復案:http://struts.apache.org/release/2.3.x/docs/s2-021.html
推奨2.3.16.2へのアップグレード
緊急修復方法:
1.コード修正:
struts 2-core-2.3.1.1.jarファイルを解凍し、struts-default.xmlファイルを見つけます.
struts-default.xmlファイルで、
^class\..*,^dojo\..*,^struts\..*,^session\..*,^request\..*,^application\..*,^servlet(Request|Response)\..*,^parameters\..*,^action:.*,^method:.*
置換
(.*\.|^)class\..*,^dojo\..*,^struts\..*,^session\..*,^request\..*,^application\..*,^servlet(Request|Response)\..*,^parameters\..*,^action:.*,^method:.*.
変更したstruts-default.xmlを元のstruts-default.xmlファイルに上書きし、再パッケージしてオンラインにします.
2.境界デバイスにブロッキング規則を追加するには:
class...*,^dojo..*,^struts...*,^session...*,^request...*,^application...*,^servlet(Request|Response)...*,^parameters..*,^action:.*,^method:などのキーワードをフィルタリングしますが、誤傷状況に注意する必要があります.また、このスキームは符号化後の***ケースをブロックできません.
根本的な解決方法:
常に公式修復案に注目すべきはStruts 2.3.18(2014.04.4.23現在、githubで提供されている最新releaseバージョンは2.3.17で、snapshotの最新は2.3.18で、http://markmail.org/message/6wmiu7cphcn2jfav メールの内容は、GAバージョンは現在もリリースを延期しているはずです)とともに、公式修復内容を審査します.
フレームワークを変えると、コストが少し高くなります.
個人的な考え方:
現在、このようなブロック文字を追加する方法では、この脆弱性の問題を完全に解決することはできません.ネット上で、この脆弱性の修復に関する外国語を見ました.
(.*.|^)classを.*class Loader.*で置き換えることをお勧めします.
しかし、個人的には、今回の修復後に穴が開くか、今回の修復自体が無効で利用できると感じています.
【Struts 2 S 2-020脆弱性回避ソリューション】今日警報された「Struts 2 S 2-020脆弱性回避」について、創宇研究者は阿里雲安全の有名な安全専門家「空虚な浪子心」と協力して解決策を発表した.
strutsソースのstruts-default.xmlを変更
すべてを置換^dojo..*
(.*.|^)class...*,.*'class'.*,(.*.|^)class[.*,^dojo...*に変更
このファイルを変更する場所はいくつかあります.
〔究極の解決策2014.04.24 14:00〕
【2014.04.24】Struts 2 S 2-020脆弱性および最新ソリューションを回避[更新]
http://bbs.anquan.org/forum.php?mod=viewthread&tid=40548
以前に公表されたすべてのソリューション(他の会社や組織が公表したものを含む)が再び非情なbypassになったことが証明され、私たちは最終的に下位コードを修正して防御を実現することを選んだ.アリクラウドセキュリティのセキュリティ専門家「空虚な浪子心」は再び彼の方法を共有した:strutsソースコードcom.opensymphony.xwork 2.interceptor.ParametersInterceptorを修正して次の方法を検索した.:
  •    public void setExcludeParams(String commaDelim) {
  •        Collection excludePatterns = ArrayUtils.asCollection(commaDelim);
  •        if (excludePatterns != null) {
  •            excludeParams = new HashSet();
  •            for (String pattern : excludePatterns) {
  •                excludeParams.add(Pattern.compile(pattern));
  •            }
  •        }
  •    }

  • 次のように変更します.
  •    public void setExcludeParams(String commaDelim) {
  •        Collection excludePatterns = ArrayUtils.asCollection(commaDelim);
  •        if (excludePatterns != null) {
  •            excludeParams = new HashSet();
  •            for (String pattern : excludePatterns) {
  •                excludeParams.add(Pattern.compile(pattern));
  •            }
  •        }
  •        //s021 zhenzheteng
  •        Pattern s021_1 = Pattern.compile("(.*\\.|^)class\\..*",Pattern.CASE_INSENSITIVE);
  •        Pattern s021_2 = Pattern.compile(".*'class'.*",Pattern.CASE_INSENSITIVE);
  •        Pattern s021_3 = Pattern.compile("(.*\\.|^)class\\[.*",Pattern.CASE_INSENSITIVE);
  •        excludeParams.add(s021_1);
  •        excludeParams.add(s021_2);
  •        excludeParams.add(s021_3);
  •    }