Node.js における http モジュールでの Unicode の扱いと SSRF について

ここで書く内容は blackhat USA 2017 で Orange Tsai 氏が発表した 「A New Era of SSRF - Exploiting URL Parser in Trending Programming Languages!」 で取り上げられていた内容を自分が改めて理解するために書き残したメモです。 概要 var base = "https://example.com/article/"; var path = req.query.path; if (path.indexOf("..") == -1) { http.get(base + path, callback); } 上記のようなコードのとき、 /?path=../passwd のようにアクセスして http.get() の処理に入り、 /article/../passwd を取得することはできるだろうか。 一見 if 文は false になるため不可能そうに見えるが、実は true になることがある。 true とするには /?path=ĮĮ/passwd というURIにアクセスすることで可能となる。 ここでは、なぜこれでバイパスできてしまうのか、ということを書いていく。 ちなみに今回検証で確認できたのは Node.js 4.9.1 Argon ( ubuntu 16.04 LTS で未だに入る ) 。