ModSecurityに、深刻度「高」のパーサー差異の脆弱性が見つかりました。この脆弱性は「CVE-2026-104269」(GHSA-5pww-8rfg-9crf)として追跡されており、攻撃者は実行可能ファイルのアップロードを、OWASP Core Rule Set(CRS)のファイル名検査をすり抜けて送り込めます。
問題の原因は、ModSecurityのマルチパートパーサーがRFC 2231のパラメータ値拡張に対応していない点です。この拡張は、filename*=UTF-8''valueのような文字セットを指定するエンコード構文を定めています。
CVSS 3.1のスコアは8.6です。メンテナーのAirween氏が9月30日にセキュリティアドバイザリを公開しましたが、修正版はまだリリースされていません。
CRSのルール920120、922100、922110は、正規表現またはMULTIPART_FILENAME変数を使ってContent-Dispositionヘッダーからファイル名を取り出します。そのため、検査の対象は通常のfilename=パラメータだけです。影響を受けるのは、3.0.0以降のすべてのModSecurity 3.xビルドです。
一方、RFCに準拠したバックエンドは異なる動作をします。両方のパラメータが存在する場合、デコードしたfilename*の値を優先します。
Go言語のmime.ParseMediaType、Werkzeugのparse_options_header、Starletteのpython-multipart、Node.jsのbusboyと@fastify/multipart、SpringのContentDisposition.parse()は、いずれもこの動作をとります。
PHPのネイティブSAPIマルチパートハンドラーはfilename=しか読み込まないため、影響を受けません。このようなパーサーの不一致は、ファイアウォールとアプリケーションが同じリクエストを異なる形で解釈するという点で、以前のHTTPパラメータ汚染によるWAF回避の研究とよく似ています。
攻撃は、細工したリクエストを1回送るだけで成立します。攻撃者は、画像のコンテンツタイプと<?php system($_GET['c']); ?>のようなPHPペイロードを付け、filename="safe.jpg"; filename*=UTF-8''shell.phpを送信します。
ModSecurityはsafe.jpgを読み取り、ルール922110は拡張子.jpgを許可します。ところがバックエンドはshell.phpと解釈してディスクに書き込み、Webサーバーがそのファイルを実行できてしまいます。ファイルがWebからアクセス可能なディレクトリに置かれた場合は、リモートコード実行につながります。
CVSSベクターは「AV:N/AC:L/PR:N/UI:N/S:C/C:N/I:H/A:N」です。ネットワーク経由で攻撃でき、攻撃の複雑さが低く、認証もユーザー操作も不要で、スコープが変化し、完全性への影響が高いことを示しています。
アドバイザリでは、発見者として0xkalawy氏とZeyadZonkorany氏、調整役としてB0YK4氏の名前が挙げられています。この欠陥は、マルチパートを悪用した回避の脆弱性が続く流れに連なるものです。過去には、libmodsecurityのmultipart/form-dataパーサーにおけるCVE-2026-52747や、CRSルール922110の文字セット検証の回避がありました。
修正プログラムがない現状では、防御側はWAFが抽出したファイル名を信用しないようにすべきです。アプリケーション側では、クライアントが指定した名前を破棄し、サーバー側で識別子を生成するとともに、許可リスト方式の拡張子チェックとコンテンツシグネチャの検証を徹底してください。
あわせて、アップロードされたファイルはWebルートの外に保存し、アップロード用ディレクトリではスクリプトの実行を無効にしてください。filename*パラメータを含むマルチパートのパートをすべてブロックするカスタムルールの追加も有効です。アップロード先に.php、.jsp、.aspxのファイルが予期せず書き込まれていないか、監視することも欠かせません。
16,000以上のSOCチームがANY.RUNを活用し、脅威調査を効率化して手作業を減らしています。チームでの導入を検討する
翻訳元: https://cyberpress.org/critical-modsecurity-waf-flaw/