-
-
Notifications
You must be signed in to change notification settings - Fork 4
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Path traversal problem with two dynamic values #11
Comments
ありがとうございます。 自分の知っている限りでは現状のURL系のウェブの仕様に Honoであったパストラバーサルの修正では GitHubのリポジトリ名は Aug-21-2023.23-07-36_optimized.mp4
|
GitHubのcompareなんかは また、 url-from の場合、例外とすることも検討しましたが、それはそれで開発者の望まない想定外の自体が起きるのでwarnを発生させつつ半角スペースに置換する方法を取りました。 開発者がURL生成機構を利用する際、一定のセキュリティ知識を持っている人でないと URL生成処理のために都度都度 try catch を書けば回避できますが、あまりに使用感が悪くなりますし、単純な埋め込みの際に このように、弾き方によってもある意味攻撃のようなことが起きてしまうので、例外を投げるという選択肢も罠になると考えています。 url-from で採用したwarn & 半角スペース置換の方法は、ひとまずリスクが最も低いであろう半角スペースへの置換によって無害化しつつ、開発者に 例外とするか、何かに置換するか、エラー処理を書くか、入力段階でバリデーションを書くか、そのシステムにとってベストな対処法はライブラリ側では決められないため、開発者が気付くまで安全につなぐ方法が安全と使用感を両立させる選択肢になるかなと。 このあたりすごく色々考えたのですが、どうするか決めるのが非常に難しかったです。
ただ、開発者がなぜこの関数が このあたり、人がどのように行動するかまで考えて設計する必要があるのが
まさにそこを意図した実装に見えますね。
|
azuさん、ご無沙汰しております。
misuken です。以前は大変お世話になりました。
早速ですが本題です。
url-cheatsheetの内容も参考にしながら、パス部分が自動エンコードされるタイプのURL生成ライブラリ url-from を作成していた際に気付いたのですが、パストラバーサル問題に関しては
encodeURIComponent()
を使っても開発者が想定していないパスになる場合があるのと、その対処法についてです。レアパターンとは思いますが以下のように複数の動的値を持つパターンです。
1つのときも1階層上のindexへのアクセスにはなっていたわけですが、複数になるとより自由度が生まれてきます。
name
とtag
の値がそれぞれ..
とadmin
だった場合、生成されるURLはhttps://example.com/user/../admin
となりhttps://example.com/admin
に誘導されます。admin
の後に何かパスやクエリを追加できるわけではないので害が出ることはないと思いますが、2つ以上の動的値が存在すると、開発者の意図しない階層のパスに誘導される可能性が出てきます。.
はencodeURIComponent()
ではエンコードされませんし、もし自力で%2E
に変換したとしても、ブラウザでは正規化されて.
と解釈されるようです。url-fromではいくつかの理由によって安全性を評価し、開発者の意図しない階層のパスにアクセスされるよりは、当該条件の場合は半角スペースに置換する方法を取ることにしました。
https://github.com/misuken-now/url-from#path-traversal-protection
.
や..
が入力された場合の適切な対処法はどのようなものになるのでしょうかね?以下は余談です。
wikipediaのURLを動的に生成する場合。
ブラウザで https://en.wikipedia.org/wiki/... というURLにアクセスすると、 https://en.wikipedia.org/wiki/Ellipsis にリダイレクトされますが、 https://en.wikipedia.org/wiki/.. にアクセスすると https://en.wikipedia.org/wiki でアクセスしたときと同様の https://en.wikipedia.org/wiki/Main_Page にリダイレクトされます。
curlで叩く場合は
.
と%2E
で結果が違うので、ブラウザのアドレスバーからの入力は正規化されてしまっていると解釈していますが、少なくとも.
と..
はブラウザからはアクセスできないURLになっていそうです。つまり、パス部分でタグ名を取扱う場合、
.
や..
というタグ名を扱う方法が無いということでもありそうです。The text was updated successfully, but these errors were encountered: