pcommentをネストした場合の脆弱性(多重書きこみ/無限ループ)†
- ページ: BugTrack
- 投稿者: sky
- 優先順位: 重要
- 状態: 着手
- カテゴリー: プラグイン
- 投稿日: 2004-01-13 (火) 20:50:47
- バージョン: 1.4.2
メッセージ†
プラグインpcommentのコメントページの内に#pcommentを記述してコメントすると
ループしてしまいます。
そのために元のページの表示に時間がかかるようになり、最悪ページが表示できなくなります。
これは元になるページとネストされたページの両方にコメントがある場合に起こるようです。
(PHPのバージョンは"4.1.2"です。)
- お知らせいただきありがとうございます。ご指摘の問題とは違うのかもしれませんが、 #pcomment によるコメントページの中に #pcomment を挿入した状態で、(ループはしないが)サーバーの負荷を増大させる恐れのある奇妙な書きこみ動作が起る事を確認しました。直せるかわかりませんが、調査を開始します。 -- henoheno
- 現状の回避策は、plugin/pcomment.inc.php を削除することです。また、cmd=editで該当のページを開くことで、問題の部分を直すことは可能です。 -- henoheno
表示の際の無限ループ†
- この問題はPHPに依存しない、PukiWiki自身の問題の様です。 #pcomment が convert_html() に渡すデータの中に #pcomment が含まれていることをきっかけとして、 pcommentプラグインの初期化と呼び出しを再帰的にコールすることになり、これが最終的にメモリを食いつぶす様です。 -- henoheno
- pcommentとconvert_htmlのどちらを直すべきなのか、まだつかめていません。convet_htmlやmake_linkの修正は私には大仕事です XD -- henoheno
- (リリース担当の立場からのコメント) 現状のまま進展がない場合、デフォルトで危険であるとみなし、正式リリースの配布物からはpcommentプラグインを除外します。 -- henoheno
- (開発担当としてのコメント) うーん困りましたね・・・ XD -- henoheno
- 単純にpcommentプラグインを修正(get_sourceの中から #pcommentをフィルタアウトする)ではいけないですか? -- みこ
function pcmt_get_comments($page, $count, $dir, $reply)
{
global $_msg_pcomment_restrict;
if (!check_readable($page, false, false))
return array(str_replace('$1', $page, $_msg_pcomment_restrict));
- $data = get_source($page);
+ $data = convert_filter(get_source($page));
<?php
// インクルードフィルタ(いずれrules.ini.phpにもっていきたい)
$filter_rules = (
"^///(.*?)$" => "",
"^#skin\((.*?)\)" => "",
"^#tboff\((.*?)\)" => "",
"^#pcomment\((.*?)\)" => "",
);
// インクルードで余計なものはソースから削除する(func.phpにもっていきたい)
function convert_filter($str)
{
global $filter_rules;
static $patternf,$replacef;
if (!isset($patternf))
{
$patternf = array_map(create_function('$a','return "/$a/";'),array_keys($filter_rules));
$replacef = array_values($filter_rules);
unset($filter_rules);
}
return preg_replace($patternf,$replacef,$str);
}
?>
- かなり手前味噌な関数ですみません(^^;; 実は本題ページ以外のインクルードするページを何らかの形でフィルタするのは、要望としてBugTrackに提出しようと機会をうかがっていたんですけど・・・(^^; -- みこ
- コメントありがとうございます。データの中に #pcomment がある(からループする)のは認識していたのですが、直しどころをちょっと考えあぐねていたのですよね XD -- henoheno
- 汎用的な道具をもって問題を根絶する、というのは私も大好きです :) もう少し意図をお教え下さい。pcomment以外にこのconvert_filter()を使いたい場面はどんな時でしょうか?それは単純に他のページをインクルードしたい時とは少しニーズが異なる気がするのですが、そこが良くわかりません。 -- henoheno
- まずは上記を参考に、データ内部の #pcomment を強制的に抜いてしまう、という対応を取る様にしますね。 -- henoheno
- ひとつは、この問題はPukiWikiプラグインの仕様的な問題(#pcommentのほかに#calendar_viewerも同じ問題を抱えている可能性が高い)と認識しているのと、もうひとつは #calendar_viewer などでインクルードするページ(例:hogehoge内のhogehoge/YYYY-MM-DD) から呼ばれたくないけど、
単独で本体から読み出すとき(hogehoge/YYYY-MM-DD)は呼ばれたいプラグインがいくつか(とくにわたしの自作プラグイン群)存在します。 -- みこ
- たとえば、PukiWiki-officialで掲載されているところでいえば、 #tboff プラグインとか #include2 プラグインとかですね・・・ -- みこ
- ただ、現行のconvert_filterは「とりあえず」なので、各プラグイン毎に挙動を変える作りにはなっていません(^^; うーん。どうなんでしょ?本来はプラグインから呼ばれる get_source なのか本体から呼ばれる get_source なのかを区別するのが根本的な解決なのかな? -- みこ
- うーむ、確認したわけではありませんが、現状、convert_html がある意味 「再入可能」でない のが原因ではないか、と思っております。複数回呼ばれる事も(同関数は)考慮しておらず、それに関する問題も出ている様ですしね。 -- henoheno
- うーん、それでも 他のページを読むようなプラグインはやはりプラグイン自身で再入を止めるのが筋がいいとおもいますが・・・(#includeプラグイン自身はそれをおこなっていますよね?) -- みこ
- そういったのが絡み合う(例: pcomment -> calendar_viewer -> pcomment などの複数プラグインのように)といくらなんでも convert_html におこなわせるには荷が重くありませんか?(それがある意味なんでしょうけど・・・) -- みこ
- (開発日記/2004-08-09から続く)結局、get_sourceを使用して(例:↑)のようになる限りはこの問題は解決しないので、とりあえず自分と同じプラグイン(calendar_viewerプラグインなら#calendar_viewer)はフィルタするほうがのぞましくありませんか? -- みこ
- 放置して申し訳ありません。pukiwiki1.4.4ではこの現象が起こらない事を確認しました。ありがとうございました。 -- sky
- ところで投稿の時に思いました。このように運営に支障が出る問題では具体例をあげると悪用される可能性があると思うのですが、そのような場合専用の投稿場所のような物は無いのでしょうか。 -- sky
- こんにちは。わざわざありがとうございます。そのような時は、例えばsourceforgeのpukiwikiプロジェクトに登録されているメンバー全員に同報メールをしていただくと助かります。 -- henoheno
- 状態は、まだクイックハックの域を出ていませんので 完了 => 着手に戻させていただきます。 -- henoheno
- 2件とも了解致しました。(BugTrackに危険なバグの連絡方法を追記した方が良いのでしょうか) -- sky
- 前向きな提案をありがとうございます。良い機会ですので、早速その様にさせていただきます。 -- henoheno
多重書き込み†