概要
先日の記事でgitを用いたmod-securrity core rule setのアップデートを行いました。
このアップデートにより新たに検知されたルールの対処を行います。
環境
- Ubuntu 24.04
- Apache 2.4
- Mod_Security 2系
- OWASP Core Rule Set v4.1.5
- ApacheのバーチャルファイルごとにModSecurityを制御
事象
OWASP Core Rule Set (CRS) を導入したModSecurityをブロックモード(SecRuleEngine On
)に切り替え後、
Apacheのエラーログに、これまで見られなかった Execution error - PCRE limits exceeded (-47)
というエラーが大量に記録されていることを発見しました。
- エラー例(IPアドレスやホスト名は改変済み)
[Sat Jun 14 11:09:05.195039 2025] [security2:error] [pid 28306:tid 28306] [client AAA.BBB.CCC.DDD:59314] [client AAA.BBB.CCC.DDD] ModSecurity: Rule 73f4b9603e90 [id "951190"][file "/usr/share/modsecurity-crs/coreruleset/rules/RESPONSE-951-DATA-LEAKAGES-SQL.conf"][line "246"] - Execution error - PCRE limits exceeded (-47): (null). [hostname "hoge.example.com"] [uri "/path/to/page.html"] [unique_id "aE_NnHj4jZdbb2PH1-4O0QAAABc"]
[Sat Jun 14 11:09:05.195564 2025] [security2:error] [pid 28306:tid 28306] [client AAA.BBB.CCC.DDD:59314] [client AAA.BBB.CCC.DDD] ModSecurity: Rule 73f4b95f9e98 [id "951210"][file "/usr/share/modsecurity-crs/coreruleset/rules/RESPONSE-951-DATA-LEAKAGES-SQL.conf"][line "288"] - Execution error - PCRE limits exceeded (-47): (null). [hostname "hoge.example.com"] [uri "/path/to/page.html"] [unique_id "aE_NnHj4jZdbb2PH1-4O0QAAABc"]
このログから、SQLインジェクション系の情報漏洩を検知するRESPONSE-951-DATA-LEAKAGES-SQL.conf
の内容に沿ったものと特定。
cat /var/log/apache2/hoge/error.log |grep 951190 |wc -l
としたところ、数時間で2万件近いログを検知。
PCEリミットとは?
複雑な正規表現を、非常に大きなデータ(Webページなど)に対して実行すると、サーバーのCPUやメモリを大量に消費し、サービス拒否(DoS)攻撃に繋がる危険性があります。これを防ぐため、ModSecurityには処理の複雑さや再帰の深さに上限(リミット)が設けられています。
エラーの原因
今回のエラーは、サーバーが返信するHTMLページ(レスポンスボディ)の内容を、情報漏洩がないか確認するルールがスキャンしようとした際に、そのWebページの内容が非常に大きい、または複雑であったため、PCREの処理上限値を超えてしまったことが原因です。(筆者のサイトの長文が災いしています)
対処内容
この、処理上限値を超えてしまったことでエラーが発生したのですからmodsecurity.conf
でSecPcreMatchLimit
の値を大きくすると言うのが考えられる対処ではありますが、
運用しているサイトのvpsのリソースを鑑みて、より簡便な「原因となっている特定のルールのみの無効化」を行いました。
さっくりとした手順
- Apacheのバーチャルサイト設定(.confファイル)のバックアップを取ります。
- .confファイルの修正を行います。
- Apache再起動で修正を反映させます。
- ログを確認し、設定反映を確認します。
設定ファイルの修正
- ファイルのバックアップ
sudo cp -ci /etc/apache2/sites-available/hoge.conf /path/to/backup/directory/hoge.conf.$(date +%Y%m%d)
設定ファイルやバックアップディレクトリは自分の環境に合わせます。
- バックアップ確認
diff -u /path/to/backup/directory/hoge.conf.$(date +%Y%m%d) /etc/apache2/sites-available/hoge.conf
エラー無く、差分も表示されていなければバックアップは成功です。
- ファイル修正
/etc/apache2/sites-available/hoge.conf
を以下のように修正していきます。(要root権限)
# PCREリミット超過エラーを起こす、レスポンスボディスキャン系のルール群を無効化
SecRuleRemoveById 951190
SecRuleRemoveById 951210
SecRuleRemoveById 951220
SecRuleRemoveById 951250
- ファイル修正確認
diff -u /path/to/backup/directory/hoge.conf.$(date +%Y%m%d) /etc/apache2/sites-available/hoge.conf
- 差分例
+ # PCREリミット超過エラーを起こす、レスポンスボディスキャン系のルール群を無効化
+ SecRuleRemoveById 951190
+ SecRuleRemoveById 951210
+ SecRuleRemoveById 951220
+ SecRuleRemoveById 951250
設定ファイルの設定反映
- 構文確認
sudo apache2ctl configtest
Syntax OK
を確認します。
- 設定反映
sudo systemctl restart apache2.service
- Apache稼働確認
systemctl status apache2.service
active(running)
を確認します。
動作確認
対処後、ターミナルで
tail -f /var/log/apache2/hoge/error.log |grep "PCRE limits"
を実行し、しばらく観察します。
このエラーが表示されないことを確認し、処置が完了です。
コメントを残す