投稿

AWS WAF の GenericLFI_BODY が PDF アップロードを誤検知してブロックする

AWS WAF の GenericLFI_BODY が PDF アップロードを誤検知してブロックする

現象

ユーザーが PDF ファイルをアップロードすると「問題が発生しました」エラーが表示される。別のファイルは正常にアップロードでき、時間をおいても解消しない。サポート担当が同じファイルをアップロードすると成功する場合もある。

調査

S3 に保存されている WAF ログを確認すると、該当リクエストが BLOCK されていた。

{
  "action": "BLOCK",
  "terminatingRuleId": "AWSManagedRulesCommonRuleSet",
  "ruleGroupList": [
    {
      "ruleGroupId": "AWS#AWSManagedRulesCommonRuleSet",
      "terminatingRule": {
        "ruleId": "GenericLFI_BODY",
        "action": "BLOCK"
      }
    }
  ],
  "labels": [
    { "name": "awswaf:managed:aws:core-rule-set:GenericLFI_Body" }
  ],
  "oversizeFields": ["REQUEST_BODY"],
  "requestBodySize": 111379,
  "requestBodySizeInspectedByWAF": 8192
}

原因

GenericLFI_BODY は リクエストボディ内の LFI(Local File Inclusion)パターン(../ 等のパストラバーサル)を検知するルール。PDF のバイナリデータにこのパターンと一致するバイト列が含まれており、誤検知が発生していた。

WAF はボディの先頭 8,192 bytes のみを検査する。multipart/form-data のバウンダリやフィールド順序はブラウザ・環境により異なるため、同じファイルでも環境によって検知されたりされなかったりする。

対処

AWSManagedRulesCommonRuleSet に scope-down statement を追加し、multipart/form-data リクエストを検査対象から除外する。

rule {
  name     = "AWSManagedRulesCommonRuleSet"
  priority = 0

  override_action { none {} }

  statement {
    managed_rule_group_statement {
      vendor_name = "AWS"
      name        = "AWSManagedRulesCommonRuleSet"

      # multipart/form-data(ファイルアップロード)を除外
      scope_down_statement {
        not_statement {
          statement {
            byte_match_statement {
              search_string         = "multipart/form-data"
              positional_constraint = "STARTS_WITH"
              field_to_match {
                single_header { name = "content-type" }
              }
              text_transformation {
                priority = 0
                type     = "NONE"
              }
            }
          }
        }
      }
    }
  }
}

同じ scope-down は AWSManagedRulesSQLiRuleSet でも運用実績がある。ファイルアップロードではボディにバイナリが含まれるのが正常であり、パターンマッチの誤検知が避けられないため、この除外は妥当。

トレンドのタグ