ModSecurity DoS Flaw: PoC Available for Apache Vulnerability (No Workaround, Patch Pending)
2025/05/23 SecurityOnline — ModSecurity の Apache モジュールで発見された、新たな脆弱性 CVE-2025-47947 (CVSS:7.5) が特定の条件下で悪用されると、Web サーバに深刻なサービス拒否 (DoS) 攻撃が生じる可能性がある。この脆弱性は、Swiss Post の代理人である、Netnea の Simon Studer (@studersi) が報告したものだ。

この脆弱性は mod_security2 に存在し、WAF ルールが sanitiseMatchedBytes アクションを使用する際の、JSON ペイロードの処理方法に起因する。この状況下において、ModSecurity はサニタイズ対象の引数リストを過度に拡張し、サーバのメモリを消費してしまう。
アドバイザリには、「JSON ペイロードに 1,000個の項目がある場合、それらすべてをルールが評価し、サニタイズ対象に追加する。その繰り返しが 1,000回に達すると、サニタイズ対象の変数のサイズは 1,000,000個になる」と記されている。
この肥大化したリストは、メモリ内で動的に拡張される Apache の APR テーブルに保存される。そのため、細工されたリクエストを1回送信するだけで、過大なメモリ消費が発生し、システム・クラッシュの可能性が生じる。つまり、このリクエストを数回繰り返すだけで、サーバをダウンさせる可能性を、攻撃者は手にすることになる。
多数の要素を取り込んだ JSON 形式の HTTP POST リクエストを送信することで、この脆弱性を悪用する攻撃者は、sanitiseMatchedBytes を取り込むルールの有効化を確認する必要がある。ModSecurity エンジンは、一致した各変数のサニタイズを繰り返して試行する。
この PoC では、1,000 個の項目を取り込んだ JSON ペイロードを生成する。
python3 -c "print('[%s]' % ','.join(['1234567890123456'] * 1000))" > payload.json
続いて、以下のコマンドで、ペイロードを繰り返して送信する。
time curl --header "Content-Type: application/json" --data @payload.json http://localhost:80/post
アドバイザリには、「この大量のメモリ消費を、再現するために必要なリクエストは、1回のだけで十分である。数回のリクエストの後に、メモリ不足エラーが発生する」と記されている。
残念なことに、このサニタイズ・ルールを無効化または削除する以外に、脆弱性 CVE-2025-47947 に対する回避策は存在しない。
アドバイザリには、「このルールには sanitiseMatchedBytes アクションが取り込まれており、ペイロード・タイプが JSON である、演算子により変数が一致する場合に、この問題が発生する」と記されている。
もう一つの緩和策として、Audit エンジンの無効化という方法がある。それにより、偶発的な問題の発生を防ぐことが可能になるが、トラフィック監視における可視性が低下する可能性も生じる。
この脆弱性の報告者による、パッチが開発/試験されており、修正版が近日中にリリースされる予定とのことだ。
ModSecurity に DoS 脆弱性が発生しましたが、パッチが未適用で PoC が公開という、厳しい状況です。修正版が近日中にリリースされる予定とのことですが、ご利用のチームは、十分にご注意ください。よろしければ、ModSecurity で検索も、ご参照ください。
You must be logged in to post a comment.