サブディレクトリの.htaccess によるアクセス拒否が機能しなくなった(4.0.6以降)
概要(Overview)
サブディレクトリに以下のような.htaccessを配置しても、アクセス拒否が行われない。
order allow,deny
deny from all
4.0.6対応の中で行われた以下の.htaccessのFileMatchブロックの記述による許可設定が優先されているため?
該当のFileMatch記述を削除すると、再度サブディレクトリの.htaccessによるアクセス拒否が機能するようになります
<FilesMatch "(?<!\.gif|\.png|\.jpg|\.jpeg|\.css|\.ico|\.js|\.svg|\.map)$">
SetEnvIf Request_URI "/vendor/" deny_dir
Order allow,deny
Deny from env=deny_dir
Allow from all
</FilesMatch>
https://github.com/EC-CUBE/ec-cube/pull/5073/commits/e689164e09ed43deab0b139c86416cd515ceb70c#diff-270939b4fba4be968ab78e23dc0207eb893744491980a25c99a27c809a82ddabR13
本体開発のみでは問題とならない理由
本体の現状としては、サブディレクトリの.htaccessが機能しなくなっても RewriteRule "^vendor/" - [F] 等の記述で二重に守られているため、支障がない状況と思います。
ただ、カスタマイズで独自にフォルダを作成する場合等の落とし穴になりやすいと感じるため、回避できた方がうれしい (もちろん独自にそのようなカスタマイズする場合はサブディレクトリの.htaccessのみに頼らず、vendor等と同様RewriteRule等で多重に対策すべきとは思いますが)
期待する内容(Expect) or 要望 (Requirement)
サブディレクトリに以下を記述した.htaccessを配置すると、該当ディレクトリへのアクセスが拒否されること
order allow,deny
deny from all
再現手順(Procedure)
- testdir 等のカスタムディレクトリを作成
- testdir/.htaccess を配置(deny from all)
- testdir/test.csv, testdir/test.txt, testdir/test.png 等を配置
以下のようなURLでアクセスすると、アクセス出来てしまう。
- http://example.com/testdir/test.txt
- http://example.com/testdir/test.csv
- http://example.com/testdir/test.png
該当のFileMatch記述をコメントアウトすると、403エラーになるようになる
環境 (environment)
- EC-CUBE: 4.0.6-p1
- Apache: 2.4.53(IUS)
- PHP: 7.4.29
関連情報 (Ref)
備考
本件、事前にEC-CUBEサポートへ連絡し、本体の脆弱性としては扱わない旨確認済
私もApache, .htaccessの挙動(許可設定の適用優先度など)にあまり明るくないため、誤解があればご指摘いただきたいところもあります
Apacheドキュメント セクションのマージ方法 https://httpd.apache.org/docs/2.4/sections.html#mergin
マージの順番は以下のようになっています:
- Directory (正規表現無し) と .htaccess を同時に (.htaccess が許可されていれば、それが Directoryを上書きします)
- DirectoryMatch と Directory ~
- Files と FilesMatch を同時に
- Location と LocationMatch を同時に
上記によると、.htaccessはDirectory相当として扱われ、かつFiles/FilesMatchの方が後に評価されるとのこと。
よってサブディレクトリの.htaccessにdeny from all を書いても、FilesMatchのAllow from all の方が優先される…と解釈しています。
セキュリティチェックプラグインやセキュリティチェックシート等で var, vendor 等の露出対策として.htaccessの配置が紹介されていますが、この対策が意味をなさないことになるのではないかと思います