ViewComponent 4.9.0 リリース:パストラバーサル脆弱性の修正
ViewComponent 4.9.0 がリリースされました。このリリースでは、システムテスト用コントローラーに存在したパストラバーサル脆弱性が修正されています。
背景
システムテスト機能を支える ViewComponentsSystemTestController に、ディレクトリのパス検証を回避できる脆弱性が存在していました。許可された一時ディレクトリと文字列プレフィックスを共有するだけで、兄弟ディレクトリへのアクセスが可能になるという問題です。たとえば、許可パスが /tmp/view_component の場合、/tmp/view_component_evil のような別ディレクトリも検証を通過してしまいます。
この問題は、パス包含チェックに Ruby の start_with? を使用していたことに起因します。start_with? は単純な文字列前方一致であるため、ディレクトリセパレータ(/)の有無を区別できず、意図しないパスを許可してしまいます。
技術的な変更
パス検証ロジックがセパレータを考慮した前方一致チェックに置き換えられました。変更内容は CHANGELOG に次のように記載されています:
start_with?チェックをセパレータを考慮したプレフィックスチェックに置き換え、不正なパスエラーは未処理の例外ではなく 404 を返すようになった。
修正後の動作には 2 つの側面があります。まず、パス検証がディレクトリ境界を正しく識別するようになり、許可された一時ディレクトリのプレフィックスを持つ兄弟ディレクトリへのアクセスを拒否します。また、不正なパスへのアクセス時には、未処理の例外ではなく 404 Not Found を返すように変更されました。
バージョン番号は lib/view_component/version.rb の MINOR 定数が 8 から 9 に更新され、全 gemfile.lock も 4.8.0 から 4.9.0 に更新されています。
まとめ
今回のリリースは、start_with? による文字列前方一致をディレクトリセパレータを考慮した正確なパス検証に置き換えることで、パストラバーサル脆弱性を修正したセキュリティリリースです。システムテスト環境を利用するプロジェクトは 4.9.0 への更新が推奨されます。