[Codeigniter-users] 【注意喚起】CodeIgniter 1.7.2 Formヘルパーの脆弱性

Back to archive index

溝口 令雄 mizog****@gmail*****
2010年 4月 7日 (水) 12:28:06 JST


お世話になっております。溝口です。

Kenji Suzuki <kenji****@gmail*****> さんwrote:

> バグっているので、CodeIgniter的に正しいもなにもないと思います。
> こういうコーディングルールは単なるバグの回避策ですね。

なるほど、そうですよね。

ではとりあえず将来的にバグが修正される事を期待しつつ、
現段階では、form_prep()関数を下記のように書き換えて
使用を続けてみたいと思います。テスト不十分ですが…

----------
function form_prep($str = '', $field_name = '')
{
    // if the field name is an array we do this recursively
    if (is_array($str))
    {
        foreach ($str as $key => $val)
        {
            $str[$key] = form_prep($val);
        }

        return $str;
    }

    if ($str === '')
    {
        return '';
    }

    $pairs = array_merge(
        array_flip(get_html_translation_table(HTML_SPECIALCHARS)),
        array("&#39;" => "'", "&quot;" => '"')
    );
    $str = strtr($str, $pairs);

    $str = htmlspecialchars($str);

    // In case htmlspecialchars misses these.
    $str = str_replace(array("'", '"'), array("&#39;", "&quot;"), $str)
    ;

    return $str;
}
----------

よろしくお願いいたします。


                                          __________________________
_________________________________________/   Original Message
Subj: Re: [Codeigniter-users] 【注意喚起】CodeIgniter 1.7.2 Formヘルパー
の脆弱性
From: Kenji Suzuki <kenji****@gmail*****>
To  : codei****@lists*****
Cc  : --
Date: 2010/04/06 22:56:36

