とりあえず、以前の記事を紹介しておいたほうがいいかな。
長くなってしまったので、記事内の目次を入れておきます。
で、今回のテーマは主に以下の 2つ。
1. については、最初の記事で TB 飛ばした dankogai 氏の記事にそんなことが書いてあったから。
もちろんTaint Modeは銀の弾丸ではない。たとえばXSSなどに対しては効果は薄い。しかしそれを言えばuse strict;
も銀の弾丸ではないのだ。
この根拠は、恐らく print
や syswrite
の引数が汚染チェックの対象外だからなのだと思う。 perlsec (邦訳) にも書いてあるし。
system
あるいは exec
に対する引数リストの 要素として渡した場合には、その要素に対する汚染検査は 行われません。
print
と syswrite
の引数に対する汚染検査は 行われません。
2. については、2つ目の記事で TB 飛ばした かなだまさかつさんの記事 にて以下の記述があった (強調は T.MURACHI による) ほか、
なお、このtaintperlやPerlの-Tオプションを指定した場合、この手のブラックリスト方式のメタキャラクタ漏れによる脆弱性は発生しない(記号を削るという方式では汚染は除去されていないとみなされる)。
perlsec にも以下のような記述があります。
しかし、汚染の検査は面倒です。あなたのデータの汚染を取り除くだけと いうこともあるでしょう。汚染検査機構をバイパスするためのただ一つの方法は、 マッチした正規表現のサブパターンを参照することです。 Perl は、あなたが $1、$2 などを使って部分文字列を参照したときに、 あなたがパターンを記述したときに何を行うのかを知っていたと仮定します。 つまり、汚染されていないものを束縛しないか、機構全体を無効にするということです。 これは、変数がなんらかの悪いキャラクターを持っているかどうかを 検査するというのではなく、変数が良いキャラクターのみを持っていることの 検査には都合が良いです。 これは(あなたが考えもしないような)悪いキャラクタを見失うことがあまりにも 簡単であるからです。
なるほど確かにそう言われると、ホワイトリスト方式の検査法の方が安全であるかのように見えます。
そんなこんなで、とりあえず何かしらの簡単なプログラムを書いてみて、 汚染モードの有用性についてチェックしてみることにしてみました。 例えば、以下のようなプログラムについて考えてみることにします。
セコメントをする