今日、C/C++のセキュアコーディングの話を聞いてきて
(今度、レポートします。その内容)
そこで、ファイルアクセスにおけるぜい弱性の話を聞いてきた。
つまり、ファイル名をユーザーにいれてもらうと、ふつうは
foo.xml
のように、素直に、ファイル名をいれると想定しちゃうけど、ここに
../../../../../etc/passwd
とかかいて、思いもよらないところにアクセスして、ファイルを書きだしてしまう
危険があるというはなし。
これを防ぐには、ファイルのパスを正規化(canonicalization)する、
具体的にはrealpath()をつかうそうな・・・
って、それ、CやC++ですよねえ・・・
JAVAは?File#getCanonicalPath()なのかしら??
うん、でも、ひょっとして、それって、WAFでやってくんない?
とおもったら、
第3回 WAFはどのように脆弱性を防御するのか
http://www.atmarkit.co.jp/fsecurity/rensai/waf03/waf03.html
に、そんなのありました(以下斜体は上記サイトより引用)
強制ブラウジングを防ぐためには、オブジェクトタイプのチェックによる意図しないファイルタイプへのアクセスからの防御と、正規表現を使用したネガティブセキュリティモデルによるディレクトリトラバーサルからの防御を行う。ディレクトリトラバーサルとは、パスをさかのぼることによって、本来、管理者がユーザーに見せるつもりのないファイルやディレクトリを閲覧したり実行したりする攻撃である。「../」という文字列などをリクエストパスの中に入れる手法がよく使われる。
おお、じゃあ、WAFにすれば、ばっちり・・・なの??
でも、ふとおもったんだけど、WAFって、リバースプロキシ*使うよねえ。。
(使わない方法もあるらしい)
じゃあ、このリバースプロキシが倒れたら、どーなるの??
そんなくだらないこと考えてないで、getCanonicalPath()使えって(^^;)
(まだ、こいつ使ったことない、今度試してみるね)
*リバースプロキシ:外から、中のあるサーバーに対する通信を行う際、かならず、このサーバーは通ってね!っていうプロキシ、ふつうのプロキシは、中の人→外に行く時に使うのに、こいつは、外→中にいくときにおもに活躍するので、ふつうの逆=リバース