On March 26, 2019 we launched new MODX Forums. Please join us at the new MODX Community Forums.
Subscribe: RSS
  • 公表された脆弱性うち、RFIの方が影響が大きいのでもう一つ公開されているXSSが霞んでしまっているのですが( :’()、XSSについても簡単に説明します。

    [MODx CMS <= 0.9.6.2 Multiple Remote Vulne ( RFI + XSS)]
    http://milw0rm.com/exploits/7204

    MODxに標準で搭載されているwebloginスニペットにXSS問題が発見されています。
    webloginを使っているすべてのサイトが影響を受けます。
    対象バージョンは0.9.6.2以下のバージョンで、まだ公式な修正は行われていません。

    一応以下のファイルの修正で回避できます。
    公式なパッチが出来るまでお急ぎの方はどうぞ。

    修正ファイル:/assets/snippets/weblogin/weblogin.inc.php
             $uid = isset($_POST['username'])? $modx->db->escape(strip_tags($_POST['username'])):'';
    

    ↓次のように変更
             $uid = isset($_POST['username'])? htmlspecialchars($modx->db->escape(strip_tags($_POST['username'])),ENT_QUOTES):'';
    

    • にっくです。tkfmさんとMadHydeさんのおっしゃるとおり、0.9.6.2以前でもありますね。失礼しました。

      ライアンの言によると、すでに配布パッケージからは除外したこと、現在、スニペットのダウンロードリポジトリにもReflectは存在しないため、一般のユーザーに対してはこういう告知のほうが良いかな?と思い記述しました。
      ご指摘いただいた点は、「対策をお願いいたします」に変更します。
      何かご指摘がございましたらまたよろしくお願いいたします。
      • Quote from: にっく at Nov 25, 2008, 08:38 PM

        ライアンの言によると、すでに配布パッケージからは除外したこと、現在、スニペットのダウンロードリポジトリにもReflectは存在しないため、一般のユーザーに対してはこういう告知のほうが良いかな?と思い記述しました。
        0.9.6.2のパッケージの中を見てみましたが、Reflectスニペットは残っていましたが、例のファイルは削除されていました。
        0.9.6.3-rc2の方はまだそうなっていないみたいですね~
        (プロキシサーバー経由でダウンロードしたので、キャッシュされているだけなのかも?)

        なお、ReflectスニペットはDittoに同梱されて配布されていますので、リポジトリに単独で掲載されたことは無かったのでは?
        ちなみに、Ditto2.1のパッケージ内部も、例のファイルは削除されていました。
        • 今回のReflectスニペットに関連するセキュリティホールについて、
          以下の理解で良いでしょうか?
          --------
          以下の2つの条件がそろった場合、セキュリティ上の問題がある。

          • register_globals(PHPの設定オプション)がOnに設定されている(*1)
          • http://********/assets/snippets/reflect/snippet.reflect.phpが存在する(*2)(*3)(*4)
          なお、Reflectスニペットを使用すること自体は問題ない。

          (*1)厳密に言うと、http://********/assets/snippets/reflect/snippet.reflect.phpが実行される際の環境での設定です。(*3)
          (*2)厳密に言うと、PHPとして外部から実行可能な状態になっている場合に限られますが、一般的にはこうなっているケースが多いと思われます。
          (*3)厳密に言うと、http:だけではなく、https:でも同じことです。
          (*4)現状では、MODx0.9.6.2以前、および、MODx0.9.6.3-rc2までのバージョンが該当
          --------

          MODxでスニペットが実行される際、スニペットに渡される変数(パラメータ)は、以下の3種類の値だけで、
          グローバル変数は、スニペットには渡らないですよね。

          • スニペット作成/編集画面で登録した既定のプロパティ
          • スニペット作成/編集画面で共有パラメータのインポート元として登録したモジュールの設定値
          • スニペットコール(タグ)で指定したパラメータ
          今回問題になっているのは、「$reflect_base」の値を外部から操作できた場合に問題があるので、
          スニペットとしてReflectが実行される場合は、この問題は無いと判断したのですが、どうでしょうか?

          問題の本質としては、以下の2点かと思います。

          • MODxの中から呼ばれるべきスニペットのソースファイルを、PHPとして単独で実行できる形で置いている。
          • パラメータをノーチェックで使っている。
            ★日本公式フォーラム2009年9月1日本格始動!★
            http://modxcms-jp.com/bb/

            ▼ウェブ屋のCMS→modxヒキダス流(備忘録)
            http://d.hatena.ne.jp/hikidas_ikeda/
            ▼制作済みHTMLページをmodxで更新するデモ
            http://www.hikidas.com/hikidas/modx_document/modx_demo_osc2009kansai.php
          • Quote from: kazuike at Nov 26, 2008, 05:51 AM

            問題の本質としては、以下の2点かと思います。

            • MODxの中から呼ばれるべきスニペットのソースファイルを、PHPとして単独で実行できる形で置いている。
            • パラメータをノーチェックで使っている。
            そうですね、そこが本質と言えると思います。
            プラグインやスニペットの配布形態について、ルール・ガイドラインなどを定めておくべきかと。

            決めごとをちゃんと作っておくと、その決めごとに沿ってプラグインやスニペットを自動的に検出し、
            インストールする仕組みを作ったりするのにも都合がよさそうな気がします。

            phpファイルが必要である場合でもclass化すると比較的安全であるように思いますが、どうでしょう?

            • phpファイルが必要である場合でもclass化すると比較的安全であるように思いますが、どうでしょう?
              そうですね、クラス宣言だけなら、問題ないような気がします。←頼りない tongue
              ただし、クラス宣言の外にincludeとか入れちゃったら、同じ危険性がありますね。
              #こう書きながら、自分がデバッグ中に弾みで入れて、そのまま忘れちゃうとかありそうで怖いです。 grin
                ★日本公式フォーラム2009年9月1日本格始動!★
                http://modxcms-jp.com/bb/

                ▼ウェブ屋のCMS→modxヒキダス流(備忘録)
                http://d.hatena.ne.jp/hikidas_ikeda/
                ▼制作済みHTMLページをmodxで更新するデモ
                http://www.hikidas.com/hikidas/modx_document/modx_demo_osc2009kansai.php
              • プラグインやスニペットの配布形態について、ルール・ガイドラインなどを定めておくべきかと。
                例えば、管理画面から呼ばれるPHPファイルは、定数「IN_MANAGER_MODE」で(たぶん)チェックしているし、
                公開されているページから呼ばれる「manager/includes/document.parser.class.inc.php」はクラス宣言だけなので良いかと思いますが、
                スニペットやプラグインは、公開されているページから呼ばれるのに、
                パラメータがグローバル変数的に渡されるので、なんかソースを見るたびにドキドキしてしまいます。 shocked

                スニペットやプラグインにも、「IN_MANAGER_MODE」のように、
                MODxから呼ばれていることを確認する手段があれば、それだけでも安心度が全然違うと思うのですが…

                ついでに言うと、スニペットやプラグインに渡すパラメータも、
                extract($params, EXTR_SKIP);

                なんてせずに、そのまま配列で渡してくれると、パラメータを使いまわせるのにと思ったりもします。
                実際、compact()で、パラメータをまとめたりすることがあるのですが、
                パラメータ名のリストが必要なので、私の場合、パラメータ管理用のクラスを作ったりしています。
                (それだけのためということはありませんが、最初につくろうと思ったきっかけはそうだったような…)

                追記)
                パラメータは「$modx->event->params」が使えそうですね。(爆)
                  ★日本公式フォーラム2009年9月1日本格始動!★
                  http://modxcms-jp.com/bb/

                  ▼ウェブ屋のCMS→modxヒキダス流(備忘録)
                  http://d.hatena.ne.jp/hikidas_ikeda/
                  ▼制作済みHTMLページをmodxで更新するデモ
                  http://www.hikidas.com/hikidas/modx_document/modx_demo_osc2009kansai.php
                • Quote from: kazuike at Nov 26, 2008, 05:51 AM

                  今回問題になっているのは、「$reflect_base」の値を外部から操作できた場合に問題があるので、
                  スニペットとしてReflectが実行される場合は、この問題は無いと判断したのですが、どうでしょうか?
                  あー、確かにそうですね。
                  つっこみありがとうございます smiley
                  先ほどいじれないことを実際に確認しました。
                  スニペットはeval()で実行されるのでregister_globalsで作られた変数がそのまま生きると思ったのですが、その前にスコープが外れているので大丈夫ですね。

                  あと、調査中にmodx内では./manager/includes/protect.inc.phpの処理でregister_globalsがonの時に作られた変数を全部消してる処理があることに気付きました。
                  色々考えて作ってるんですね(^^;

                  Quote from: kazuike at Nov 26, 2008, 06:35 AM

                  phpファイルが必要である場合でもclass化すると比較的安全であるように思いますが、どうでしょう?
                  そうですね、クラス宣言だけなら、問題ないような気がします。←頼りない tongue

                  僕もその方法はありかなと思ってます。
                  phpコードをファイルに落とすということはある程度大きなソースになりそうですし、クラス化したほうがいいですよね。
                  (昔、dittoか何かのクラスとクラス名がバッティングしましたが :’()

                  • modxプラグインのQM+(QuickManager) にXSS脆弱性が発見されました。QM+はmodx1.0.0から同梱されているプラグインであり、影響を受けるmodxは次のとおりです。


                    • modx 1.0.0J(日本語版)
                    • modx 1.0.0(本家リリース版)

                    ※1.0.0よりも以前のバージョンはQM+が同梱されていないため、この脆弱性の影響を受けません。

                    modx日本公式サイトでは脆弱性のアナウンスと同時に新しい日本語版modx1.0.0J-p1のリリース、modx1.0.0(本家版、日本語版)用のパッチをリリースしました。
                    詳しくは以下のmodx日本公式サイトのニュースをご覧ください。

                    QM+(QuickManager) にXSS脆弱性・対策パッチ配布
                    • WebChangePwdスニペット にSQLインジェクション脆弱性が発見されました。WebChangePwdスニペットはmodx0.9.xから同梱されているプラグインであり、影響を受けるmodxは次のとおりです。


                      • 本家版 : 1.0.1 / 1.0.0 / 0.9.x
                      • 日本版 : 1.0.1J / 1.0.0J-p1 / 1.0.0J

                      現時点での最新リリースである本家版1.0.2および日本版1.0.2Jはこの影響を受けません。

                      modx日本公式サイトでは脆弱性のアナウンスと同時にmodx1.0.1、1.0.0J-p1、1.0.0J用のパッチをリリースしました(本家版同バージョンにも利用可能です)。
                      詳しくは以下のmodx日本公式サイトのニュースをご覧ください。

                      WebChangePwdスニペット にSQLインジェクション脆弱性・対策パッチ配布