(インライン画像) URLの記述により、閲覧者に Web bug や外部のCGI等を呼び出させる事ができる†
- 元タイトル: refプラグインで外部cgi等を呼び出し可能
- ページ: BugTrack2
- 投稿者: にぶんのに
- 優先順位: 普通
- 状態: 完了
- カテゴリー: その他
- 投稿日: 2005-05-18 (水) 02:13:48
- バージョン: ALL
// PKWK_DISABLE_INLINE_IMAGE_FROM_URI - Disallow using inline-image-tag for URIs
// Inline-image-tag for URIs may allow leakage of Wiki readers' information
// (in short, 'Web bug') or external malicious CGI (looks like an image's URL)
// attack to Wiki readers, but easy way to show images.
if (! defined('PKWK_DISABLE_INLINE_IMAGE_FROM_URI'))
define('PKWK_DISABLE_INLINE_IMAGE_FROM_URI', 0);
定数 PKWK_DISABLE_INLINE_IMAGE_FROM_URI を追加しました。この値が1であるとき、「URIによって外部の画像をインライン表示させようとする行為」が無効化されます。
- 「画像へのURI(画像へのURLであるかのように見えるURI)」をページに書く事によって、それをインライン表示させようとする行為
- refプラグインに、上記「画像へのURL」を与える事によって、それをインライン表示させようとする行為
- imgプラグイン(インライン画像を出力するためのプラグイン)の使用
これによって「URIによって外部の画像をインライン表示させる事ができる」という利便性を失う代わりに、以下の利点を得ることができます。
- 第三者によって、外部のわいせつ画像などをインライン表示せしめられる行為の防止
- 第三者によって 'Web bug' を仕掛けられ、そのサイトへの閲覧者に関する統計情報を奪取される行為の防止
- 第三者によって悪意ある外部CGIへのURI(画像のURIであるかのように見えるもの)を仕掛けられ、閲覧者のブラウザ破壊などを試みる行為の防止
- 第三者によって閲覧者に、特定の外部リソースへのアクセスを行わせしめる行為 (外部サイトへのDoS等) の防止
メッセージ†
refプラグインではいたずら防止のため、画像以外は指定されたURIを呼び出さないよう、チェックが設けられています。
しかしこのチェックはURIの末尾のみで判定を行うため、不十分であると思われます。
具体的には hogehoge.cgi?param1=fuga¶m2=…&e=.png のようにダミーの条件を末尾に付け加える事でチェックはすり抜けてしまいます。
影響範囲はrefプラグインおよびmake_link.phpの2箇所。対処方法としては次のように ? を弾く方法が考えられるかと思います。
-define('PLUGIN_REF_IMAGE', '/\.(gif|png|jpe?g)$/i');
+define('PLUGIN_REF_IMAGE', '/^[^?]*\.(gif|png|jpe?g)$/i');
※この問題はofficial:欲しいプラグイン/51から発掘しました。
- そういうレベルで気にするのであれば、is_image の判定は、getimagesize で画像の種類を特定するようにした方が、良いと思いますけどね。*1 -- upk
- これを利用したトリッキーな運用も時々見かけますから一概に弾くのはあまり良くないかも知れません。upkさんの言われるようにきっちりした判定をするか、あるいはPKWK_SAFE_MODEあたりで制限を加えるか、あたりが妥当だと思います。 -- Ratbeta
- お疲れ様です。タイトル等を修正しました。 -- henoheno
- 元のタイトルで一瞬ドキっとしましたが、この件は「外部サイトに対するインライン画像を許可」する機能(利点)に対するトレードオフ(欠点)に関するものの様です。話題にするならば、該当の挙動を許可している全ての部分が対象となります。 -- henoheno
- (1) 「画像へのURL」を記述する事によって、「インライン画像」のためのHTMLを出力する機能 (PukiWiki本体)
- (2) 1と類似の機能を持つプラグイン(imgプラグイン、refプラグイン)
- これら全てに対して「外部サイトに対するインラインイメージを許可する」か「拒否する」選択肢を与え、まとめてそのポリシーを強制できるようにしなければ話は終わらないと思います。 -- henoheno
- 外部サイトの画像に対するインラインイメージを許可しているのであれば、どのようなWebシステムであっても Web bug *2 やcgi叩き*3は実現可能です。mod_rewriteなどでクエリ文字列(「?」)などを打ち消す事さえ可能ですから、URLに使う文字種だけのチェックでは攻撃を100%防ぐ事はできません。 -- henoheno
- ・・・ということで、ぜひ上記を改造してください (爆) この件は改良点として以前から認識しているのですが、本当に取り掛かると前作業の時点でrefプラグインを一から作り直しそうになる*4ので、私はなかなかエンジンをかけられません。 -- henoheno
- 関連? BugTrack/460 -- henoheno
- わたしなら、上記のレベルならば「"外部ドメイン(サイトではない)"もしくは"信頼しているサイト以外"なら画像を直接表示せず、添付ファイルリンクにする」とするとかかな・・・ (^^; *5 -- みこ
- でも、レンタルHPの方もいるから外部ドメインはちょっとだけ危険かな (^^; お手軽をのこしつつなら URL を引数に「信頼できるURL?」というヘルパ関数があればいいかな (^^; -- みこ
- 別件の検討をしていたところ、意外とスンナリ実装できそうでしたので対応しました。食わず嫌いはいけませんね -- henoheno
- どこかに全体の設定として「信頼するURI」を設定できるのであれば、それを参照させる手があると思います>URLのチェック -- henoheno
- img.inc.php(r1.14)の修正は、セキュア時に#img(,clear)の互換性は捨てるという解釈でいいですか?*6 -- みこ
- imgプラグインは全体が殺されますので、互換性という視点では imgプラグイン全てが互換性を失うことでしょう。imgプラグインによる画像呼び出しとセットで行われている img(,clear) はその点で問題ないとして、ここでみこさんの仰りたいのは、cssでclearを出力させたいがために、他のプラグインとセットで img(,clear) を使っている場所、ないしそのようなケースの事ですよね。しかしimg(,clear)だけを機能させた場合、今度は imgによる画像呼び出しとセットで利用している部分が影響を受けてしまいます(clearの効果だけが残ってしまうため)。ということで、どっちつかずとなると思います。 -- henoheno
- この機能に興味がある方であれば、 "#img" で既存のコンテンツを検索して、その全てをしかるべく修正した方が良いかと思います。 -- henoheno
- 整形ルールによる画像張り付けはmake_link.phpのclass Link内のfunction setParamで
if (is_url($alias) && preg_match('/\.(gif|png|jpe?g)$/i', $alias)) {
の先頭に設定のチェック追加で大丈夫でしょうか? --
- その通りです! まさにそのようなコードをコミット漏れしていました (^^; -- henoheno