> Kenji です。
> 
> 
> On Tue, 06 Apr 2010 21:41:22 +0900
> 溝口 令雄 <mizog****@gmail*****> wrote:
> 
> > お世話になっております。溝口です。
> > 
> > kunitsuji <tsuji****@m-s*****> さんwrote:
> > 
> > > これって、FORMで配列で値を受け取った時、ということですか。
> > 
> > いえ、set_value() を複数回呼んでいるのは、配列を受け取っている画面
> > では
> > ありません。別の機能です。
> > 
> > このスレッドの最初に、
> > 
> > Kenji Suzuki <kenji****@gmail*****> さんwrote:
> > 
> > > このバグに当たるような実装をすることは少ないと思いますが、
> > 
> > とKenji様がおっしゃっているとおり、同じフィールドに対して set_
> > value() 
> > を複数回呼ぶという実装がまずいのかもしれません。
> > 
> > ・同一フィールド(パラメータ)に対するset_value()の呼び出しは1回の
> > み
> > 
> > とルールを決め、パッチは適用せずに元のまま使い、必要であれば、
> > 
> > ----------
> > $value = set_value('field_name', $default_value);
> > ----------
> > 
> > と一旦変数に入れて、それを複数回出力するようにした方が安全なのかも
> > しれ
> > ないです。
> > ほぼ初めてCodeIgniterを使用しているので、これがCodeIgniter的に正し
> > い作
> > 法なのかどうなのかいまいちよく分からないのですが…
> 
> バグっているので、CodeIgniter的に正しいもなにもないと思います。
> こういうコーディングルールは単なるバグの回避策ですね。
> 
> バグが深いみたいですので、修正するには、バグを再現できるサンプルと、
> きちんとしたデバッグ作業が必要ですね。
> 
> 
> // Kenji
> 
>  
> > よろしくお願いいたします。
> > 
> >                                           ________________________
> >                                           __
> > _________________________________________/   Original Message
> > Subj: Re: [Codeigniter-users] 【注意喚起】CodeIgniter 1.7.2 Formヘ
> > ルパー
> > の脆弱性
> > From: kunitsuji <tsuji****@m-s*****>
> > To  : codei****@lists*****
> > Cc  : --
> > Date: 2010/04/06 18:49:52
> > 
> > >  kunitsujiです。
> > > 
> > > これって、FORMで配列で値を受け取った時、ということですか。
> > > 
> > > 
> > > >お世話になっております。溝口です。
> > > >
> > > >Kenji Suzuki <kenji****@gmail*****> さんwrote:
> > > >
> > > >> となると、この if文自体を削除した方がいいでしょうかね。
> > > >> 
> > > >>       if (isset($prepped_fields[$field_name]))
> > > >>       {
> > > >>           return $str;
> > > >>       }
> > > >
> > > >ここを削除すると確かに前の値は残らなくなりますが、
> > > >set_value() を2度呼び出した場合、& が
> > > >1度目では $amp;
> > > >2度目では &amp;amp;
> > > >と変換されるようになります(※)。
> > > >
> > > >パッチ適用時には、※の問題は起こりません。
> > > >
> > > >よろしくお願いいたします。
> > > >
> > > >
> > > >                                          _____________________
> > > >                                          ____
> > > >                                          _
> > > >_________________________________________/   Original Message
> > > >Subj: Re: [Codeigniter-users] 【注意喚起】CodeIgniter 1.7.2 
> > > >Formヘル
> > > >パー
> > > >の脆弱性
> > > >From: Kenji Suzuki <kenji****@gmail*****>
> > > >To  : codei****@lists*****
> > > >Cc  : --
> > > >Date: 2010/04/06 17:09:36
> > > >
> > > >> Kenji です。
> > > >> 
> > > >> 
> > > >> On Tue, 06 Apr 2010 15:12:43 +0900
> > > >> 溝口 令雄 <mizog****@gmail*****> wrote:
> > > >> 
> > > >> > Kenji 様
> > > >> > 
> > > >> > お世話になっております。溝口です。
> > > >> > 
> > > >> > Kenji Suzuki <kenji****@gmail*****> さんwrote:
> > > >> > 
> > > >> > > CodeIgniter 1.7.2 の Formヘルパー の set_value() で同じフ
> > > >> > > ィー
> > > >> > > ルド
> > > >> > > を 
> > > >> > > 2回目以上表示すると 2回目以降は文字参照に変換されず XSS脆
> > > >> > > 弱性
> > > >> > > にな
> > > >> > > る
> > > >> > > 可能性があります。
> > > >> > > 
> > > >> > > 詳細
> > > >> > > http://d.hatena.ne.jp/Kenji_s/20100316/1268701194
> > > >> > 
> > > >> > 上記ページに記載して頂いたパッチを当てたところ、たとえば
> > > >> > 
> > > >> > ----------
> > > >> > <?php foreach ($rows as $idx => $row): ?>
> > > >> > ...(中略)...
> > > >> > <?= form_input(array(
> > > >> >     'name' => F_SORT . '[]',
> > > >> >     'value' => $row[DBC_SORT], // (A)
> > > >> >     'size' => '2',
> > > >> >     'tabindex' => $idx + 1
> > > >> > )) . LF  ?>
> > > >> > ...(中略)...
> > > >> > <?php endforeach; ?>
> > > >> > ----------
> > > >> > 
> > > >> > のようにform_input()関数をループ中で繰り返し呼び出している箇
> > > >> > 所で、
> > > >> > value属性に指定している(A)の値($row[DBC_SORT]の値)が常に$
> > > >> > rowsの
> > > >> > 1番目の要素の値になってしまいました。
> > > >> > パッチを元に戻すとこの現象は起こりません。
> > > >> > 
> > > >> > これはどのように対処すべきでしょうか?
> > > >> 
> > > >> なるほど。そうですか。
> > > >> 
> > > >> となると、この if文自体を削除した方がいいでしょうかね。
> > > >> 
> > > >>       if (isset($prepped_fields[$field_name]))
> > > >>       {
> > > >>           return $str;
> > > >>       }
> > > >> 
> > > >> 
> > > >> // Kenji
> > > >> 
> > > >>  
> > > >> > よろしくお願いいたします。
> > > >> > 
> > > >> > 
> > > >> >                                           _________________
> > > >> >                                           ____
> > > >> >                                           ___
> > > >> >                                           __
> > > >> > _________________________________________/   Original 
> > > >> > Message
> > > >> > Subj: [Codeigniter-users] 【注意喚起】CodeIgniter 1.7.2 
> > > >> > Formヘル
> > > >> > パー
> > > >> > の
> > > >> > 脆弱性
> > > >> > From: Kenji Suzuki <kenji****@gmail*****>
> > > >> > To  : codei****@lists*****
> > > >> > Cc  : --
> > > >> > Date: 2010/03/16 10:07:28
> > > >> > 
> > > >> > > Kenji です。
> > > >> > > 
> > > >> > > 
> > > >> > > CodeIgniter 1.7.2 の Formヘルパー の set_value() で同じフ
> > > >> > > ィー
> > > >> > > ルド
> > > >> > > を 
> > > >> > > 2回目以上表示すると 2回目以降は文字参照に変換されず XSS脆
> > > >> > > 弱性
> > > >> > > にな
> > > >> > > る
> > > >> > > 可能性があります。
> > > >> > > 
> > > >> > > 詳細
> > > >> > > http://d.hatena.ne.jp/Kenji_s/20100316/1268701194
> > > >> > > 
> > > >> > > これ、なかなか修正されないのでバグでないのかも知れませんが。
> > > >> > > このバグに当たるような実装をすることは少ないと思いますが、
> > > >> > > 知ら
> > > >> > > ず
> > > >> > > に
> > > >> > > やってしまうと危険ですので、注意喚起しておきます。
> > > >> > > 
> > > >> > > 
> > > >> > > 本家では、以下に書き込みがあります。バグだと思われる方は、
> > > >> > > 「バ
> > > >> > > グ
> > > >> > > なの
> > > >> > > で
> > > >> > > 直してくれ」みたいなことを書き込んでもらえるといいかもしれ
> > > >> > > ませ
> > > >> > > ん。
> > > >> > > 
> > > >> > >     * http://codeigniter.com/bug_tracker/bug/11284/
> > > >> > >     * http://codeigniter.com/forums/viewthread/139112/
> > > >> > > 
> > > >> > > 
> > > >> > > // Kenji
> > > >> > > 
> > > >> > > _______________________________________________
> > > >> > > Codeigniter-users mailing list
> > > >> > > Codei****@lists*****
> > > >> > > http://lists.sourceforge.jp/mailman/listinfo/codeigniter-users
> > > >> > ___________________________________________________________
> > > >> > ____
> > > >> > ___
> > > >> > __
> > > >> > 
> > > >> > _______________________________________________
> > > >> > Codeigniter-users mailing list
> > > >> > Codei****@lists*****
> > > >> > http://lists.sourceforge.jp/mailman/listinfo/codeigniter-users
> > > >> 
> > > >> _______________________________________________
> > > >> Codeigniter-users mailing list
> > > >> Codei****@lists*****
> > > >> http://lists.sourceforge.jp/mailman/listinfo/codeigniter-users
> > > >_______________________________________________________________
> > > >____
> > > >_
> > > >
> > > >_______________________________________________
> > > >Codeigniter-users mailing list
> > > >Codei****@lists*****
> > > >http://lists.sourceforge.jp/mailman/listinfo/codeigniter-users
> > > 
> > > _______________________________________________
> > > Codeigniter-users mailing list
> > > Codei****@lists*****
> > > http://lists.sourceforge.jp/mailman/listinfo/codeigniter-users
> > __________________________________________________________________
> > __
> > 
> > _______________________________________________
> > Codeigniter-users mailing list
> > Codei****@lists*****
> > http://lists.sourceforge.jp/mailman/listinfo/codeigniter-users
> 
> _______________________________________________
> Codeigniter-users mailing list
> Codei****@lists*****
> http://lists.sourceforge.jp/mailman/listinfo/codeigniter-users
____________________________________________________________________




Codeigniter-users メーリングリストの案内
Back to archive index